天天看點

PAT乙級1017 || A除以B(C/C++)A除以B

個人首頁: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;
}

           

繼續閱讀