解题思路一:
1.定义一个字符数组map[13]用来存储对13取余后的结果
2.将要输入的数定义为字符数组,这样就方便对位计算,并且分
别计算出两个数组的长度
3.由于题目说明令个位为第一位,所以我们可以从第数组长度
-1位开始计算并计数(分奇偶位),注意让每位字符转换成数字,
方便进行计算
4.最后从结果字符数组中从最后一位开始输出
#include <stdio.h>
#include <string.h>
const char map[13] = { '0','1','2','3','4','5','6','7','8','9','J','Q','K' };
int main()
{
char A[101], B[101], result[101];
scanf("%s %s", A, B);
int count = 0, i=strlen(A)-1, j = strlen(B)-1;
while(i>=0 || j>=0){
int A_i = i>=0?A[i]-'0':0;
int B_j = j>=0?B[j]-'0':0;
if( count%2 == 0 )
result[count++] = (A_i + B_j)%13;
else
result[count++] = (B_j - A_i + 10)%10;
i--, j--;
}
for(int i=count-1; i>=0; i--)
printf("%c", map[result[i]]);
}

解题思路二(参照算法笔记):
对两个整数AB采用字符串的方式读入,然后定义char数组ans来
记录加密的结果。为了让最低位从0号开始(方便两个数组对齐)
我们对两个字符串进行反转。反转完毕后,字符串的最低为就是
原整数的个位。
令len为AB长度的较大值,然后从低位开始遍历字符串,由于字符
串从0开始记录,因此如果当前位i是偶数,则对应题目中的奇数
进行相应的计算。
注意输出前需要把ans反转一下,因为此时字符串低位对应的是
整数的低位。
#include <stdio.h>
#include <string.h>
const int maxn=110;
char A[maxn],B[maxn],ans[maxn]={0};
void reverse(char s[])
{
int len=strlen(s);
for(int i=0;i<len/2;i++)
{
int temp=s[i];
s[i]=s[len-1-i];
s[len-1-i]=temp;
}
}
int main()
{
scanf("%s %s",A,B);
reverse(A);
reverse(B);
int lenA=strlen(A);
int lenB=strlen(B);
int len=lenA>lenB?lenA:lenB;
for(int i=0;i<len;i++)
{
int numA=i<lenA?A[i]-'0':0;
int numB=i<lenB?B[i]-'0':0;
if(i%2==0)
{
int temp=(numB+numA)%13;
if(temp==10)
ans[i]='J';
else if(temp==11)
ans[i]='Q';
else if(temp==12)
ans[i]='K';
else
ans[i]=temp+'0';
}
else
{
int temp=numB-numA;
if(temp<0)
temp+=10;
ans[i]=temp+'0';
}
}
reverse(ans);
puts(ans);
return 0;
}
