1048. 数字加密(20)

来源:互联网 发布:淘宝拉帮结派在哪使用 编辑:程序博客网 时间:2024/06/06 00:47

题目链接

题目:

本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。

输入格式:

输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:
1234567 368782971
输出样例:
3695Q8118

题解:

PAT的测试数据真滴是诡异。这么简单的题,错了两个数据点。= =不想继续浪费时间了。贴一个以前写的正确的代码

代码:

#include <cstdio>//以前的AC代码#include <cstring>const int max = 110;char a[max], b[max], ans[max] = {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 - i - 1];str[len - 1 - i] = temp;}}int main(){scanf("%s %s", a, b);reverse(a);reverse(b);int la = strlen(a);int lb = strlen(b);int i, numa, numb;for(i = 0; i < la || i < lb; i++){numa = i < la ? a[i] - '0' : 0;numb = i < lb ? b[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';elseans[i] = temp + '0';}else{int temp = (numb - numa + 10) % 10;ans[i] = temp + '0';}}reverse(ans);puts(ans);return 0;}
#include <cstdio>//有两组测试点错误的代码,至今原因不明#include <cstring>void transfer(char s[]){int len = strlen(s);for(int i = 0; i < len / 2; i++){char c = s[i];s[i] = s[len - 1 - i];s[len - 1 - i] = c;}}int main(){char s[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K' };char A[110], B[110];scanf("%s %s", A, B);transfer(A);transfer(B);int La = strlen(A);int Lb = strlen(B);int L = La > Lb ? Lb : La;int flag = 1;for(int i = 0; i < L; i++){if(flag == 1){B[i] = s[(B[i] - '0' + A[i] - '0') % 13];flag = 0;}else{B[i] = s[(B[i] - A[i] + 10) % 10];flag = 1;}}for (int i = Lb - 1; i >= 0; i--)printf("%c", B[i]);return 0;}




原创粉丝点击