1048. 数字加密(20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。
输入格式:
输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:1234567 368782971输出样例:
3695Q8118
题目还是挺好懂的,第一次提交没AC,思考之后发现是这个问题:
如果字符串a比b长度短,那么a的前面要补上0;如果b的长度短,那么b的前面要补上0。然后再用0按题目要求计算,这样就AC了。
第一次没AC是我单纯的以为某个字符串长度短,那就把另一个多余的部分输出就行了。
注意是从个位开始计算,所以从尾部遍历两个字符串
#include <iostream>
#include <cstring>
using namespace std;
int main() {
//freopen( "123.txt", "r", stdin );
char a[101], b[101];
char c[101];
cin >> a >> b;
int len_a = strlen( a );
int len_b = strlen( b );
int num;
int i;
for( i = 1; i <= len_a || i <= len_b; i++ ) {
char ch_a;
char ch_b;
//如果某个字符串已经遍历结束,就直接用'0'来计算
if( i > len_a ) {
ch_a = '0';
}
else {
ch_a = a[len_a - i];
}
if( i > len_b ) {
ch_b = '0';
}
else {
ch_b = b[len_b - i];
}
if( i % 2 == 1 ) {
num = ( ( ch_a - '0' ) + ( ch_b - '0' ) ) % 13;
if( num < 10 ) {
c[i] = num + '0';
}
else {
switch( num ) {
case 10: c[i] = 'J'; break;
case 11: c[i] = 'Q'; break;
case 12: c[i] = 'K'; break;
}
}
}
if( i % 2 == 0 ) {
num = ( ch_b - '0' ) - ( ch_a - '0' );
if( num < 0 ) {
num += 10;
}
c[i] = num + '0';
}
}
//倒序输出
for( i--; i >= 1; i-- ) {
cout << c[i];
}
return 0;
}