分数的值
Problem Description
输入一个以N/D(0<=N<=65535,0<=D<=65535)形式的分数,其中N为分子,D为分母,输出它的小数形式(运算结果小数点后最多保留100位)。假如它的小数形式存在循环节,要将其用括号括起来。例如:1/3=0.33333...表示为.(3),又如41/333=0.123123123...表示为0.(123)。
Input
每行2个用空格分开的整数N和D
Output
每行输出一个结果
Sample Input
1 3 22 5 1 7
Sample Output
1/3=0.(3) 22/5=4.4 1/7=0.(142857)
解释:
这是一个数学题吧,模拟数学的计算过程。对于N / D,每一次都可以得到一个商和一个余数,如果一个余数出现两次,那么就是循环一个循环小数。题目有说明,最多只输出100位。既然要判断一个数有没有出现两次呢,有一种办法就是用一个数组下标来记录,例如flag[i]=1 就是表示数 i 出现了1次,这个题呢,D <= 65535, 感觉不是很大,可以开辟这么大的数组。但好像没有必要,毕竟只会用到100个,多余的6W多空间会被浪费。可以考虑用map,set等数据结构来保存。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 const int N = 101; 5 6 int remaind[N]; // 余数 7 int integ[N]; // 整数 8 bool flag_integ[65536]; 9 10 int main() 11 { 12 int n, d; 13 while (cin >> n >> d){ 14 memset(remaind, 0, sizeof(remaind)); 15 memset(integ, 0, sizeof(integ)); 16 memset(flag_integ, 0, sizeof(flag_integ)); 17 int cnt = 0; 18 19 integ[cnt] = n/d; 20 flag_integ[n] = 1; 21 remaind[cnt] = n % d; 22 flag_integ[remaind[cnt]] = 1; 23 24 cnt++; 25 int flag = 0; 26 while (cnt <= 100 && remaind[cnt-1] != 0) { 27 28 integ[cnt] = (remaind[cnt-1] * 10) / d; 29 remaind[cnt] = (remaind[cnt-1] * 10) % d; 30 31 if (remaind[cnt] == 0) break; 32 if (flag_integ[remaind[cnt]]) { 33 flag = 1; break; 34 } 35 36 flag_integ[remaind[cnt]] = 1; 37 cnt++; 38 } 39 40 if (flag){ 41 printf("%d/%d=%d.(", n, d, integ[0]); 42 for (int i = 1; i <= cnt; i++){ 43 printf("%d", integ[i]); 44 } 45 printf(") "); 46 } else { 47 printf("%d/%d=%d.", n, d, integ[0]); 48 for (int i = 1; i <= cnt; i++) { 49 printf("%d", integ[i]); 50 } 51 printf(" "); 52 } 53 54 55 } 56 return 0; 57 }
我没有用那些数据结构的原因是,我比较懒,用数组保存就很快,写代码很快。懒得扣jio,贼懒