1048. 数字加密(20)
本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。
输入格式:
输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:1234567 368782971输出样例:
3695Q8118
分析:
这是一道!神坑题!没学过密码学的同学基本可以和通过说再见了······
坑在于:B如果位数小于A,要在前面补0····太坑爹了···调试了好久好久!
using System; namespace PAT { class Program { static void Main() { string[] numbers = Console.ReadLine().Split(' '); string numA = numbers[0]; string numB = numbers[1]; int lengthA = numA.Length; int lengthB = numB.Length; if(lengthB < lengthA) { int diff = lengthA - lengthB; string temp = ""; for (int j = 0; j < diff; j++) temp += "0"; numB = temp + numB; lengthB = numB.Length; } char[] newNumber = new char[lengthB]; int chA, chB; int rest; int i; for(i = 1; i <= lengthB && lengthA - i >= 0; i++) { chA = numA[lengthA - i] - '0'; chB = numB[lengthB - i] - '0'; if(i % 2 == 1) { rest = (chA + chB) % 13; if (rest == 10) newNumber[lengthB - i] = 'J'; else if (rest == 11) newNumber[lengthB - i] = 'Q'; else if( rest == 12) newNumber[lengthB - i] = 'K'; else newNumber[lengthB - i] = (char)(rest + '0'); } else { rest = chB - chA; if(rest < 0) rest = rest + 10; newNumber[lengthB - i] = (char)(rest + '0'); } } for (; i <= lengthB; i++) newNumber[lengthB - i] = numB[lengthB - i]; foreach (char ch in newNumber) Console.Write(ch); } } }