poj 2635 The Embarrassed Cryptographer (同餘定理,篩選法)

鏈接:poj 2635

題意:給定一個大數k,k是兩個大素數的乘積的值,再給定一個int內的數L

      問這兩個大素數中最小的一個是否小於L,如果小於則輸出這個素數。

分析:因爲k達到了10^100,只能用字符串讀入,再轉化爲千進制,用int數組存儲,

      然後枚舉小於L的素數,看是否能被整除,即判斷k%L是否爲0,

      這樣就得先用篩選法求素數打表,但是注意要打表到大於10^6

      關於高精度取餘,就需要用到同餘定理

如 123456%N=(((123%N)*1000%N)+456)%N


#include<stdio.h>
#include<string.h>
#define M 1000100
int a[100],k,b[M+10]={1,1,0},p[M+10],num;
void is_prime()    //篩選法求素數
{
    int i,j;
    num=0;
    for(i=2;i<=M;i++)
        if(b[i]==0){
            p[num++]=i;
            for(j=i+i;j<=M;j+=i)
                b[j]=1;
        }
}
int main()
{
    int i,j,n,m,flag,t;
    char s[110];
    is_prime();
    while(scanf("%s%d",s,&n)){
        m=strlen(s);
        if(s[0]=='0'&&n==0) 
            break;
        memset(a,0,sizeof(a));
        k=0;
        t=m%3;
        for(i=0;i<m;i++){  //轉化爲千進制
            a[k]=a[k]*10+s[i]-'0';
            if((i-t+1)%3==0)
                k++;
        }
        flag=1;
        for(i=0;p[i]<n;i++){ 
            t=0;
            for(j=0;j<k;j++)   //高精度取餘
                t=(1000*t+a[j])%p[i];
            if(!t){
                flag=0;
                break;
            }
        }
        if(flag)
            printf("GOOD\n");
        else
            printf("BAD %d\n",p[i]);
    }
    return 0;
}


發佈了152 篇原創文章 · 獲贊 7 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章