zoukankan      html  css  js  c++  java
  • POJ2635-The Embarrassed Cryptographer-大整数素因子

    计算一个大整数(10^100)中有没有一个小于L的素因子。这个大整数是两个素数的乘积。其实就是RSA加密。

    做法是把大整数表示成千进位,用数组存储,然后一位一位地取模。

    /*--------------------------------------------------------------------------------------*/
    //        Helica's header 
    //        Second Editions
    //        2015.11.7
    //
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <ctype.h>
    #include <cstdlib>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <set>
    #include <map>
    
    //debug function for a N*M array 
    #define debug_map(N,M,G) printf("
    ");for(int i=0;i<(N);i++)
    {for(int j=0;j<(M);j++){
    printf("%d",G[i][j]);}printf("
    ");}                
    //debug function for int,float,double,etc.
    #define debug_var(X) cout<<#X"="<<X<<endl;
    /*--------------------------------------------------------------------------------------*/
    using namespace std;
    
    int N,M,T,L;
    char save[110];
    int num[110];
    
    const int MAXN = 1000100;
    int prime[MAXN];
    
    void getPrime()
    {
        memset(prime,0,sizeof prime);
        for(int i=2;i<=MAXN;i++)
        {
            if(!prime[i]) prime[++prime[0]] = i;
            for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
            {
                prime[prime[j]*i] = 1;
                if(i%prime[j] == 0) break;
            }
        }
    }
    
    bool mod(int p,int len)
    {
        int r = 0;
        for(int i=len-1;i>=0;i--)
            r = (r*1000 + num[i])%p;
    
        if(!r) return false;
        else return true;
    }
    
    int main()
    {
        getPrime();
    
        while(scanf("%s%d",save,&L) && L)
        {
            int flag = 1;
            int len = strlen(save);
    
            memset(num,0,sizeof num);
    
            for(int i=0;i<len;i++)
            {
                int p = (len+2-i)/3-1;
                num[p] = num[p]*10+(save[i]-'0');
            }
            len = (len+2)/3;
    
            for(int i=1;prime[i]<L;i++)
            {
                int p = prime[i];
                //printf("p=%d
    ",p);
                if(!mod(p,len))
                {
                    printf("BAD %d
    ",p);
                    flag = false;
                    break;
                }
            }
            if(flag) printf("GOOD
    ");
        }
    }
  • 相关阅读:
    Webform Session、Cookies传值,跳转页面方式
    webform 光棒效果,删除操作弹出确定取消窗口
    webform Repeater、地址栏传值、Response
    WebForm 控件
    WebForm 页面传值
    WebForm——IIS服务器、开发方式和简单基础
    身份证件号的验证与更改
    历届试题 带分数
    算法提高 学霸的迷宫
    算法提高 最大乘积
  • 原文地址:https://www.cnblogs.com/helica/p/5170265.html
Copyright © 2011-2022 走看看