顯示具有 質數 標籤的文章。 顯示所有文章
顯示具有 質數 標籤的文章。 顯示所有文章

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;

}