标签:clu reverse 超过 反转 printf 需要 soft style pause
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
在一行中输出加密后的结果。
1234567 368782971
3695Q8118
解题思路:
(1)首先需要注意的是加密是从低位到高位进行计算的,并且有一个位数多的话,比较短的那一个对应位按0来计算。
(2)处理的时候从最低位开始,将字符串反转比较好处理(字符串反转调用STL中的reverse本地可以,但是PAT的oj编译不通过,所以就写一个reverse方法),然后遍历,逐个位数来判断。需要注意的是循环的i从0开始,所以奇数位和偶数位是相反的。
#include<iostream> #include<cstring> using namespace std; const int MAXN = 102; char A[MAXN], B[MAXN], result[MAXN] = {0}; void reverse(char c[]) { int len = strlen(c); for (int i = 0; i < len / 2; i++) { char temp = c[i]; c[i] = c[len - 1 - i]; c[len - 1 - i] = temp; } } int main() { cin >> A >> B; //将A和B反转,要从低位开始 reverse(A); reverse(B); int maxlen = strlen(A) > strlen(B) ? strlen(A) : strlen(B); for (int i = 0; i < maxlen; i++) { //计算当前A,B位的数字,有某一个的字符长度比较短,填0 int numA = i < strlen(A) ? A[i] - ‘0‘ : 0; int numB = i < strlen(B) ? B[i] - ‘0‘ : 0; //偶数位 if ((i + 1) % 2 == 0) { int c = numB - numA; if (c < 0) c += 10; result[i] = c + ‘0‘; } else { //奇数位 int temp = (numA + numB) % 13; if (temp < 10) { result[i] = temp + ‘0‘; } else if(temp == 10){ result[i] = ‘J‘; } else if (temp == 11) { result[i] = ‘Q‘; } else if (temp == 12) { result[i] = ‘K‘; } } } //将结果反转 reverse(result); printf("%s\n", result); system("pause"); return 0; }
标签:clu reverse 超过 反转 printf 需要 soft style pause
原文地址:https://www.cnblogs.com/syq816/p/12527180.html