pat 1048 数字加密(20)

1048 数字加密(20)(20 分)

本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。

输入格式:

输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:

1234567 368782971

输出样例:

3695Q8118


这题简直超级无敌坑,一般当a长于b时,按理应该将b加密后输出,但这题不是,他要将b前面补0直到和a同长,然后加密。
当 b>a 时,将b多余的部分保留

#include <iostream>
using namespace std;
int main()
{
 string a,b,bbu="";
 int k;
 cin>>a>>b;
 int lena=a.size(),lenb=b.size();
 //如果a比b长 ,要在b前面补0 再加密
 if(lena>lenb)
 {
  int c=lena-lenb;
  for(k=0;k<c;k++)
  {
   bbu+="0";
  } 
 } 
 b=bbu+b;
 int max=lena>lenb?lena:lenb; 
 char *result=new char[max];
 //count用来标记是奇数位还是偶数位 
 int i=lena-1,j=b.size()-1,count=1;
 while(i>=0&&j>=0)
 {
  if((count+1)%2==0)
  {
   int c=(a[i]-'0'+b[j]-'0')%13;
   if(c==10)  
   {
    result[count]='J';
   }
   if(c==11)
   {
    result[count]='Q';
   }  
   if(c==12)  
   {
    result[count]='K';
   }
   if(c<10)
   {
    result[count]=c+'0';
   }
  }
  else
  {
   int d=(b[j]-'0')-(a[i]-'0');
   if(d<0)
   {
    d+=10;
   }
   result[count]=d+'0';
  }
  i--;
  j--;
  count++; 
 }
 while(j>=0)
 {
  result[count++]=b[j];
  j--;
 }
 //count从1开始 
 for(i=count-1;i>0;i--)
 {
  cout<<result[i];
 }
 return 0;
}

  

  

猜你喜欢

转载自www.cnblogs.com/houchen/p/9253072.html
今日推荐