顯示具有 prime 標籤的文章。 顯示所有文章
顯示具有 prime 標籤的文章。 顯示所有文章

2015年7月20日 星期一

[C][瘋狂程設][CPE考題20141223] 14G2.UVA10235:Simply Emirp


Problem G: Simply Emirp


An integer greater than 1 is called a prime number if its only positive divisors (factors) are 1 and itself. Prime numbers have been studied over the years by a lot of mathematicians. Applications of prime numbers arise in Cryptography and Coding Theory among others.
Have you tried reversing a prime ? For most primes, you get a composite (43 becomes 34). An Emirp (Prime spelt backwards) is a Prime that gives you a different Prime when its digits are reversed. For example, 17 is Emirp because 17 as well as 71 are Prime. In this problem, you have to decide whether a number N is Non-prime or Prime or Emirp. Assume that 1< N< 1000000.
Interestingly, Emirps are not new to NTU students. We have been boarding 199 and 179 buses for quite a long time!

Input


Input consists of several lines specifying values for N.

Output


For each N given in the input, output should contain one of the following:
    1. "N is not prime.", if N is not a Prime number.
    2. "N is prime.", if N is Prime and N is not Emirp.
    3. "N is emirp.", if N is Emirp.

Sample Input

17
18
19
179
199

Sample Output

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

Notes:


1.判斷是否為質數,若為質數則回傳1,不是質數則回傳0

/*return value: 1=prime, 0=not prime*/
int is_prime(int *n){

 int num,i,result=0;
 num=*n; 
  
 // num == 2: 2 is prime.
 // num >  2: num is even, num is not prime.
 if(num%2==0){
  //printf("**[%d]\n",__LINE__);
  (num==2)?(result=1):(result=0);
  return result;
 }
 
 for(i=3;i*i<=num;i+=2){
  //printf("**[%d]\n",__LINE__);
  if(num%i==0){
   //printf("**[%d]\n",__LINE__);
   result=0;
   return result;
  }
  //printf("**[%d]\n",__LINE__);
 }
 result=1;
 return result;
}


2.整數轉字串、字串反轉、字串轉整數

#include <string.h>
int input,rev_input;
int value;
char temp[7];
char *rev_temp;

value=is_prime(&input);
sprintf(temp,"%d",input);
rev_temp=strrev(temp);
rev_input=atoi(rev_temp);

3.debug專用,顯示行號的標籤"__LINE__"

printf("**[%d]\n",__LINE__);

4.利用兩個三元運算子(條件運算子 conditional operator),化簡三選一的if else

三選一:
  if(value==1)
   printf("%d %s\n",input,PRIME);
  else if(value==2)
   printf("%d %s\n",input,EMIRP);
  else
   printf("%d %s\n",input,NOT_PRIME);
利用兩個條件運算子化簡:
  printf("%d %s\n",input,(value>1)?(EMIRP):((value<1)?NOT_PRIME:PRIME));

Code:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PRIME "is prime."
#define NOT_PRIME "is not prime."
#define EMIRP "is emirp."

/*return value: 1=prime, 0=not prime*/
int is_prime(int *n){

 int num,i,result=0;
 num=*n; 
  
 // num == 2: 2 is prime.
 // num >  2: num is even, num is not prime.
 if(num%2==0){
  (num==2)?(result=1):(result=0);
  return result;
 }
 
 for(i=3;i*i<=num;i+=2){
  if(num%i==0){
   result=0;
   return result;
  }
 }
 result=1;
 return result;
}

