1048. 數字加密(20) PAT乙級真題
阿新 • • 發佈:2019-01-27
1048. 數字加密(20)
本題要求實現一種數字加密方法。首先固定一個加密用正整數A,對任一正整數B,將其每1位數字與A的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對13取餘——這裡用J代表10、Q代表11、K代表12;對偶數位,用B的數字減去A的數字,若結果為負數,則再加10。這裡令個位為第1位。
輸入格式:
輸入在一行中依次給出A和B,均為不超過100位的正整數,其間以空格分隔。
輸出格式:
在一行中輸出加密後的結果。
輸入樣例:1234567 368782971
輸出樣例:
3695Q8118
這道題一看到100位的正整數第一反應就應該是用字串。然而它這裡令個位為第1位,我們對這種一位位對應的字元處理又習慣從左邊開始,所以我用了一個函式去使字串顛倒過來。中間的過程就是按照題意模擬,我們需要在模擬的過程中注意的一點是A和B的位數可能不一樣,因為我們把數字顛倒過來了,所以少的位數應該用0補上。下面是我的程式碼:#include<stdio.h> #include<string.h> void Chuli(char a[]); void Xiangjia(char a[],char b[]); int main(void) { char a[101]={'0'},b[101]={'0'}; int i=0,j; do { scanf("%c",&a[i]); i++; }while(a[i-1]!=' '); a[i-1]='\0';i=0; do { scanf("%c",&b[i]); i++; }while(b[i-1]!='\n'); b[i-1]='\0'; Chuli(a);Chuli(b); Xiangjia(a,b); Chuli(b); puts(b); return 0; } /* 將數字顛倒過來 */ void Chuli(char a[]) { char m[101]; int s,i=0; s=strlen(a); for (;i < s/2;i++) { a[i]=a[i]+ a[s-i-1]; a[s-i-1]=a[i]- a[s-i-1]; a[i]=a[i]- a[s-i-1]; } } void Xiangjia(char a[],char b[]) { int i=0,c; do { if ( (a[i]<'0') || (a[i] >'9') ) a[i]='0'; if ( (b[i]<'0') || (b[i] >'9') ) b[i]='0'; c=a[i]-48; if (i%2==0) //奇數位 { c=(c+b[i]-48)%13; if (c==10) b[i]='J'; else if (c==11) b[i]='Q'; else if (c==12) b[i]='K'; else b[i]=c+48; } else //偶數位 { c=b[i]-48-c; if (c<0) c+=10; b[i]=c+48; } i++; }while((b[i]!='\0')||(a[i]!='\0')); }