1048.数字加密
2018-08-17 本文已影响3人
yzbkaka
题目描述
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入描述
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出描述
在一行中输出加密后的结果。
输入例子
1234567 368782971
输出例子
3695Q8118
我的代码
#include<stdio.h>
#include<string.h>
int main(){
char a[101],b[101],c[101];
int i,j=0,len1,len2,sum,sum2=0,t=0;
scanf("%s %s",a,b);
len1=strlen(a);
len2=strlen(b);
if(len1<len2){
for(i=len2-1;i>=0;i--){
t++;
if(t%2!=0){
if(i>=len2-len1){
sum=b[i]-'0'+a[i-(len2-len1)]-'0';
}
else{
sum=b[i]-'0'+0;
}
if(sum%13<10){
c[j]=sum%13+'0';
j++;
}
if(sum%13>=10){
if(sum%13==10){
c[j]='J';
j++;
}
if(sum%13==11){
c[j]='Q';
j++;
}
if(sum%13==12){
c[j]='K';
j++;
}
}
}
if(t%2==0){
if(i>=len2-len1){
sum2=(b[i]-'0')-(a[i-(len2-len1)]-'0');
}
else{
sum2=b[i]-'0'+0;
}
if(sum2>=0){
c[j]=sum2+'0';
j++;
}
if(sum2<0){
c[j]=(sum2+10)+'0';
j++;
}
}
}
}
if(len1>len2){
for(i=len1-1;i>=0;i--){
t++;
if(t%2!=0){
if(i>=len1-len2){
sum=a[i]-'0'+b[i-(len1-len2)]-'0';
}
else{
sum=a[i]-'0'+0;
}
if(sum%13<10){
c[j]=sum%13+'0';
j++;
}
if(sum%13>=10){
if(sum%13==10){
c[j]='J';
j++;
}
if(sum%13==11){
c[j]='Q';
j++;
}
if(sum%13==12){
c[j]='K';
j++;
}
}
}
if(t%2==0){
if(i>=len1-len2){
sum2=(b[i-(len1-len2)]-'0')-(a[i]-'0');
}
else{
sum2=a[i]-'0'+0;
}
if(sum2>=0){
c[j]=sum2+'0';
j++;
}
if(sum2<0){
c[j]=(sum2+10)+'0';
j++;
}
}
}
}
if(len1==len2){
for(i=len1-1;i>=0;i--){
t++;
if(t%2!=0){
sum=a[i]-'0'+b[i]-'0';
if(sum%13<10){
c[j]=sum+'0';
j++;
}
if(sum%13>=10){
if(sum%13==10){
c[j]='J';
j++;
}
if(sum%13==11){
c[j]='Q';
j++;
}
if(sum%13==12){
c[j]='K';
j++;
}
}
}
if(t%2==0){
sum2=(b[i]-'0')-(a[i]-'0');
if(sum2>=0){
c[j]=sum2+'0';
j++;
}
if(sum2<0){
c[j]=sum2+10+'0';
j++;
}
}
}
}
for(i=j-1;i>=0;i--){
printf("%c",c[i]);
}
return 0;
}
我的分析
其实这道题不算是特别难,主要就是要耐心,把情况都分清楚。我的思路是:1)如果A的长度小于B的长度,则在判断的时候主要是用B来,再细分为奇数偶数,然后在各自按照题目要求来细分。2)如果A的长度大于B的长度,那么循环主要是根据A来进行,分情况是和第一种一样的。3)如果A的长度等于B的长度,这是最简单以一种情况,直接按照题目要求进行判断就行了。