欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《算入竞赛入门经典2th》 习题 2-5 分数化小数(decimal)

程序员文章站 2024-03-18 23:12:40
...
#include <stdio.h>
int main (void)
{
	int a = 0, b = 0, c = 0, kase = 0;
		
	while(((scanf("%d%d%d", &a, &b, &c)) == 3)&&(a||b||c)) // 为了鲁棒性 且 结束标志为 a = b = c = 0. 
	{
		int i = 0; 
		int r[120] = {0};
		int z = a / b ; // 将整数部分保存至 z 
		a = a % b ; // 将余数保存至 a 
		
		while( a && i<c+1) //a (余数)如果为零 可跳过此步骤 
		{
			do {
				a *= 10; 
				i++;
			}while(a < b);
			r[i] = a/b; //注意 数组r 是从r[1] 开始储存余数的 
			a %= b;
		}
		
		if(r[c+1] > 5 ) r[c] += 1; //判断 第 n+1值的大小, 如果 大于 5 则向前进位 
		
		for(i = c; i>0; i--)
		{
			if(r[i]==10){
				r[i]=0;
				r[i-1] += 1; //判断被进位的是否满10 是就进位  
			}
			else{
				break; // 否则直接跳出循环 
			}
		}
		
		if(r[0] != 0) z += 1; // 考虑到r[1] = 10 时 会进位 即此时 r[0] !=0 所以整数部分  + 1 
		printf("Case %d: %d.", ++kase, z);
		for(int i = 1; i < c +1; i++)
		printf("%d", r[i]);  //最后按小数形式输出 
		printf("\n"); //以回车结束 
    }
	return 0;
 }