本題要求實現一種數字加密方法。首先固定一個加密用正整數A,對任一正整數B,將其每1位數字與A的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加后對13取余——這里用J代表10、Q代表11、K代表12;對偶數位,用B的數字減去A的數字,若結果為負數,則再加10。這里令個位為第1位。
輸入格式:
輸入在一行中依次給出A和B,均為不超過100位的正整數,其間以空格分隔。
輸出格式:
在一行中輸出加密后的結果。
輸入樣例:
1234567 368782971
輸出樣例:
3695Q8118
代碼寫的又多又冗余,需注意的是,當B的長度小於A的長度時B需要前端補零,以及最后一個測試點當B長度小於A長度時,A元素為零需要做特殊處理。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<ctype.h> 5 #include<math.h> 6 int main(){ 7 char a[110]; 8 char b[110]; 9 scanf("%s",a); 10 getchar(); 11 scanf("%s",b); 12 char c[110]; 13 int lena = strlen(a); 14 int lenb = strlen(b); 15 int j; 16 int temp; 17 if(lenb-lena>=0){ 18 for(int i=0;i<lenb-lena;i++){ 19 printf("%c",b[i]); 20 } 21 j = 0; 22 temp = lena; 23 for(int i=lenb-lena;i<lenb;i++){ 24 if((temp--)%2==0){ 25 b[i] = b[i]-a[j]; 26 if(b[i]<0){ 27 b[i] = b[i]+10; 28 } 29 b[i] = b[i]+'0'; 30 } 31 else{ 32 if((b[i]-'0'+a[j]-'0')%13>=10){ 33 if((b[i]-'0'+a[j]-'0')%13==10) 34 b[i] = 'J'; 35 else if((b[i]-'0'+a[j]-'0')%13==11){ 36 b[i] = 'Q'; 37 } 38 else if((b[i]-'0'+a[j]-'0')%13==12){ 39 b[i] = 'K'; 40 } 41 } 42 else{ 43 b[i] = (b[i]-'0'+a[j]-'0')%13+'0'; 44 } 45 46 } 47 j++; 48 printf("%c",b[i]); 49 } 50 } 51 else{ 52 temp = lena; 53 for(int i=0;i<lena-lenb;i++){ 54 if((temp--)%2==0){ 55 if(a[i]!='0') 56 printf("%c",'9'+1-a[i]+'0'); 57 else 58 printf("0"); 59 } 60 else{ 61 printf("%c",a[i]); 62 } 63 } 64 j = lena-lenb; 65 temp = lenb; 66 for(int i=0;i<lenb;i++){ 67 if((temp--)%2==0){ 68 b[i] = b[i]-a[j]; 69 if(b[i]<0){ 70 b[i] = b[i]+10; 71 } 72 b[i] = b[i]+'0'; 73 } 74 else{ 75 if((b[i]-'0'+a[j]-'0')%13>=10){ 76 if((b[i]-'0'+a[j]-'0')%13==10) 77 b[i] = 'J'; 78 else if((b[i]-'0'+a[j]-'0')%13==11){ 79 b[i] = 'Q'; 80 } 81 else if((b[i]-'0'+a[j]-'0')%13==12){ 82 b[i] = 'K'; 83 } 84 } 85 else{ 86 b[i] = (b[i]-'0'+a[j]-'0')%13+'0'; 87 } 88 89 } 90 j++; 91 printf("%c",b[i]); 92 } 93 } 94 95 }