uva-202-Repeating Decimals

#include<stdio.h>
#include<stdlib.h>
int main() {
int a, b,i,j,no=0;
while (scanf("%d",&a) != EOF) {
scanf("%d", &b);
//a = a % b;
int len = 0;//循环节长度
int num[3020] = {0};//存小数点后面的数,直接整数除法可得
int rest[3020] = { 0 };//余数,乘10后得到下一次的被除数
for (i = 0; i < 3020; i++) {
if (i == 0) { num[i] = a / b; rest[i] = a - (a / b)*b; }
else {
num[i] = (rest[i - 1] * 10) / b;
rest[i] = rest[i - 1] * 10 - num[i] * b;
}
}
int sg = 0;
for (i = 1; i < 3001; i++) {
for (j = i+1; j < 3001; j++) {//i,j分别是循环列起始位置和终结的后一位
if ((rest[i] == rest[j])&&(num[i]==num[j])) { len = j - i; sg = 1; break; }
}
if (sg) break;
}
if (i == 1 && sg == 1) i = 0;

if (no++)printf("\n");
printf("%d/%d = %d.", a, b, num[0]);
int m;
for (m = 1; m <= i-1; m++) printf("%d", num[m]);
printf("(");
if (len <= 50) { 
for (; m <= j-1; m++) 
printf("%d", num[m]); 
printf(")\n"); 
printf("   %d = number of digits in repeating cycle\n", len); 
}
else { 
for (int n = 1; n <= 50; n++) 
printf("%d", num[n]); 
printf("...)\n"); 
printf("   %d = number of digits in repeating cycle\n",len); 
}


}
//system("pause");
return 0;

}

题目写了有三四个小时,收获很大。真正感受到了计算机运算的快速以及算法就是用程序语言描述解决问题的过程。本题让我意识到了用了很多年的竖式除法真正的作用原理,收获巨大!很开心!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值