個人首頁:mzwang.top
A除以B
題目描述:
本題要求計算 A/B,其中 A 是不超過 1000 位的正整數,B 是 1 位正整數。你需要輸出商數 Q 和餘數 R,使得 A=B×Q+R 成立。輸入格式:
輸入在一行中依次給出 A 和 B,中間以 1 空格分隔。輸出格式:
在一行中依次輸出 Q 和 R,中間以 1 空格分隔。輸入樣例:
123456789050987654321 7
輸出樣例:
17636684150141093474 3
題目來源:PAT乙級1017
作者:CHEN, Yue
機關:浙江大學
問題解決:
解題思想
此題主要需解決一下幾個問題:
- 大數的存儲和輸入問題。
- 大數除以一位正整數的具體實施過程
- 執行除法的過程中特殊情況的處理
由于A 是不超過 1000 位的正整數,是以隻能用數組來存儲A的每一位數字,因為要将大數的每一位存入數組的每一個元素,是以,我們用字元數組接收輸入更友善。當遇到空格時即為大數輸入結束。接下來用c來逐漸實作大數的除法。c先初始化為0,然後将大數從最高位到最低位逐漸賦給c,當c除以b有餘數時,餘數作為c下一次的十位,大數的下一位作為c下一次的個位,除第一位和最後一位外,其它餘數為0且下一位小于除數b時商均需補0(此除法過程就是模拟筆算除法的過程,相應的細節可模拟筆算除法了解)。
除了上面除第一位和最後一位外,其它餘數為0且下一位小于除數b時商均需補0這一特殊情況外,還應注意以下兩個特殊情況:
- 測試用例的輸入中有大數的最高幾位均為0的情況(例如00012345),c被指派這幾位時是不能有輸出的,我們用flag來控制即可。
- 測試用例的輸入中有a小于b的情況,此時退出for循環後是沒有輸出的(此時退出for循環後flag為0),在for循環外需要作額外處理(輸出0)。
知識拓展
我們知道在C語言中,所有變量的定義和聲明都必須在函數的開頭處,而且變量定義和聲明的前面不能有任何其它非聲明定義的語句。而在C++中,就沒有這麼嚴格的規定了,隻要在用到變量前對該變量進行定義和聲明就可以,定義和聲明的位置是比較靈活的(比如下面代碼定義變量的位置)。
代碼示例(C/C++)
小提示:請将以下代碼儲存為
.cpp
格式(C++程式)左右滑動代碼可檢視全部内容
#include <cstdio>
#define MAXN 1001
using namespace std;
int main()
{
char a[MAXN];//用字元數組來存輸入的大數
int i = 0;
//輸入大數
do{
a[i] = getchar();
i++;
}while(a[i-1] != ' ');//遇到空格時大數輸入結束,
int b; //由于輸入之後i自增了1,是以判斷時i需減1
scanf("%d",&b);//輸入除數
int c = 0;//c存目前處理的大數的部分
int flag = 0;
for(i = 0; a[i] != ' '; i++){
c += a[i] - '0';
if(c >= b){
printf("%d",c / b);
c %= b;
flag = 1;
}
if(c == 0&&a[i+1] != ' '&&(a[i+1] - '0') < b&&flag){
printf("0");//除第一位和最後一位外,其它餘數為0
} //且下一位小于除數b時均需補0
c *= 10;
}
if(!flag){//如果大數小于b即flag為0也就是上面的for循環沒有輸出,則在此處輸出0
printf("0");
}
int q;
q = c / 10;//循環退出時,餘數多乘了10
printf(" %d\n",q);
return 0;
}