题目:
思路:
将输入数字存储到数组中,然后再将两数对齐,再翻转,从数组头开始遍历,即从数字的个位开始遍历,依据题意进行变换,遍历完后,再进行一次翻转,然后输出结果
注意点:
此题较坑,测试点2、5为数字B长度小于数字A长度的情况,需对数字B在前面补0至与数字A等长,然后再继续换算
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 char words[3] = { 'J','Q','K' }; 7 8 int main() 9 { 10 char A[110], B[100]; 11 12 scanf("%[0-9] %[0-9]", A, B); 13 14 //若B的长度小于A,则对B补0 15 if (strlen(A) > strlen(B)) 16 { 17 //正确读出两数长度 18 int dif = strlen(A) - strlen(B), len_A = strlen(A), len_B = strlen(B); 19 //进行补0 20 for (int i = len_A;i >= 0;i--) 21 { 22 if (i >= dif) B[i] = B[i - dif]; 23 if (i < dif)B[i] = '0'; 24 } 25 } 26 27 //对A、B翻转,由数组把两数字由个位对齐 28 reverse(A, A + strlen(A)); 29 reverse(B, B + strlen(B)); 30 31 //依据题意进行遍历 32 for (int i = 0;i<min(strlen(A),strlen(B));i++) 33 { 34 int num; 35 //奇数位 36 if ((i+1) % 2) 37 { 38 num = ((B[i] - '0') + (A[i] - '0')) % 13; 39 if (num >= 10)B[i] = words[num - 10]; 40 else B[i] = num + '0'; 41 } 42 //偶数位 43 else 44 { 45 num = B[i] - A[i]; 46 if (num < 0)num += 10; 47 48 B[i] = num + '0'; 49 } 50 } 51 52 reverse(B, B + strlen(B)); 53 printf("%s", B); 54 55 return 0; 56 }