字符串 | PAT 乙级 1048 数字加密

241 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
}

总结

许一个愿望,明天早点更新,早点睡觉
现在真的好难受呀