解题报告——习题2-5 分数化小数(decimal) 输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。

励志用尽量少的代码做高效的表达。


题目描述:

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。 a,b ≤10^6 ,c≤100。输入包含多组数据,结束标记记为a = b = c = 0。

样例输入:

1 6 4
0 0 0

样例输出:

Case 1: 0.1667


网上有很多错误代码,形如:

或者:

无论C格式,还是C++格式,都是错的!!!因为根本没办法显示几十位的小数!

因此,本题的核心思路只有这一个:数组存储高精度小数。

举例:

输入1 6 4, 首先将1扩大到100000,用100000除6,得到16666.666…要求保留小数点后四位,因此四舍五入后为:1667。输出整数部分与该数即可。
由于可能取到小数点后100位,因此所有数据用数组存储,模拟手算除法。

代码:

#include<bits/stdc++.h>			//万能头文件
using namespace std;
int main() {
	int a, b, c, num = 0; 		//num做计数器
	while(cin >> a >> b >> c && a != 0) {
		a = (a%b); 							//保证分子小于分母
		int a1[c+2]; 						//定义被除数数组
		memset(a1, 0, sizeof(a1));  a1[0] = a;	//置0 
		int b1[c+1]; memset(b1, 0, sizeof(b1));	//定义存放结果的数组,置0
		for(int i = 0; i <= c; i++) {		//核心代码
			b1[i] = a1[i]*10/b;
			a1[i+1] = ((a1[i]*10)%b);
		}
		if(c>=1) 							//四舍五入 
			if(b1[c]>=5) b1[c-1]+=1;	
		cout << "Case " << ++num << ": " << a/b << '.';	//输出
		for(int i = 0; i < c; i++)  cout << b1[i];  
		cout << endl;      
	}                                     
	return 0;
} 

如果对你产生了帮助,就请给博主点一个小小的赞吧!大家的点赞是我不断更新的最大动力!

发布了97 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/105774602