本题要求实现一种数字加密方法。首先固定一个加密用正整数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 }