uva202题解zyq_198

题意:
输入整数a和b(0≤a≤3000, 1≤b≤3000) , 输出a/b的循环小数表示以及循环节长度。 例如a=5, b=43, 小数表示为0.(116279069767441860465), 循环节长度为21。如果循环节超过50位,就在第50位后打省略号(三个点,就像“…”)
题解:
本题可以定义两个数组,一个存放商,一个存放余数。利用%(模)运算和/(除)运算,循环求出每一步的商和余数,每循环一次,将余数与前面所求的余数做比较,找到相同的余数,则停止循环,已经找出循环节。
这道题最主要的是输出格式比较复杂,一定要看好空格,不要多也不要少。

#include<stdio.h>
#include<string.h>

int main()
{
 int a,b;
 int ans[10000],res[10000];
  
 while(scanf("%d%d",&a,&b)==2)
 {
    int sta=-1; 
    int num;
    memset(ans,0,sizeof(ans));
    memset(res,0,sizeof(res));
    ans[0]=a/b;
    res[0]=a%b;
    num=0;
    while(1)
     {
       if(res[num]==0) break;
       num++;
       ans[num]=res[num-1]*10/b;
       res[num]=res[num-1]*10%b;
       for(int i=0;i<num;i++)
       {
         if(res[i]==res[num])
         {
         	sta=i;
         	break;
		 } 
	   }
	   if(sta!=-1) break;
     } 
    
   printf("%d/%d = %d.",a,b,ans[0]); 
   if(res[num]==0)
   {
     for(int i=1;i<=num;i++)
     printf("%d",ans[i]);
     printf("(0)\n   %d = number of digits in repeating cycle\n\n",1);
   }
   else{
   
   for(int i=1;i<sta+1&&i<=50;i++)
   printf("%d",ans[i]);
   printf("(");
   for(int i=sta+1;i<=num&&i<=50;i++)
   printf("%d",ans[i]);
   if(num>50) printf("...");
    printf(")\n   %d = number of digits in repeating cycle\n\n",num-sta);
    }
 }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值