PAT:B1048 数字加密(20 分)
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
代码:
C/C++:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
void reverse(char s[]) {
int len = strlen(s);
for(int i = 0; i < len/2; i++) {
swap(s[i], s[len-1-i]);
}
}
int main() {
char A[110], B[110], temp[110] = {0};
scanf("%s %s", A, B);
reverse(A);
reverse(B);
int len1 = strlen(A);
int len2 = strlen(B);
int len = len1 > len2 ? len1 : len2;
int a, b;
int k = 0;
char X[13] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};
for(int i = 0; i <len; i++) {
a = i < len1 ? A[i] - '0' : 0;
b = i < len2 ? B[i] - '0' : 0;
if(i % 2 == 0) {
temp[k++] = X[(b+a)%13];
} else {
int count = 0;
count = b - a;
if(count < 0) count += 10;
temp[k++] = X[count];
}
}
reverse(temp);
puts(temp);
return 0;
}
Java:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str1 = new StringBuffer(in.next()).reverse().toString();
String str2 = new StringBuffer(in.next()).reverse().toString();
int len1 = str1.length(); int len2 = str2.length();
int len = len1 > len2 ? len1 : len2;
int a, b, k = 0;
StringBuffer str3 = new StringBuffer();
String temp = "0123456789JQK";
for(int i = 0; i < len; i++) {
a = i < len1 ? str1.charAt(i) - '0' : 0;
b = i < len2 ? str2.charAt(i) - '0' : 0;
if (i % 2 == 0) {
str3.append(temp.charAt((a+b)%13));
} else {
int count = b - a;
if (count < 0) {
count += 10;
}
str3.append(temp.charAt(count));
}
}
String str4 = str3.reverse().toString();
System.out.print(str4);
}
}