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

分数化小数(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-1printf("%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();
        }       
    }
}