天天看點

1048 數字加密 (20分) - PAT (Basic Level) Practice(中文)

本題要求實作一種數字加密方法。首先固定一個加密用正整數 A,對任一正整數 B,将其每 1 位數字與 A 的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對 13 取餘——這裡用 J 代表 10、Q 代表 11、K 代表 12;對偶數位,用 B 的數字減去 A 的數字,若結果為負數,則再加 10。這裡令個位為第 1 位。

輸入格式:

輸入在一行中依次給出 A 和 B,均為不超過 100 位的正整數,其間以空格分隔。

輸出格式:

在一行中輸出加密後的結果。

輸入樣例:

1234567 368782971
           

輸出樣例:

3695Q8118
           

-代碼如下 

#include <cstdio>
#include <vector>
using namespace std;

//int a[100], b[100];
vector<int> a(100), b(100);
int main()
{
	int temp, i = 0, len_a = 0, len_b = 0;
	while ((temp = getchar()) != 32) { //當讀到空格的時候 退出循環 
		a[i++] = temp - 48;
	}
	len_a = i;

	i = 0;
	while (scanf("%1d", &temp) != EOF) { //當讀到檔案尾的時候 退出循環 
		b[i++] = temp;
	}
	len_b = i;
	
	int len = len_a;
	if (len_b > len_a) {
		len = len_b;
		a.insert(a.begin(), len_b - len_a, 0);
	} else if (len_a > len_b) {
		len = len_a;
		b.insert(b.begin(), len_a - len_b, 0);
	}
	
	//flag用來 輔助表示目前準備輸出的是第偶數位 還是 奇數位 
	//為 1 表示 先是偶數位,為 0 表示 先是奇數位 
	int flag = (len % 2 == 0 ? 1 : 0); 
	for (i = 0; i < len; i++)
	{
		if (flag) { //當為 偶數位 
			int t = b[i] - a[i];
			if (t < 0) {
				t += 10;
			}
			printf("%d", t);
			flag = 0;
		}
		else { //當為 奇數位  
			int t = (b[i] + a[i]) % 13;
			if (t > 9) {
				switch (t) {
				case 10: printf("J"); break;
				case 11: printf("Q"); break;
				case 12: printf("K"); break;
				}
			}
			else {
				printf("%d", t);
			}
			flag = 1;
		}
			
	}

	return 0;
}
           

結果

1048 數字加密 (20分) - PAT (Basic Level) Practice(中文)

繼續閱讀