PTA:B1048 数字加密。c++

B1048 数字加密

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。

sample input:
1234567 368782971

sample output:
3695Q8118

思路:

  1. 为了方便按位处理,对于两个整数A\B,采用字符串的方式读入
  2. 由于读入的时候最高位在数组的0号位,且题目要求从最低位开始处理且最低位为第一位,所以需要在读入后再把数组重新按照低位在数组低位的方式进行反转,并且从第一位开始
  3. 最终需要处理和输出的字符长度是两个数字中位数最长的那一个
  4. 需要注意的是,由于从1号位开始,所以判断一个数是否处理完毕的条件是>count。
  5. 最后输出的时候也要进行反转输出,先输出数字的高位。
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
 char a[111],b[111];
 cin>>a>>b;
 int lentha=strlen(a);
 int lenthb=strlen(b);
 char ans[111];
 char aa[111],bb[111];
 int counta=0,countb=0;
 for(int i=lentha;i>=0;i--)//反转a,从1号位置开始
 {
  aa[counta]=a[i];
  counta++;
  } 
 for(int i=lenthb;i>=0;i--)
 {
  bb[countb]=b[i];
  countb++;
 }
 counta--;
 countb--;
 int len=max(counta,countb);//两个中大的那个是长度
 for(int i=1;i<=len;i++)//从个位开始
 {
  int numa=0,numb=0;
  if(i<=counta)
   numa=aa[i]-'0';
  else
   numa=0;
  if(i<=countb)
   numb=bb[i]-'0';
  else 
   numb=0;
  if(i%2==1)//奇数位
  {
   int temp=(numa+numb)%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';
   } 
  if(i%2==0)//偶数
  {
   int temp=numb-numa;
   if(temp<0)
       temp+=10;
      ans[i]=temp+'0';
   } 
  } 
 //从高位输出
 for(int i=len;i>0;i--)
 cout<<ans[i];
 return 0;  
}
发布了29 篇原创文章 · 获赞 1 · 访问量 952

猜你喜欢

转载自blog.csdn.net/qq_44654498/article/details/104691257
今日推荐