#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 条评论

  • @ 2025-2-16 17:36:05

    由于高精度+幂运算容易BOOM(快速幂也试过) 暂时不用高精度,等有解决方法了再说

    👍 2
    • 1

    信息

    ID
    112
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    225
    已通过
    95
    上传者