首页 > 其他 > 详细

HDU - 2522 - A simple problem

时间:2014-04-08 11:24:06      阅读:380      评论:0      收藏:0      [点我收藏+]

上题目:

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倍(就是模拟笔算的过程,被除数不够大就要在后面补零),然后再进行运算。
 
上代码:
 
bubuko.com,布布扣
 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 }
2522

 

 
 
 

 

HDU - 2522 - A simple problem,布布扣,bubuko.com

HDU - 2522 - A simple problem

原文:http://www.cnblogs.com/sineatos/p/3651037.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!