ACM(数学问题)——UVa202:输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。...

本文介绍了一种通过模拟除法过程判断循环小数循环节的方法,使用C语言实现,详细展示了如何通过不断取余数并记录,直至找到重复余数,从而确定循环节的起始和结束位置。

主要思路:

通过模拟除法运算过程,来判断循环节结束的位置,不断将余数*10再对除数取余得到新的余数,并记录下来,知道出现的余数之前出现过,此时小数开始循环。

例如:

假设   ->     a 是商  b是余数

(1/7) ->   (1)  a=1/7=0, b=1%7=1;

    (2)  a=(b*10)/7=1  ,  b=(b*10)%7=3;

    (3)  a=(b*10)/7=4  ,  b=(b*10)%7=2;

    (4)  a=(b*10)/7=2  ,  b=(b*10)%7=6;

    (5)  a=(b*10)/7=8  ,  b=(b*10)%7=4;

    (6)  a=(b*10)/7=5  ,  b=(b*10)%7=5;

    (7)  a=(b*10)/7=7  ,  b=(b*10)%7=1;   //与已有的余数相同开始循环

    (8)  a=(b*10)/7=1  ,  b=(b*10)%7=3;  

AC代码:

 1 #include <stdio.h>
 2 
 3 #define MAXN 3000
 4 
 5 int decimal[MAXN];
 6 int numerator[MAXN];
 7 
 8 int main(void)
 9 {
10     int n, d, start, end, i, j;
11 
12     while(scanf("%d%d", &n, &d) != EOF) {
13         i = 0;
14         numerator[i] = n % d;
15         decimal[i] = numerator[i] * 10 / d;
16 
17         for(i=1; ;i++) {
18             numerator[i] = numerator[i-1] * 10 % d;
19             decimal[i] = numerator[i] * 10 / d;
20 
21             for(j=0; j<i; j++)
22                 if(numerator[j] == numerator[i])
23                     break;
24             if(j < i) {
25                 start = j;
26                 end = i - 1;
27                 break;
28             }
29             if(numerator[i] == 0) {
30                 start = i;
31                 end = i;
32                 break;
33             }
34         }
35 
36         printf("%d/%d = %d.", n, d, n / d);
37         for(i=0; i<start; i++)
38             printf("%d", decimal[i]);
39         printf("(");
40         if(end - start + 1 > 50) {
41             for(i=start; i<start+50; i++)
42                 printf("%d", decimal[i]);
43             printf("...");
44         } else {
45             for(i=start; i<=end; i++)
46                 printf("%d", decimal[i]);
47         }
48         printf(")\n");
49         printf("   %d = number of digits in repeating cycle\n\n", end - start + 1);
50     }
51 
52     return 0;
53 }

 

转载于:https://www.cnblogs.com/henulhy/p/10079363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值