zoukankan      html  css  js  c++  java
  • POJ2635 The Embarrassed Cryptographer 大数取模

    题意是给定一个大数,这个数是由两个素数相乘得到的,现在问你这个大数的分解是否存在一个素数小于给定的数。由于这个给定的数L小于10^6,所以我们就可以打表到10^6,最好打的大一点(比10^6大的最小的素数即可),这样可以方便跳出循环。

    接下来,对于每一个数,我们直接对其小于L的所有素数进行一次试除,看是否余数为零。这里用到了一个大数取模的运算,一个大数对一个int型的数。过程是这样的,我们可以把一个数(abc...xyz)看作是10*(abc...xy)+z --> 10*(10*(abc...x)+y)+z,一直这样下去,我们在从最里面取模开始即可。

    代码如下:

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #define eps (1e-6)
    #define MAXN 1100000
    using namespace std;
    
    bool p[MAXN+5];
    int rec[90000], idx;
    
    void getprime() {
        idx = -1;
        for (int i = 2; i <= MAXN; ++i) {
            if (!p[i]) {
                rec[++idx] = i;
            }
            for (int j = 0; rec[j]*i <= MAXN; ++j) {
                p[rec[j]*i] = 1;
                if (i % rec[j] == 0) {
                    break;
                }
            }
        }
    }
    
    int Mod(char key[], int L) {
        int len = strlen(key+2), ret = 0, beg = 2;
        if (len % 3 == 1) {
            beg = 0;
        } else if (len % 3 == 2) {
            beg = 1;
        }
        len += 2;
        for (int i = beg; i < len; i+=3) {
            int temp = (key[i]-'0')*100+(key[i+1]-'0')*10+(key[i+2]-'0');
            ret = ((long long)ret*1000 + temp) % L;
        }
        return ret;
    }
    
    int main() {
        getprime();
        int L, ret, flag;
        char key[150] = {'0', '0'};
        while (scanf("%s %d", key+2, &L), (key[2]-'0') | L) {
            flag = 0;
            for (int i = 0; rec[i] < L; ++i) {
                if (Mod(key, rec[i]) == 0) {
                    ret = rec[i];
                    flag = 1;
                    break;
                }
            }
            if (flag) {
                printf("BAD %d\n", ret);
            } else {
                puts("GOOD");
            }
        }
        return 0;    
    }
  • 相关阅读:
    软件项目管理总体流程设计
    Delphi 编译时 提示 Internal error: URW3537 错误
    Oracle OLEDB 的手工分发
    Oracle10g Client的手工分发
    Delphi 处理在字符串截取中避免出现半个汉字
    Oracle ODP.Net 的手工分发
    项目中问题解决杂谈audio
    按钮 stylesheet 字符串;
    pb使用
    web测试和app测试的重点
  • 原文地址:https://www.cnblogs.com/Lyush/p/2682337.html
Copyright © 2011-2022 走看看