程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj-2635-The Embarrassed Cryptographer

poj-2635-The Embarrassed Cryptographer

編輯:C++入門知識

進制轉化+篩選法求素數。 題意: 給你兩個數m,n;m是兩個素數的乘。如果這兩個素數中最小的那個小於(是小於!!!!)n的話,就輸出BAD 那個數;否則輸出GOOD; 做法: 先用素數篩把小於1100000的素數都找出來。 然後把m轉化為千進制。 對於一個m,把i從2到n遍歷一遍,如果i為素數&&m%i==0,說明m可以整除i; [html]   #include<iostream>   #include<stdio.h>   #include<math.h>   #include<string.h>   using namespace std;   #define Max 1100000   int isp[Max];   void isprim()   {       int i,j;       isp[0]=isp[1]=0;       isp[2]=1;       for(i=3;i<Max;i++)           isp[i]=i%2;       int ns;       ns=(int)sqrt(Max*1.0);       for(i=3;i<=ns;i++)       {           if(isp[i])           {               for(j=i*2;j<Max;j+=i)                   isp[j]=0;           }       }   }   int main()   {       int len,n,i,j,k,ks;       int num,nums;       char str[1000];       isprim();       while(scanf("%s%d%*c",str,&n)&&(!(str[0]=='0'&&n==0)))       {           len=strlen(str);           for(k=2;k<n;k++)           {               if(isp[k]==0)               {                   continue;               }               num=0;               for(i=0;i<len;i+=3)               {                   nums=0;                   ks=1;                   for(j=i;j<i+3&&j<len;j++)                   {                       ks=ks*10;                       nums=nums*10+(str[j]-'0');                   }                   num=num*ks+nums;                   num=num%k;               }            //   printf("num=%d,k=%d\n",num,k);               if(num==0)               {                   printf("BAD %d\n",k);                   break;               }           }           if(k==n)printf("GOOD\n");       }       return 0;   }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved