這題可以利用大數運算的加法來做,在做大數運算時,用來儲存的字串陣列,index 0 ,
從個位數開始存,這樣遇到進位的時候,可以很容易地往陣列的後面多一個數字。
這個儲存方法可以適用於加法、減法、乘法。
ex: 195 +9230
795 -> 597
9230 -> 0329
597
+0329
_______
52001
從上面可以看到,位數直接對齊,增加的位數直接擺放到下一個位置。
這題用大數運算,所以一開始先把讀到的數字字串反轉。
相加的時候,再把數字字串複製的暫存陣列,把暫存陣列反轉,就可以相加了。
因為題目確定有最後會得到 palindrome,所以輸出時,直接輸出即可,不用再反轉。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int palindrome(char num[]){
int i,j,ok;
for(i=0,j=strlen(num)-1,ok=1;i<=(strlen(num)-1)/2;i++,j--){
if(num[i]!=num[j]){
ok=0; break;
}
}
return ok;
}
void reverChar(char num[]){
char tmp[20]={0};
int i,j;
strcpy(tmp,num);
for(i=0,j=strlen(tmp)-1;j>=0;j--,i++){
num[i]=tmp[j];
}
num[i]=0;
return;
}
void add(char num1[], char num2[]){
int i,carry=0,sum;
for(i=0;i<=strlen(num1)-1;i++){
sum=num1[i]-'0' + num2[i]-'0' + carry;
if( sum > 9 ){ carry=1; sum%=10;}
else carry=0;
num1[i]=sum+'0';
}
if(carry==1)num1[i]=1+'0';
num1[i+1]='\0';
return;
}
int main(void){
int amount,counter;
char num1[20],num2[20];
scanf("%d",&amount);
while(1){
amount--;
scanf("%s",&num1);
reverChar(num1);
counter=0;
while(1){
if(palindrome(num1) == 1) break;
++counter;
strcpy(num2,num1);
reverChar(num2);
add(num1,num2);
}
printf("%d %s\n",counter,num1);
if(amount==0)break;
}
return 0;
}
沒有留言:
張貼留言