PAT A1015 Reversible Primes (20分) [素數 質數 進位制轉換]
阿新 • • 發佈:2020-07-19
題目
題目連結
已知一個十進位制數n,和基數m,判斷 n是否為質數;且n轉換為m進位制並反轉後對應的十進位制數是否為質數
解題思路
1 質數判斷
2 進位制轉換
易錯點
1 輸入的不一定為質數,題目要求判斷兩個內容: n是否為質數;n轉換為m進位制並反轉後對應的十進位制數是否為質數
2 m<=10,所以十進位制進行轉換後,一定不會出現字母
程式碼
Code 01
#include <iostream> #include <cstring> #include <cmath> #include <algorithm> using namespace std; /* 1 進位制轉換 2 質數判別 */ // 十進位制轉換到其他進位制 - 10進位制以內 string convert(int x,int r) { string y; int temp; do { temp=x%r; //題目已知temp一定小於10 if(temp>=10)y+=temp-10+'A'; else y+=temp+'0'; x/=r; } while(x!=0); return y;//不需反轉,因為題目中就是求反轉後是否是質數 } // 其他進位制轉十進位制 int r_convert(string y, int r) { int index =0,sum=0,temp; for(int i=y.length()-1; i>=0; i--) { temp = isdigit(y[i])?y[i]-'0':y[i]-'A'+10; sum+=temp%10*pow(r,index++); } return sum; } // 素數判別 bool isPrime(int x){ if(x<=1)return false; int sqr = (int)sqrt(1.0*x); for(int i=2;i<=sqr;i++){ if(x%i==0)return false; } return true; } int main(int argc,char * argv[]) { int n,d; while(1) { scanf("%d",&n); if(n<0)break; scanf("%d",&d); if(!isPrime(n)){ printf("No\n"); continue; } int temp = r_convert(convert(n,d),d); if(isPrime(temp))printf("Yes\n"); else printf("No\n"); } return 0; }
Code 02
#include <iostream> #include <algorithm> #include <cmath> using namespace std; bool isPrime(int n) { if(n<=1)return false; int sqr=(int)sqrt(1.0*n); for(int i=2; i<=sqr; i++) { if(n%i==0)return false; } return true; } int main(int argc, char * argv[]) { int n,radix; while(scanf("%d",&n)!=EOF) { if(n<0)break; scanf("%d",&radix); if(isPrime(n)==false){ printf("No\n"); continue; } // 進位制轉換 int index=0,d[111]={0}; do{ d[index++]=n%radix; n/=radix; } while(n!=0); for(int i=0;i<index;i++){ n=n*radix+d[i]; } if(isPrime(n))printf("Yes\n"); else printf("No\n"); } return 0; }