您的位置:首页 > 其它

UVa 202 Repeating Decimals【模拟】

2015-05-04 21:01 423 查看
题意:输入整数a和b,输出a/b的循环小数以及循环节的长度

学习的这一篇
http://blog.csdn.net/mobius_strip/article/details/39870555
因为n%m的余数只可能是0到m-1中的一个,根据抽屉原理,当计算m+1次时至少存在一个余数相同

发现看了题解理解起来也好困难啊,

后来手动画了一下5/7的竖式除法的式子,,理解一些了

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=100005;

int vis[maxn],r[maxn],s[maxn];

int main(){
int n,m;
while(cin>>n>>m){
memset(vis,0,sizeof(vis));
memset(r,0,sizeof(r));
memset(s,0,sizeof(s));

int cnt=0;
int t=n;
r[cnt++]=n/m;
n=n%m;
while(!vis
&&n){
vis
=cnt;
s[cnt]=n;//s数组存的是对应的余数
r[cnt++]=n*10/m;//r数组存的是对应的商
n=n*10%m;
}

printf("%d/%d = %d.",t,m,r[0]);

for(int i=1;i<cnt&i<=50;i++){
if(s[i]==n&&n) printf("(");
printf("%d",r[i]);
}
if (!n) printf("(0");
if (cnt > 50) printf("...");
printf(")\n");
printf("   %d = number of digits in repeating cycle\n\n",!n?1:cnt-vis
);
}
return 0;
}


View Code

还得再多画一画----好晕--------------

写模拟写得好难受------------

goooooooooooooo----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: