1 題目描述
輸入位數(shù)小于5000位的被除數(shù)以及在整形數(shù)據(jù)范圍內(nèi)的除數(shù)寄摆,要求輸出兩者進(jìn)行除法運(yùn)算后的整數(shù)商喇闸,忽略小數(shù)蒸眠。
1.1 輸入
輸入共兩行漾橙,第一行為被除數(shù),第二行為除數(shù)楞卡。
1.2 輸出
輸出整數(shù)商霜运,忽略小數(shù)脾歇。
1.3 樣例輸入
20
5
1.4 樣例輸出
4
2 解題
解決思路
當(dāng)參與除法運(yùn)算的數(shù)值遠(yuǎn)遠(yuǎn)大于計算機(jī)所能直接計算的位數(shù)時,就需要采用特殊的高精度算法淘捡,一般來說藕各,編寫模擬手動計算的代碼最為簡單。平常我們手動進(jìn)行加減乘除四則運(yùn)算均遵循某種特定的規(guī)則焦除,那么我們現(xiàn)在就需要從早已熟知的四則運(yùn)算的筆算里抽象出某一特定的算法進(jìn)行編碼激况。
3 代碼
#include <cstdio>
#include <cstring>
/*
定義全局變量時編譯器會自動初始化值為0
在主函數(shù)內(nèi)定義變量 若無初始化則為不確定的值
*/
char str[5000];
int dividend[5000]; //被除數(shù)
int divisor; //除數(shù)
int d; //中間計算的余數(shù)
int quotient[5000]; //整數(shù)商
int main()
{
scanf("%s",str); //使用字符數(shù)組接收輸入便于處理高位的數(shù)值
scanf("%d",&divisor); //輸入除數(shù)
int l = strlen(str); //需要知道字符數(shù)組存儲了幾位的數(shù)字
for(int i = l - 1; i >= 0; --i)
dividend[l-1-i] = (int)(str[i] - '0');
//這里將字符數(shù)組倒轉(zhuǎn)賦值給被除數(shù)數(shù)組,便于后續(xù)計算
for(int i = l - 1; i >= 0; --i){
d = d * 10 + dividend[i];
quotient[i] = d / divisor;
d = d % divisor;
}
//核心代碼:模擬手動除法計算的過程
while(quotient[l - 1] == 0 && l > 1)
l--;
//從最高位開始直到非零位才輸出
for(int i = l - 1; i >= 0; --i)
printf("%d",quotient[i]);
printf("\n"); //輸出最后要記得換行膘魄,否則會Presentation Error
return 0;
}