P1048 数字加密
P1048 数字加密
转跳点:🐏
1048 数字加密 (20分)
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
这道题需要考虑的地方很多,比如A、B的长度,如果A长,那么B就得补0,如果B长,那么A就得补0,还有第一位是从个位开始的,如果处理完直接输出的话就会出现答案错误。个人是进行了三次反转才完成的,主要是懒,不想思考啦~动脑子多累腾啊~o(* ̄▽ ̄*)o
AC代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> void reverse(char *str); int main(void) { int LenB, LenA, temp; char strA[100], strB[100], ans[100] = {0}; scanf("%s %s", strA, strB); LenA = strlen(strA); LenB = strlen(strB); //判断AB int Len = LenA > LenB ? LenA : LenB; //反转数组 reverse(strA); reverse(strB); for (int i = 0; i < Len; i++) { //自制补0(つ﹏⊂) int numA = i < LenA ? strA[i] - '0' : 0; int numB = i < LenB ? strB[i] - '0' : 0; if (i % 2 == 0) { //奇数处理 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'; } } else { //偶数处理 int temp = numB - numA; if (temp < 0) { temp += 10; } ans[i] = temp + '0'; } } //反转答案(懒得动脑子) reverse(ans); puts(ans); return 0; } void reverse(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { int temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } }
PTA不易,诸君共勉!
大道五十,天衍四九,人遁其一!