分数转化成小数(2018华科计试第三题)

题目描述:

编写程序,接受以N/D形式的分数,输出他们的小数形式,如果小数存在循环节,则用括号括起来,如:1/1.3333333…表示为0.(3)
例如,输入:8/5 1/3 11/13
则输出为:
8/5=1.6
1/3=.(3)
11/13=.(846153)

思路:

手动模拟除法,将每一位小数和每一次余数分别存在两个数组。如果余数为0,说明除法结束,无循环;如果余数中出现相等的情况,说明出现循环节,记录循环节的位置。

代码:

#include<stdio.h>
int main()
{
	//n为被除数,d为除数 
	int n,d,i,flag=0;
	//a为正数部分,b为余数,c为每一位小数,k记录循环节位置 
	int a,b[100],c[100],top,k;
	while((scanf("%d/%d",&n,&d))!=EOF)
	{
		top=flag=0;
		//获取正数部分、第一次余数,第一位小数 
		a=n/d;
		b[top]=n%d;
		c[top]=b[top]*10/d;
		//当余数不为0 
		while(b[top]!=0)
		{
			top++;
			//计算下一次余数,下一位小数 
			b[top]=b[top-1]*10%d;
			c[top]=b[top]*10/d;
			//如果余数出现和第一次的余数相等,说明出现循环节 
			for(i=0;i<top;i++)
				if(b[i]==b[top])
				{
					flag=1;
					k=i;
					break;
				}
			if(flag)
				break;
		}
		//输出格式化 
		printf("%d/%d=",n,d);
		if(a!=0)
			printf("%d",a);
		if(top!=0)
			printf(".");
		
		for(i=0;i<top;i++)
		{
			if(flag&&i==k)
				printf("(");
			printf("%d",c[i]);
			if(flag&&(i+1)==top)
				printf(")");
		}
				
		printf("\n");
	}	
} 

声明:

如果本算法有什么漏洞或者需要改进的地方,希望读者不吝赐教,大家互相学习共同进步,谢谢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章