int main(void){

 int input,rev_input;
 int value;
 char temp[7];
 char *rev_temp;
 
 while(scanf("%d",&input)!=EOF){

  value=0;  
  value=is_prime(&input);
  sprintf(temp,"%d",input);
 
  if(value>0){
   rev_temp=strrev(temp);
   rev_input=atoi(rev_temp);
   value+=is_prime(&rev_input);
  }
 
  if(value!=0 && input==rev_input)
   value--;
  
  printf("%d %s\n",input,(value>1)?(EMIRP):((value<1)?NOT_PRIME:PRIME));



2015年7月13日 星期一

[C][瘋狂程設][CPE考題20150625] 15C3.UVA406:Prime Cuts

Prime Cuts

A prime number is a counting number ( tex2html_wrap_inline26 ) that is evenly divisible only by 1 and itself. In this problem you are to write a program that will cut some number of prime numbers from the list of prime numbers between (and including) 1 and N. Your program will read in a number N; determine the list of prime numbers between 1 and N; and print the C*2 prime numbers from the center of the list if there are an even number of prime numbers or (C*2)-1 prime numbers from the center of the list if there are an odd number of prime numbers in the list.

Input

Each input set will be on a line by itself and will consist of 2 numbers. The first number ( tex2html_wrap_inline38 ) is the maximum number in the complete list of prime numbers between 1 and N. The second number ( tex2html_wrap_inline42 ) defines the C*2 prime numbers to be printed from the center of the list if the length of the list is even; or the (C*2)-1 numbers to be printed from the center of the list if the length of the list is odd.

Output

For each input set, you should print the number N beginning in column 1 followed by a space, then by the number C, then by a colon (:), and then by the center numbers from the list of prime numbers as defined above. If the size of the center list exceeds the limits of the list of prime numbers between 1 and N, the list of prime numbers between 1 and N (inclusive) should be printed. Each number from the center of the list should be preceded by exactly one blank. Each line of output should be followed by a blank line. Hence, your output should follow the exact format shown in the sample output.

Sample Input

21 2
18 2
18 18
100 7

Sample Output

21 2: 5 7 11↵\r\n
↵\r\n
18 2: 3 5 7 11↵\r\n
↵\r\n
18 18: 1 2 3 5 7 11 13 17↵\r\n
↵\r\n
100 7: 13 17 19 23 29 31 37 41 43 47 53 59 61 67↵\r\n
↵\r\n

注意事項:

1.讀取資料輸入直到結束
 int max,amount;

 while(scanf("%d %d",&max, &amount)!=EOF){
        ...
        }
2.找出範圍內的質數(題目定義質數包含1),並將這些質數存放在array當中
  int prime[max];
  prime[1]=1;
  prime[2]=2;
  count=2;
 
  //find the prime list
  for(int num=3;num<=max;num+=2){
   is_prime=1;
   for(int j=2;j<num;j++){
    if((num%j)==0 && (j!=num)){
     is_prime=0;
     break;
    }
   }
   if(is_prime){
    count++;
    prime[count]=num;
   }
  }
3.找出要需要列印出來的質數的位置:
  if(count%2==0){
   center = count/2;
   start = center-amount+1;
   end = center+amount;
  }else{
   center = count/2+1;
   start = center-amount+1;
   end = center+amount-1;
  
  }
4.若是要列印出來的質數數量超過範圍讀處理方式:
  if(start<=0)start=1;
  if(end>=count)end=count;
5.將題目所需要的質數列印出來:
  for(int k=start;k<=end;k++){
    printf(" %d",prime[k]);
  }

Code:


#include <stdio.h>
#include <math.h>

int main(void){

 int max,amount;

 while(scanf("%d %d",&max, &amount)!=EOF){
 
  int prime[max];
  printf("%d %d:",max,amount);
 
  for(int i=1;i<max;i++){
   prime[i]=0;
  }
  
  int is_prime,count;
  int start,center,end;
 
  prime[1]=1;
  prime[2]=2;
  count=2;
 
  //find the prime list
  for(int num=3;num<=max;num+=2){
   is_prime=1;
   for(int j=2;j<num;j++){
    if((num%j)==0 && (j!=num)){
     is_prime=0;
     break;
    }
   }
   if(is_prime){
    count++;
    prime[count]=num;
   }
  }
  //for(int  l=1;l<=count;l++) printf("%d.%d\n",l,prime[l]);

  //check the how many and the site to print out.
  if(count%2==0){
   center = count/2;
   start = center-amount+1;
   end = center+amount;
  }else{
   center = count/2+1;
   start = center-amount+1;
   end = center+amount-1;
  
  }
  
  //for the exception situations
  if(start<=0)start=1;
  if(end>=count)end=count;
  
  //show the result
  for(int k=start;k<=end;k++){
    printf(" %d",prime[k]);
  }
  //printf(",count=%d,center=%d,start=%d,end=%d",count,center,start,end);
  printf("\n\n");
 }
 
 return 0;
}

2015年7月12日 星期日

[C] 列出1~100的質數並計算質數總和

1.原理: 100 = 10*10,所以只要驗證10以內的質數即可
2.利用常數限定數值範圍
3.計算質數總和



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> 
#define MAX 100
#define MIN 1

int main(void){

     int root=sqrt(MAX);  //sqrt():計算平方根,亦可使用pow(MAX,0.5)

    int prime[root];  //用來存放質因數for檢驗100以內的其他質因數

    int is_prime=1; //bool變數,1表示true,0表示false

     int count,num,i,j,k,l=0,sum=0;





    //create the array of prime,找出10以內的質因數



    prime[0]=2; //先將2放入質因數陣列當中
    count=1; //計算10以內的質因數個數


    for(num=3;num<root;num+=2){ //偶數必為2的倍數,所以檢查奇數即可

         is_prime=1;


        for(i=2;i<num;i++){

           if(num%i==0){

               is_prime=0; //有1與本身之外的其他因數,所以不是質數。

               break;

          }

       }


      if(is_prime){

           prime[count]=num; //抓出作為檢查標準的質因數

           count++;

      }

 }


     //for(j=0;j<count;j++) printf("[%d~%d]:%d is prime (%d)\n",MIN,MAX,prime[j],count);



      //find the prime



     for(j=2;j<=MAX;j++){


          is_prime=1;


          for(k=0;k<count;k++){


              if( j%prime[k]==0 && j!=prime[k] ){ //為了將作為檢查標準的質因數放入

                  is_prime=0;

                  break;

               }


           }


          if(is_prime){

               l++; //計算1~100以內的質數個數

                sum+=j;

               printf("%d.[%d~%d]:%d is prime.\n",l,MIN,MAX,j);

          }

     }



      printf("[%d~%d]:the sum of prime is %d\n",MIN,MAX,sum); 


     system("pause");

     return 0;

}

2015年4月30日 星期四

[php] 列出 1~100 質數並加總


1.原理: 100 = 10*10,所以只要驗證10以內的質因數即可
2.利用常數限定數值範圍
3.計算質數總和

<?php

$number = 0;
$sum = 0;
define("MAX","100");
define("MIN", "1");

echo "This is homework for php done by Anne on April 29.<br/>";

do{
if ( $number > MIN ){
switch ($number){
case 2:
case 3:
case 5:
case 7:
echo $number." is prime <br/>";
$sum += $number;
break;
default:
if( $number % 2 !=0 ){
if ($number % 3 !=0){
if ($number % 5 !=0){
if ($number % 7 !=0){
echo $number." is prime<br/>";
$sum += $number;
}
}
}
}
break;
}
}
$number ++;
}while( $number < MAX);

echo "Sum of the primes =".$sum;
?>