一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
思路分析
非常奇怪的一个地方,我要是不把A,B字符串反转过来,根本无法全对
就是不逆序处理,往不足的前面补0,然后再从末尾一位一位往前数,但是这样会错
目前我正确的思路是把字符串A,B反转过来,然后再找出长度更长的那一串字符串,把长度短的后面补0,因为这题有坑,如果B比较短的话,遍历完B之后,还要继续遍历,直到把A也遍历完
然后就是一位一位的加密。
若结果为负数,则再加 10,比起用
if(B[i]-A[i]<0)
C+=B[i]-A[i]+10+'0';
else C+=B[i]-A[i]+'0';
显然下面的语句更为简洁,
C+=(B[i]-A[i]+10)%10+'0'
值得一提的是对应位的数字相加后对 13 取余时,(A[i]+B[i]-'0'-'0')%13,要减去两次'0',(因为有两个字符)开始时我只减了一次,总找不到哪错了
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string A,B,C;
cin>>A>>B;
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
int len=A.size()>B.size()? A.size(): B.size();
if(A.length()<len)
A+=string(len-A.length(),'0');
else
B+=string(len-B.length(),'0');
for(int i=0;i<len;i++)
{
if(i%2==0)
{
int t = (A[i]+B[i]-'0'-'0')%13;
switch(t)
{
case 10: C+='J';break;
case 11: C+='Q';break;
case 12: C+='K';break;
default: C+=t+'0';
}
}
else
C+=(B[i]-A[i]+10)%10+'0';
}
for(int i=C.length()-1;i>=0;i--)
cout<<C[i];
return 0;
}
总结
许一个愿望,明天早点更新,早点睡觉
现在真的好难受呀