您的位置:首页 > 其它

紫书 p59 习题3-8

2016-03-01 21:53 295 查看
循环的地方就是余数重复出现的地方,这个不难想。用数组记录余数是否出现过。。出现一次就加1,这种方法以前见过的。。,就是电话号码那道题,但是一开始还是只想到记录下来每次的余数然后用循环来找这个余数有没有出现过,看了别人思路的提示才知道。。用数组这种思路不是很难想,以前也用这种方法做过,只是第一次是担心数组开太大才没用==恩。。以后注意就是

这道题之后才知道为什么分数一定是有理数。。。。以前都没想过这个问题==只要余数和前面的某个重复了就会循环,而余数必然小于除数,所以肯定会在有限个小数的地方循环

参考过思路的解题报告(http://blog.csdn.net/mobius_strip/article/details/39870555),后来写完之后顺便看看这个题解的代码发现可以不用struct直接用数组就好。。不过感觉也差不多

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct record
{
int num,pos;
}tmp[3001];
int main()
{
int a,b,r[3001],last,first,i,a1;
while(scanf("%d%d",&a,&b)!=EOF)
{
a1=a;
first=1;
memset(tmp,0,sizeof(tmp));
for(i=0;i<b;i++)
{
r[i]=a/b;
if(tmp[a%b].num!=0){last=i;first=tmp[a%b].pos;break;}
tmp[a%b].num++;
tmp[a%b].pos=i+1;
a=(a%b)*10;
//cout<<b<<endl;
}
printf("%d/%d = %d.",a1,b,r[0]);
for(i=1;i<first;i++)printf("%d",r[i]);
printf("(");
if(last<51)
{
for(i=first;i<=last;i++)printf("%d",r[i]);
}
else
{
for(i=first;i<51;i++)printf("%d",r[i]);
printf("...");
}
printf(")\n   %d = number of digits in repeating cycle\n\n",last-first+1);
}
return 0;
}


以后要记录做每道题的时间了。。不然实在做的太慢了==开学以后感觉一下就没时间了。。。只能挤时间。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: