UVa202

写的比较暴力,把余数乘10的存储和余数的存储分开了,导致逻辑有些混乱而不得不考虑多种特殊情况(这样写主要是循环节以0开始比较麻烦,如50/99等)

另外注意输出小数位后50而不是循环节的前50位。

#include<stdio.h>
#include<string.h>
#define INFINITE 3005
const char*msg="number of digits in repeating cycle";
int cr[INFINITE];
int cq[INFINITE];
int main()
{
	int m,n;
s:while(scanf("%d%d",&m,&n)==2&&n){
		memset(cr,0,sizeof(cr)); memset(cq,0,sizeof(cq));
		int q=m/n,r=m%n,count=1;
		printf("%d/%d = %d.",m,n,q);
		m=r;
		cr[r]=1;
		while(r){
			m*=10;
			while(m<n) {  cq[count++]=0;  
			if(cr[m]){
						if(cr[m]){
				for(int i=1;i<=cr[m]-1;i++) printf("%d",cq[i]);
				printf("(");
				for(int i=cr[m];i<count;i++){ 
					if(i==51){ printf("..."); break; 
} 
					else printf("%d",cq[i]); }
				printf(")\n   %d = %s\n\n",count-cr[m],msg); 
				goto s;
				}
			}
			else cr[m]=count;
			m*=10; }
			q=m/n; r=m%n; cq[count++]=q;
			if(cr[r]){
				for(int i=1;i<=cr[r]-1;i++) printf("%d",cq[i]);
				printf("(");
				for(int i=cr[r];i<count;i++){ 
					if(i==51){ printf("..."); break; 
} 
					else printf("%d",cq[i]); }
				printf(")\n   %d = %s\n\n",count-cr[r],msg); 
				goto s;
			}
			else{
				 cr[r]=count; m=r;
			}
		}
		for(int i=1;i<count;i++){ 
			if(i==51){ printf("..."); break; } 
			else printf("%d",cq[i]); }
		printf("(0)\n   1 = %s\n\n",msg);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值