分数化小数c语言题目,习题 2-5 分数化小数 (decimal)(C语言版)
習(xí)題描述:“輸入正整數(shù) a, b, c,輸出a/b的小數(shù)形式,精確到小數(shù)點后c位。a, b<= 10^6, c<=100。輸入包含多組數(shù)據(jù),結(jié)束標(biāo)記為 a=b=c=0。”
樣例輸入:
1 6 4
0 0 0
樣例輸出:
Case 1: 0.1667
感悟://這道題有些小插曲,我之前嘗試了一些,由于基礎(chǔ)不是很扎實,想的比較復(fù)雜,后來了解到:格式化輸出(printf)的特殊用法。如printf(“% * . * lf\n”, 8, 4, (double)1/6); 會輸出8個字寬保留4位小數(shù)的浮點數(shù)運算結(jié)果。
這個方法比分別求小數(shù)的整數(shù)部分和小數(shù)部分 且還要考慮進(jìn)位的情況簡易的多。但是測試時發(fā)現(xiàn)一旦c大于16以后,輸出的浮點數(shù)后面全為0,原因是double的有效精度只有16位。不適合題意,但是我還是把兩種方法給列了出來。
解法一(printf的特殊用法)(不符合題意要求):
#include
int main()
{
int a,b,c,s=0;
double m;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a==0&&b==0&&c==0)
{
break;
}
m=1.0*a/b;
s++;
printf("Case %d: %.*f",s,c,m);
}
return 0;
}
解法二(模擬保留小數(shù)位的過程):
思路:這道題主要要注意的是小數(shù)的位數(shù)需要人工輸入,就是模擬保留小數(shù)位的過程,具體的思路是先輸出整數(shù)位和小數(shù)點,小數(shù)位則通過上一次除后的所得余數(shù)再除除數(shù)依次類推,到最后一位時要根據(jù)下一位的數(shù)值來判斷是否進(jìn)位。
這里選擇題目的樣例就是1/6,輸出至小數(shù)點后4位數(shù),先求出他們的商,既1÷6=0······1。商為0余數(shù)為1。那么此時就打印出”0.”來。此時應(yīng)該算十分位,所以余數(shù)1應(yīng)該乘以10為10,保持被除數(shù)和除數(shù)位數(shù)一致。10÷6=1······4。商為1余數(shù)為4。此時打印出來“1”來。則輸出的為“0.1”。再算百分位:40÷6=6······4,商為6余數(shù)為4。此時打印出“6”。輸出界面輸出“0.16”。以上辦法得出千分位和萬分位。輸出界面輸出結(jié)果為“0.1666”。此時就有四位小數(shù),但是還要檢查最后一位是否為四舍五入。再次計算十萬分位,發(fā)現(xiàn)商為6,那么萬分位就要進(jìn)一。最后結(jié)果為“0.1667”。
#include
int n,m[110];//n整數(shù)部分,m小數(shù)部分
int main()
{
int a,b,c,i,k=0;
while(scanf("%d%d%d",&a,&b,&c)&&a&&b&&c)
{
k++;
n=a/b;
a=a%b;
m[0]=0;//十分位小數(shù),可以進(jìn)位為整數(shù)
for(i=1;i<=c;i++)
{
m[i]=a*10/b;
a=a*10%b;
}
if(a*10/b>=5)//第C+1位,四舍五入
{
for(i=c;i>=0;i--)//進(jìn)位處理
{
m[i]=m[i]+1;
if(m[i]<10)
break;//若不存在進(jìn)位,跳出循環(huán)。
else
m[i]-=10;
}
}
n=n+m[0];//整數(shù)部分進(jìn)位處理。
printf("Case %d: %d.",k,n);//打印整數(shù)部分及小數(shù)點
for(i=1;i<=c;i++)
printf("%d",m[i]);//打印小數(shù)部分。
printf("\n");
}
return 0;
}
歡迎指點!
總結(jié)
以上是生活随笔為你收集整理的分数化小数c语言题目,习题 2-5 分数化小数 (decimal)(C语言版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通银行属于国有银行吗
- 下一篇: 学生信息管理C语言 密码,求学生信息管理