1. 程式人生 > 實用技巧 >PAT A1024 Palindromic Number

PAT A1024 Palindromic Number

題意:迴文字,對輸入數值進行判斷,若不是迴文,則反轉相加繼續。

分析:數值1010,再迭代相加100次,大概達到1040級;long long型也不足以表示,需要使用字元型處理。使用字串的轉化為大數陣列處理。
注意:大數運算是唯一long long也無法處理的資料大小,結果輸出處需要迭代輸出

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

using namespace std;
const int N =1000;//最大位數

struct bign{
    int value[N];
    int len;
    bign(){
        memset(value,0,sizeof(value));
        len = 0;
    }
};

bign change(char s[]){
    bign a;
    a.len = strlen(s);
    for(int i=0;i<a.len;i++){
        a.value[i] = s[a.len-1-i]-'0';//逆序儲存
    }
    return a;
}

bool ispal(bign a){
    for(int i=0;i<=(int)(a.len/2);i++){//取了是因為a.len = 1的情況
        if(a.value[i] != a.value[a.len-1-i]) return false;
    }
    return true;
}

bign add(bign a){
    bign b;
    int temp=0;//進位
    b.len = a.len;
    for(int i=0;i < b.len;i++){
        temp += a.value[i]+a.value[a.len-1-i];
        b.value[i] = temp%10;//餘數為該位的值
        temp /= 10;//進位
    }
    if(temp!=0){//仍有進位
        b.value[b.len] = temp;
        b.len++;
    }
    return b;
}
int main(){
    char s[N];
    int k;
    scanf("%s %d",s,&k);
    bign a = change(s);
    int c = 0;
    for(int i = 0; i < k ; i++){//處理c次,c<=k
        if(ispal(a) == true)
            break;
        else{
            a = add(a);
            c++;
        }
    }
    for(int j=0;j<a.len;j++){
        printf("%d",a.value[a.len-1-j]);
    }
    printf("\n");
    printf("%d",c);
    return 0;
}