2015年7月13日 星期一

[C][瘋狂程設][CPE考題20150625] 15C2.UVA10931:Parity


Problem E - Parity

Time Limit: 1 second We define the parity of an integer n as the sum of the bits in binary representation computed modulo two. As an example, the number 21 = 101012 has three 1s in its binary representation so it has parity 3 (mod 2), or 1. In this problem you have to calculate the parity of an integer 1 ≤ I ≤ 2147483647.

Input

Each line of the input has an integer I and the end of the input is indicated by a line where I = 0 that should not be processed.

Output

For each integer I in the inputt you should print a line The parity of B is P (mod 2)., where B is the binary representation of I.

Sample Input

1 2 10 21 0

Sample Output

The parity of 1 is 1 (mod 2).
The parity of 10 is 1 (mod 2).
The parity of 1010 is 2 (mod 2).
The parity of 10101 is 3 (mod 2).

注意事項


1.讀取資料到字元0:


 int input;
 scanf("%d",&input);
 while(input!=0){....}

2.利用 link list 的結構,宣告指標,儲存2進位數字:

 char *data;
 count=0;
 *(data+count)=num%BASE;


3.數字10進位轉2進位,並且將結果儲存到data:


while(num>0){
 int i=num%BASE;
 *(data+count)=num%BASE;
 count++;
 num = num/BASE;
}

並且輸出結果:
for(int j=count-1;j>=0;j--){
 printf("%d",*(data+j));
}

4.計算parity位數:

 (i==1) ? (parity+=1) : (parity+=0);

Code:

#include <stdio.h>

#define BASE 2

int main(void){

 int input,num,parity,count;
 char *data;

 scanf("%d",&input);

 while(input!=0){
 
  count=0;
  parity=0;
  num=input;
  
  while(num>0){
   int i=num%BASE;
   *(data+count)=num%BASE;
   count++;
   (i==1) ? (parity+=1) : (parity+=0);
   num = num/BASE;
  }

  printf("The parity of ");  
  for(int j=count-1;j>=0;j--){
   printf("%d",*(data+j));
  }
  
  printf(" is %d (mod %d).\n",parity,BASE);
  scanf("%d",&input);
 }

 return 0;
}



[2015/07/20][update]利用Arithmetic shift算術位移的方式改寫]


1.取出最右邊的bit:利用位元運算子'&'

  bit = 01 & num; //get the rightest bit.

2.將原數字除以2:利用位元運算子 right shift右移'>>'

  num >>= 1; // num divided by 2

3.將原數字轉成二進位的數字

從link list的1號位置開始,逐一存放每個bit的值,若有8個bits,則存放在第1號到第8號位置。(第0號位置空下來)
實作方法:用count來計算位置,注意count的起始值、以及count++的順序擺放、列印二進位數值時for loop的起點與終點寫法。
 int input,num,bit,parity,count;
 int *binary;
 
  num=input;
  bit=parity=count=0;
  
  printf("The parity of ");
  while(num>0){
   bit = 01 & num;
   parity += bit;
   count++;
   *(binary+count)=bit;
   num >>= 1;
  }
  
  for(int i=count;i>0;i--)
   printf("%d",*(binary+i));
   
  printf(" is %d (mod 2).\n",parity);

4.讀取資料的中止條件:

讀取資料直到尾端:while(scanf("%d",&input)!=EOF){...}
若讀取到的數值為0,則使用"break;"跳出 while loop,接著來到 return 0; 程式終止。
 while(scanf("%d",&input)!=EOF){
 
  if(input==0)
   break;
               ......
 }
        return 0;

Code:

#include <stdio.h>

int main(void){
 
 int input,num,bit,parity,count;
 int *binary;
 
 while(scanf("%d",&input)!=EOF){
 
  if(input==0)
   break;
   
  num=input;
  bit=parity=count=0;
  
  printf("The parity of ");
  while(num>0){
   bit = 01 & num; //get the rightest bit.
   parity += bit; // calculate the parity.
   count++;
   *(binary+count)=bit;
   num >>= 1; // num divided by 2
  }
  
  for(int i=count;i>0;i--)
   printf("%d",*(binary+i));
   
  printf(" is %d (mod 2).\n",parity);
 }
 
 return 0;
}

[C][瘋狂程設[02_變數與型別] M90H010:2^x個位數疊加

題目:

(M90H010) 2^x個位數疊加 : 輸入一整數n,計算 21+22+23+24+...+2n之個位數。

輸入:

90

輸出:

6

#include <stdio.h>

int main(){

 int index,i=1,sum=0;

 scanf("%d",&index);

 while(i<=index){
  switch(i%4){
   case 1:
    sum+=2;
    break;
   case 2:
    sum+=4;
    break;
   case 3:
    sum+=8;
    break;
   default:
    sum+=6;
  }
  i++;
 }
 printf("%d",sum%10);
 return 0;
}

[C][瘋狂程設][01_變數與型別] F020計算BMI

題目:

輸入身高(公尺)及體重(公斤),計算BMI=體重/身高平方,
若BMI< 18.5 則輸出"too thin"
若 18.5<=BMI<24 則輸出 "standard"
若 BMI>=24 則輸出 "too fat"

輸入:

240

輸出:

10↵\r\n
too thin

注意事項:

1.求次方使用函數

  pow(int 底數,float 指數),回傳值為double
  #include <math.h>

  example:input:10^2,output:100 
  pow(10,2)=100

2.浮點數顯示
去除小數點後面的0:使用%g
printf("%g",bmi);
顯示兩位整數以及四位小數:
printf("%2.4f",bmi);


-----

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

#define THIN 18.5
#define FAT 24
#define LEVEL_1 "too thin"
#define LEVEL_2 "standard"
#define LEVEL_3 "too fat"

int main(void){

 float height=0,weight=0,bmi=0;
 
 scanf("%f %f", &height,&weight);
 bmi = weight/pow(height,2);

 printf("%g\n",bmi);
 
 if(bmi<THIN){
  printf("%s",LEVEL_1);
 }else if(bmi>FAT){
  printf("%s",LEVEL_3);
 }else{
  printf("%s",LEVEL_2);
 }
 
 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;

}