HDU - 2522 - A simple problem
上题目:
A simple problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2918 Accepted Submission(s): 1041
Problem Description
Zty很痴迷数学问题.。一天,yifenfei出了个数学题想难倒他,让他回答1 / n。但Zty却回答不了^_^. 请大家编程帮助他.
Input
第一行整数T,表示测试组数。后面T行,每行一个整数 n (1<=|n|<=10^5).
Output
输出1/n. (是循环小数的,只输出第一个循环节).
Sample Input
4
2
3
7
168
Sample Output
0.5
0.3
0.142857
0.005952380
中文题意不解释,突然想起小数循环节的问题→_→,找了一条来做做,结果还真的有点问题。首先是题目,1/168=0.005952380,如果正式找循环节为什么不是0595238,但在网上看到其他人说如果真的是0595238的话就得不到1/168了。
详细做法看代码,其中f数组是用来保存哪一个余数已经出现过一边,因为同一个余数如果再出现一遍那就说明接下来又得在循环一次了,所以当判断到余数再出现的时候就跳出循环。当前在进入循环之前必须先将f[1]=1,因为可以将起始数当作是最开始的余数。然后每一次余数都要先扩大10倍(就是模拟笔算的过程,被除数不够大就要在后面补零),然后再进行运算。
上代码:
1 #include <cstdio> 2 #include <cstring> 3 #define MAX 100002 4 using namespace std; 5 6 bool f[MAX]; 7 8 int main() 9 { 10 int t,n; 11 //freopen("data.txt","r",stdin); 12 scanf("%d",&t); 13 while(t--){ 14 scanf("%d",&n); 15 if(n<0){ 16 printf("-"); 17 n=-n; 18 } 19 if(n==1){ 20 printf("1\n"); 21 continue; 22 } 23 printf("0."); 24 memset(f,0,sizeof(f)); 25 int m; 26 m=1; 27 f[m]=1; 28 while(m){ 29 m=m*10; 30 printf("%d",m/n); 31 m=m%n; 32 if(f[m]) break; 33 f[m]=1; 34 } 35 printf("\n"); 36 } 37 return 0; 38 }