紫书——Repeating Decimals UVA - 202

题解:

该题目要求求出每个除数的循环小数,由于整除0也算有循环小数,那么每个除数都会有答案。

这道题的思路就是抽屉原理,由于除数只有3000这个范围,那么余数的范围最多只有0-2999,最差情况下一旦除了3000次后一定有循环的存在。这时候我们只要记录好每次余数出现的时间就可以求出有多少个循环小数。

注意:这道题是每个输出都要有空行,不是数据间之间才有空行,不然会PE(PE了好多次orz)

#include <bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f

int a,b;
int num[3010];	//保存计算结果 
int out[3010];	//对应余数出现的时间 

int main() {
	//freopen("in.txt","r",stdin);
	
	while(scanf("%d%d",&a,&b) == 2){
		memset(out,0,sizeof(out));
		//memset(num,0,sizeof(0));
		
		int pos = 1;	//从1开始
		int yu;	//每次除后的余数 
		int atmp = a; //方便之后输出a原来的大小 
		
		for(;;){
			yu = a%b;
			num[pos] = a/b;
			if(out[yu]) break;	//找到相同的余数后就代表已经循环 
			out[yu] = pos;
			pos++;
			a = yu*10;	
		}
		
		printf("%d/%d = %d.",atmp,b,num[1]);
		int cha = pos-out[yu];	//计算出重复元素的差值
		for(int i = 2; i <= pos-cha; i++) printf("%d",num[i]);
		printf("(");
		for(int i = pos-cha+1; i <= pos; i++){
			printf("%d",num[i]);
			if(i-pos+cha == 50){
				printf("...");
				break;
			}
		}
		printf(")\n");
		printf("   %d = number of digits in repeating cycle\n\n",cha);
	}
		
	return 0;
}

猜你喜欢

转载自blog.csdn.net/a673953508/article/details/80191576