分数化小数
输入正整数a, b, c,输出a/b的小数形式,精确到小数点后c位。a, b ≤ 106,c ≤ 100。输入包含多组数据,结束标记为a=b=c=0.
样例输入:
1 6 4
0 0 0
样例输出:
Case 1:0.1667
解题关键
- 如何实现输出精确到小数点后c位。
- 如何处理c+1位的四舍五入问题。
先放代码:
#include<stdio.h>
int main()
{
int a,b,c,count=0;
while(scanf("%d%d%d",&a,&b,&c)==3&&a&&b&&c){
int decimal[100]={0};
int s=0;
s=a/b;
a=a%b;
//处理小数位
for(int i=0;i<c;i++){
decimal[i]=a*10/b;
a=a*10%b;
}
//小数位四舍五入
if(a*10/b>=5)
for(int i=c-1;i>=0;i--){
decimal[i]++;
if(i!=0&&decimal[i]>9){
decimal[i]=0;
}
//当小数点后第一位四舍五入进位时将其置0,s加1;
else if(i==0&&decimal[i]>9){
s++;
decimal[i]=0;
}
else break;
}
count++;
printf("Case %d: %d.",count,s);
for(int i=0;i<c;i++)
printf("%d",decimal[i]);
printf("\n");
}
return 0;
}
解题思路
1.c是随机输入的,位数最多为100位,基本数据类型中double能保证的也只有15-16位有效数字,因此考虑用数组保存小数位,按位保存到第c位为止。
2.对于第c+1位,计算其值,若≥5则四舍五入进位,有三种进位情况:末尾进位、进位到小数位其他位、进位到整数位,对此需要遍历小数数组以确保进位所得的值正确。
本题重点在于判断进位类型,比如可能存在这样一个输入案例 26555 13333 3,那么它的输出四舍五入进位最后为2.000
以上是几种可能的进位情况,本人愚笨,本题小数进位的情况可能未考虑周全,还请不吝指教。