2 条题解
-
0
题面很好理解,不再赘述。
解题思路
依题知,明文标号为 ,密文标号为 ,密钥标号为 。
我们观察运算 的规则表可以发现,如果我们将 标作 , 标作 , 标作 ,以此类推,那么 。对应的,如果 ,则 。反之,。
密文位数和密钥位数的对应关系是非常显然的,直接用密文的当前位数取模于密钥的总位数就可以得到密钥的当前位数了。
代码
#include<iostream> #include<cstdio> using namespace std; char k[110]; char m[1100]; int ks[110]; char ms; int main() { cin >> k >> m; int j; //预处理密钥 for (j = 0; k[j]; ++j) { ks[j] = (k[j] >= 'a' ? k[j] - 'a' : k[j] - 'A'); } for (int i = 0; m[i]; ++i) { if (m[i] >= 'a') { ms = (m[i] - 'a' - ks[i % j] >= 0 ? m[i] - ks[i % j] : m[i] - ks[i % j] + 26); } else { ms = (m[i] - 'A' - ks[i % j] >= 0 ? m[i] - ks[i % j] : m[i] - ks[i % j] + 26); } printf("%c", ms); } return 0; } -
0
#include <bits/stdc++.h> using namespace std; char a[5600], b[56000]; int main() { scanf("%s", a + 1); scanf("%s", b + 1); int alen = strlen(a + 1), blen = strlen(b + 1); for (int i = 1; i <= alen; i++) { if (a[i] >= 'A' && a[i] <= 'Z') a[i] = a[i] - 'A' + 1; else a[i] = a[i] - 'a' + 1; } for (int i = 1; i <= blen; i++) { int c = a[(i - 1) % alen + 1]; if (b[i] >= 'A' && b[i] <= 'Z') { c = b[i] - 'A' + 1 - c; if (c < 0) c += 26; printf("%c", 'A' + c); } else { c = b[i] - 'a' + 1 - c; if (c < 0) c += 26; printf("%c", 'a' + c); } } printf("\n"); return 0; }
- 1
信息
- ID
- 69
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 47
- 已通过
- 36
- 上传者