[原创]hdu 1717 && 计蒜课 52 【分数小数的互相转化】【数论?】
2016-06-07 10:37:00 Tabris_ 阅读数:477
博客爬取于2020-06-14 22:44:23
以下为正文
版权声明:本文为Tabris原创文章,未经博主允许不得私自转载。https://blog.csdn.net/qq_33184171/article/details/51596858
本帖研究的是小数化分数 与分数化小数
小数化分数 :http://acm.hdu.edu.cn/showproblem.php?pid=1717 分数化小数 : http://nanti.jisuanke.com/t/42
这里的小数包括循环小数 循环部分用"()" 括起来 For Example 1/3 = 0.(3) 。。。
小数化分数的性质如下 :
1、有限小数的话把小数点后面的数除以10(一位数).100(两位数).1000(三位数)等, 2、如果是无限循环小数那就把循环的数除以9、99、999(同上) 3、如果是混循环小数,循环数字为两位情况下不循环的数字一位则除以990,两位则9900,并加上不循环小数数值乘以990或者9900。 即:分子=不循环部分和循环部分连起来-不循环部分。分母=99…(循环位数)0…(不循环位数)
小数化分数 小数化分数就是 0.abcd(efghij)
(abcdefghij-abcd)/9999990000 (没有约分)
在代码处理中 应该用字符串输入 ; 还有即使pow函数要慎用。。。
附代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 # include <cstring> # include <cstdlib> # include <algorithm> # include <cstdio> # include <string> # include <iostream> # include <math.h> using namespace std; /* 分子=不循环部分和循环部分连起来-不循环部分。 分母=99..(循环位数)0..(不循环位数) */ int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); char s[100]; int t; scanf("%d\n",&t); while( t-- ) { scanf("%s",s); int l=strlen(s); int kuo=0; int n1=0,n2=1; for(int i=2; i<l; i++) { n1=n1*10+s[i]-'0'; n2*=10; if(s[i]=='(') { kuo=1; break; } } if(kuo) { int t1=0,t2=0; int l1=0,l2=0; int nnnn=1; int num=0,nu = 0; int flag=0; for(int i=2; i<l; i++) { if(s[i]>='0'&&s[i]<='9') { if(!flag) { l1++; nnnn*=10; t1=t1*10+s[i]-'0'; } else { num*=10; nu=nu*10+9; l2++; t2=t2*10+s[i]-'0'; } } else { if(!flag) num=t1; num+=t2; flag=1; } } num-=t1; nu=nu*nnnn; int gcdd=gcd(num,nu); printf("%d/%d\n", num/gcdd, nu/gcdd); } else { int gc=gcd(n1,n2); printf("%d/%d\n", n1/gc, n2/gc ); } } return 0; }
分数化小数 这个暂时还没弄明白 ,,莫着急、、、
分数化小数代码