最近我正在跟著一本書——《資訊學奧賽一本通(C++版)》學習C++,書后有一道題如下:
【題目描述】
分數ab化為小數后,小數點后第n位的數字是多少?
【輸入】
三個正整數a,b,n,相鄰兩個數之間用單個空格隔開。0<a<b<100,1<=n<=10000。
【輸出】
一個數字。
【輸入樣例】
1 2 1
【輸出樣例】
5
我的程式如下:
# include <cstdio>
# include <cmath>
using namespace std;
int main()
{
int n, result; //宣告整型變數n(小數點后第幾位)和result(小數點后第n位小數)
double a, b, number; //生命雙精度浮點型變數a(被除數)、b(除數)和number(商(沒有余數))
scanf("%lf %lf %d", &a, &b, &n); //用戶輸入被除數a、除數b和要求的小數點后第幾位位數n
number = a / b; //求出商(沒有余數)
result = (int)(number / (1.0 / pow(10, n))) % 10;
//number / (1.0 / pow(10, n))求出number里有幾個10的-n次方,然后求出個位數即使題目所求,存入整形變數result
printf("%d", result); //輸出result
return 0; //結束程式
}
那本書有一個配套的測評網站http://ybt.ssoier.cn:8088/,我把程式傳上去之后它說答案錯誤,我很納悶,試了幾次結果都沒出問題,直到我測驗6除以5時,發現錯誤:
【輸入】
6 5 1
【輸出】
1
我很納悶,6除以5等于1.2,小數點后第一位應該是2,怎么會是1呢
?后來我就在程式中添加了測驗行2行,如下:
# include <cstdio>
# include <cmath>
using namespace std;
int main()
{
int n, result; //宣告整型變數n(小數點后第幾位)和result(小數點后第n位小數)
double a, b, number; //生命雙精度浮點型變數a(被除數)、b(除數)和number(商(沒有余數))
scanf("%lf %lf %d", &a, &b, &n); //用戶輸入被除數a、除數b和要求的小數點后第幾位位數n
number = a / b; //求出商(沒有余數)
result = (int)(number / (1.0 / pow(10, n))) % 10;
//number / (1.0 / pow(10, n))求出number里有幾個10的-n次方,然后求出個位數即使題目所求,存入整形變數result
printf("%lf\n", (number / (1.0 / pow(10, n)))); //錯誤之后添加的測驗行,提交時沒有,本行輸出number里有幾個10的-n次方
printf("%d\n", (int)(number / (1.0 / pow(10, n)))); //錯誤之后添加的測驗行,提交時沒有,本行輸出對上一行結果進行int的結果
printf("%d", result); //輸出result
return 0; //結束程式
}
于是輸入輸出變成了:
【輸入】
6 5 1
【輸出】
12.000000
11
1
我極度納悶,(int)12.000000咋就變成了11???!!!



于是我就弄了一個測驗程式,如下:
# include <cstdio>
using namespace std;
int main()
{
double a = 12.000000;
printf("%d\n", (int)a);
return 0;
}
結果如下:
【輸出】
12
我納悶至極,都開始懷疑我的視力了,求助各位大佬們,這到底為啥????!!!!






感謝各位大佬!!!望回答!!!
uj5u.com熱心網友回復:
最多小數點后一萬位呢,需要自己做除法uj5u.com熱心網友回復:
我沒理解您的意思 ,您能說得詳細億點兒嗎
?
uj5u.com熱心網友回復:
//number / (1.0 / pow(10, n))求出number里有幾個10的-n次方,然后求出個位數即使題目所求,存入整形變數result實際上你可以看成,小數點向后移。
式子就變成了number * pow(10, n) % 10 (這里放入程式不會 出現上述問題)
在講講 輸出結果為11的問題
這里涉及的知識比較多,有興趣可以去了解下浮點型與16進制的轉換關系。
下面作簡單講解:
1.0 / pow(10, n) 的結果為0.1 但是這個數在計算機是沒辦法存盤的,只會存盤近似值 大概約等于0.100000000000000006
number 取1.2(實際也取不到,這里為了方便,假設取到了) 那么1.2 / 0.100000000000000006 也就變成了11.99999999999999928
取整數也就是11.
uj5u.com熱心網友回復:
樓主的代碼,供參考://【輸入】
//三個正整數a,b,n,相鄰兩個數之間用單個空格隔開。0<a<b<100,1<=n<=10000。
//【輸出】
//一個數字。
//【輸入樣例】
//1 2 1
//【輸出樣例】
//5
//例如:13/97=0.13402061855670103092783505154639;
# include <stdio.h>
# include <math.h>
using namespace std;
int main()
{
int n, result,a, b;
scanf("%d %d %d", &a, &b, &n);
result = (int)(a*1.0 / b*1.0/(1.0 / pow(10, n))) % 10;
printf("%d", result); //輸出result
return 0; //結束程式
}
//6 5 1
//2請按任意鍵繼續. . .
//13 97 32
//0請按任意鍵繼續. . .
//13 97 10000
//pow: OVERFLOW error 溢位報錯
模擬除法的寫法,供參考:
//模擬除法程序
//例如:13/97=0.13402061855670103092783505154639;
#include <stdio.h>
using namespace std;
int main()
{
int a,b,n,c;
scanf("%d %d %d",&a,&b,&n);
if(a > b) a = a % b;
for(int i = 1;i <= n;i ++){
c = 10 * a / b;
a = 10 * a - b * c;
}
printf("%d\n",c);
return 0;
}
//6 5 1
//2
//請按任意鍵繼續. . .
//13 97 32
//9
//請按任意鍵繼續. . .
//13 97 79
//6
//請按任意鍵繼續. . .
//13 97 10000
//0
//請按任意鍵繼續. . .
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260197.html
標籤:C++ 語言
上一篇:求助
下一篇:快要上班啦。
