uva202 循环小数

题目描述:输入整数a和b,输出a/b的循环小数表示及循环节长度。
例如:
Sample Input
76 25
5 43
1 397

Sample Output
76/25 = 3.04(0)
1 = number of digits in repeating cycle

5/43 = 0.(116279069767441860465)
21 = number of digits in repeating cycle

1/397 = 0.(00251889168765743073047858942065491183879093198992…)
99 = number of digits in repeating cycle
分析:
其实就想小学生做除法一样,只需要每次取余再用余数×10就可以了,然后再每次取整,其中把所有的小数都保存下来,然后记录循环的起始位置和结束位置,只要其中两次的余数相同,那么就开始循环了。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int a,b,a0,ans[40000]={0},len,str[40000]={0},place[4000]={0};
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        a0=a;//先把a保存起来
        int t;
        memset(ans,0,sizeof(ans));
        memset(str,0,sizeof(str));
        memset(place,0,sizeof(place));
        a=a%b;//第一次的余数
        int k=0,remain;
        int p;
        str[a]++;
        place[a]=0;
        while(1)
        {
            a=a*10;
            ans[k]=a/b;//把小数部分保存下来
            remain=a%b;
             k++;
             if(str[remain]==0)//判断余数是否出现过
             {
                 a=remain;
                 place[remain]=k;
                 str[remain]++;

             }
             else//如果出现过,那么下面开始循环从上次的余数开始到此次为一个周期,下面开始以这个为周期开始循环
             {

                 t=place[remain];//记录上次出现的位置
                 len=k-t;//记录长度
                 p=k;
                 break;
             }
        }
        if(len<50)
        {
            printf("%d/%d = %d.",a0,b,a0/b);
                int i;
          for(i=0;i<t;i++)//输出不是循环的部分
            printf("%d",ans[i]);
          printf("(");
          for(i=t;i<k;i++)//输出循环的部分
            printf("%d",ans[i]);
          printf(")\n");
          printf("   %d = number of digits in repeating cycle\n",len);

        }
        else
        {
            printf("%d/%d = %d.",a0,b,a0/b);
                int i;
          for(i=0;i<t;i++)
            printf("%d",ans[i]);
          printf("(");
          for(i=t;i<50;i++)
            printf("%d",ans[i]);
            printf("...)\n");
          printf("   %d = number of digits in repeating cycle\n",len);
        }
        printf("\n");
    }
    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值