【UVA】202 Repeating Decimals

题目链接:Repeating Decimals

题目:

The decimal expansion of the fraction 1/33 is 0.03, where the 03 is used to indicate that the cycle 03 repeats indefinitely with no intervening digits. In fact, the decimal expansion of every rational number (fraction) has a repeating cycle as opposed to decimal expansions of irrational numbers, which have no such repeating cycles.

Examples of decimal expansions of rational numbers and their repeating cycles are shown below. Here, we use parentheses to enclose the repeating cycle rather than place a bar over the cycle.

fraction decimal expansion repeating cycle cycle length
1/6 0.1(6) 6 1
5/7 0.(714285) 714285 6
1/250 0.004(0) 0 1
300/31 9.(677419354838709) 677419354838709 15
655/990 0.6(61) 61 2

Write a program that reads numerators and denominators of fractions and determines their repeating cycles.

For the purposes of this problem, define a repeating cycle of a fraction to be the first minimal length string of digits to the right of the decimal that repeats indefinitely with no intervening digits. Thus for example, the repeating cycle of the fraction 1/250 is 0, which begins at position 4 (as opposed to 0 which begins at positions 1 or 2 and as opposed to 00 which begins at positions 1 or 4).

Input

Each line of the input file consists of an integer numerator, which is nonnegative, followed by an integer denominator, which is positive. None of the input integers exceeds 3000. End-of-file indicates the end of input.

Output

For each line of input, print the fraction, its decimal expansion through the first occurrence of the cycle to the right of the decimal or 50 decimal places (whichever comes first), and the length of the entire repeating cycle.

In writing the decimal expansion, enclose the repeating cycle in parentheses when possible. If the entire repeating cycle does not occur within the first 50 places, place a left parenthesis where the cycle begins — it will begin within the first 50 places — and place ‘...)’ after the 50th digit.

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除以除数,得到商。每次的被除数,都是之前一次的余数乘10后,对除数取余。判断是否是循环小数,只需看当前余数(用作被除数)是否曾经出现过。另外,通过num记录小数位数。

结果输出时,通过判断a的值等于余数的值,判断出循环起点。另外注意长度>50输出“...”。

另外注意结果中每组还要额外加一个空行!刚开始没加就pe了。

代码:

#include <stdio.h>
#include <string.h>
int main()
{
	int quo[3005],rem[3005],k[3005];//商和余数,及标志小数位
	int a,b,num,i;	//a被除数,b除数,num为小数位数
	while (~scanf("%d%d",&a,&b))
	{
		printf("%d/%d = %d.",a,b,a/b);
		memset(k,0,sizeof(k));
		a %= b;
		for (num=1; a&&!k[a];num++)
			//被除数非0且同样的被除数之前未出现过
		{
			k[a] = num;
			rem[num] = a;
			quo[num] = (10*a) / b;
			a = (10*a) % b;
			//printf("\nnum=%d,rem=%d,quo=%d\n",num,rem[num],quo[num]);
		}
		for (i=1; i<num && i<=50; i++)
		{
			if (a && rem[i] == a)printf("(");//回到循环起点
			printf("%d",quo[i]);
		}
		if (!a) printf("(0");
		if (num > 50) printf("...");
		printf(")\n");
		if (a==0) printf("   1 = number of digits in repeating cycle\n\n");
		else printf("   %d = number of digits in repeating cycle\n\n",num-k[a]);
	}
	return 0;
}

 

全部评论

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务