2017年6月12日 星期一

CPE 033 UVa10235-Simply Emirp


題目原文
題目內容
一個比 1 大的整數如果只有 1 和他本身自己共 2 個因數,我們稱這個數為質數(prime number)。多年來質數一直被數學家們研究著。質數也常被應用在密碼學和編碼理論中。
那麼你曾經把質數倒轉過來嗎?對大部分的質數來說,你將會得到一個組合數(例如:43 變成 34)現在,我們要定義 Emirp(就是把 Prime 反過來拼):如果你把一個質數反過來之後,他仍然是一個質數,並且和原來那個質數不同,那我們就稱這個數為 emirp number。例如:17 是一個emirp,因為 17 和 71 都是質數。在這個問題中,你必須要決定某一個整數 N 是非質數,質數,或 emirp。你可以假設 1<N<1000000。

輸入說明:
輸入的每一行測試資料有 1 個整數 N

輸出說明:
對每一輸入 N,輸出以下的訊息:
1. "N is not prime.",如果 N 不是一個質數
2. "N is prime.",如果 N 是一個質數,但是不是一個 Emirp

3. "N is emirp.",如果 N 是一個 emirp


Sample Input

17
18
19
179
199
131


Sample Output

17 is emirp.
18 is not prime.
19 is prime.
179 is emirp.
199 is emirp.
131 is prime.


解法
首先2這個數,是一個很特別的數,他是唯一是偶數的質數,所以要獨立出來特地為它設一個條件判斷,接下來想辦法把數字反轉,最後在一直取二的餘數看他是不是質數就好,反質數也只是多了一個把數字前後顛倒的步驟而已。


(以上資料來源:大學程式能力檢定Collegiate Programming Examination(CPE),Lucky 貓)




程式碼解答





#include <stdio.h>
int isprime(int n)//專門判斷是否為質數用的
{
 int k;
 for(k=2; k<n; k++)
  if(n%k==0) break;
  
 return k==n;
}
int main()
{
 int n, n1, n2;
 while(scanf("%d", &n)!=EOF)
 {
  if(isprime(n))//第一先判斷這個值本身是不是質數
  {
   n1=n;
   n2=0;
   while(n1)//交換數字的位置
   {
    n2=n2*10+n1%10;
    n1/=10;
   }
  if(n2!=n && isprime(n2))//如果交換完還是質數且跟交換前的數字不一樣的話
   printf("%d is emirp.\n", n);
  else //只符合一開始是質數
   printf("%d is prime.\n", n);
  }
  else printf("%d is not prime.\n", n);
 }
}

程式碼打包:解法一解法二

沒有留言:

張貼留言