分数化小数(decimal)
算法:分数化小数(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(); } } }
下一篇:
自定义简单字符栈 java版