1. 程式人生 > 實用技巧 >PAT A1023 Have Fun with Numbers

PAT A1023 Have Fun with Numbers

這一道大數乘法問題,要注意輸入是按照字串進行讀入並且為了滿足大小位關係採用逆序轉換
要注意陣列的意義以及迴圈結構和判斷結構的邊界
程式碼如下:

#include<cstdio>
#include<string.h>

using namespace std;

const int N = 30;
struct bign{
    int k[N];
    int len;
    bign(){
        memset(k,0,sizeof(k));
        len = 0;
    };
};
int flag[10];//初值全為0
bign change(char s[]){
    bign a;
    a.len = strlen(s);
    for(int i = 0;i<a.len;i++){
        a.k[i] = s[a.len-1-i] - '0';//逆序賦值
    }
    return a;
}
bign doublemulit(bign a){
    bign b;
    int temp=0;
    for(int i = 0;i<a.len;i++){
        temp += a.k[i]*2;
        b.k[i] = temp%10;//餘數
        temp /=10;//進位
        b.len++;
    }
    while(temp!=0){//處理超位情況
        b.k[b.len] = temp%10;
        temp /= 10;
        b.len++;
    }
    return b;
}

int main(){
    char s1[N];
    scanf("%s",s1);
    bign a = change(s1);
    for(int i = 0;i<a.len;i++){
        flag[a.k[i]]++;
    }
    bign b = doublemulit(a);
    bool flagi=true;
 
     for(int i = 0;i<b.len;i++){
            if(flag[b.k[i]]<=0){
                printf("No");
                flagi = false;
                break;
            }else{
                flag[b.k[i]]--;
            }
     }
     if(flagi==true) printf("Yes");
    
    printf("\n");
    for(int i = b.len-1;i>=0;i--){
        printf("%1d",b.k[i]);
    }
    return 0;
}