- 【例2.2】你好世界
锚点3
- 2025-2-16 17:22:59 @
#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
long long prime[10005]; // 减少了数组大小以匹配实际需要的素数数量
void SieveOfEratosthenes(int n) {
int cnt = 0;
vector<bool> isPrime(n + 1, true);
for (int p = 2; p <= n; ++p) {
if (isPrime[p]) {
prime[cnt++] = p;
for (int i = p * p; i <= n; i += p)
isPrime[i] = false;
}
}
}
// 快速幂函数,用于替换pow()以提高性能
unsigned long long fastPow(unsigned long long base, unsigned long long exp) {
long long result = 1;
while (exp > 0) {
if (exp & 1)
result = result * base;
exp >>= 1;
base = base * base;
}
return result;
}
unsigned long long cnt1, cnt2, j;
string s;
int main() {
SieveOfEratosthenes(10000); // 根据需求调整了素数范围
while (true) {
system("cls");
j = 0;
printf("请输入字符串(输入空字符串将自动退出):");
getline(cin, s);
if (s == "") {
break;
}
cnt1 = 0, cnt2 = 0;
for (int i = 0; i < s.size(); i++) {
// 使用快速幂函数替代pow()
if (s[i] - '0' >= 0 && s[i] - '0' <= 9) {
cnt1 += unsigned long long(fastPow(s[i] - '0', prime[j]));
cnt2 += s[i] - '0';
}
else {
cnt1 += unsigned long long(fastPow(int(s[i]) % 10, prime[j]));//默认用ASCII,否则会用系统默认的编码方式
cnt2 += unsigned long long(fastPow(int(s[i]) / 10, prime[j]));//同理
}
if (i != 0 && s[i] != s[i - 1]) {
j++;
}
}
printf("校验码:0x%llX\n", cnt1 % cnt2); // 使用十六进制输出
system("pause");
}
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
1 条评论
-
方均宸 LV 10 @ 2025-2-16 17:36:05
由于高精度+幂运算容易BOOM(快速幂也试过) 暂时不用高精度,等有解决方法了再说
👍 2
- 1
信息
- ID
- 112
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 225
- 已通过
- 95
- 上传者