分数化小数(decimal)
程序员文章站
2024-03-18 23:47:04
...
算法:分数化小数(decimal)
输入正整数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
思路:这道题主要要注意的是小数的位数需要人工输入,就是模拟保留小数位的过程,具体的思路是先输出整数位和小数点,小数位则通过上一次除后的所得余数再除除数依次类推,到最后一位时要根据下一位的数值来判断是否进位。
例题:这里选择题目的样例就是1/6,输出至小数点后4位数,先求出他们的商,既1÷6=0······1。商为0余数为1。那么此时就打印出”0.”来。此时应该算十分位,所以余数1应该乘以10为10,保持被除数和除数位数一致。10÷6=1······4。商为1余数为1。此时打印出来“1”来。则输出的为“0.1”。再算百分位:40÷6=6······4,商为6余数为4。此时打印出“6”。输出界面输出“0.16”。以上办法得出千分位和万分位。输出界面输出结果为“0.1666”。此时就有四位小数,但是还要检查最后一位是否为四舍五入。再次计算十万分位,发现商为6,那么万分位就要进一。最后结果为“0.1667”。
此处C语言和Java都用的同一思路。
C语言代码:
#include <stdio.h>
int main(){
long long a,b;
int c;
int j=0;
while((scanf("%lld%lld%d",&a,&b,&c)&& !(a==0&&b==0&&c==0))){
printf ("Case %d : %lld.",++j,a/b);//先输出整数部分和小数点
a = a%b; //得到余数
for(int i = 1; i < c ; i++){ //循序,一直算到第c-1位
printf("%lld",a*10/b);
a = a*10%b;
}
if (a*10%b*10/b < 5){//对需要输出的最后一位进行是否进位的判断
printf ("%lld",a*10/b);
}else{
printf ("%lld",a*10/b+1);
}
}
return 0;
}
Java代码:
import java.util.Scanner;
/**
* 分数化小数
* @author 亮君然
*
*/
public class Code {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long a,b;
int c;
a = in.nextLong();
b = in.nextLong();
c = in.nextInt();
int j = 0;
while( (true) &&(!(a==0&&b==0&&c==0))){
System.out.print("Case"+ ++j +":"+a/b+"."); //输出整数位
a = a%b;
for(int i=1;i<c;i++){
System.out.print(a*10/b);
a = a*10%b;
}
if(a*10%b*10/b < 5){
System.out.print(a*10/b);
}else{
System.out.print(a*10/b+1);
}
a = in.nextLong();
b = in.nextLong();
c = in.nextInt();
}
}
}
上一篇: 算法竞赛入门指南第八章