1. 程式人生 > >PAT Basic 1057

PAT Basic 1057

先後 baseline ext 二進制表示 %d mes sum urn length

1057 數零壹

給定一串長度不超過 10?5?? 的字符串,本題要求你將其中所有英文字母的序號(字母 a-z 對應序號 1-26,不分大小寫)相加,得到整數 N,然後再分析一下 N 的二進制表示中有多少 0、多少 1。例如給定字符串 PAT (Basic),其字母序號之和為:16+1+20+2+1+19+9+3=71,而 71 的二進制是 1000111,即有 3 個 0、4 個 1。

輸入格式:

輸入在一行中給出長度不超過 10?5??、以回車結束的字符串。

輸出格式:

在一行中先後輸出 0 的個數和 1 的個數,其間以空格分隔。

輸入樣例:

PAT (Basic)

輸出樣例:

3 4

  題解:這道題可以按照字符串讀入,之後得出其N的大小,再將N轉為2進制,在轉換過程中,只需記錄過程中有多少個0和1出現即可,並不需要保存最後的二進制數。

代碼如下:
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 int main(){
 6     string a, b;
 7     int num1 = 0, num0 = 0, k;
 8     long long int sum = 0;
 9     getline( cin,a);
10     for( int i = 0; i < a.length(); i++){
11         if( toupper(a[i]) >= A && toupper(a[i]) <= 
Z){ 12 sum += ( toupper(a[i]) - A + 1); 13 } 14 } 15 while(sum){ 16 k = sum%2; 17 sum /= 2; 18 if( k == 0) 19 num0++; 20 else if( k == 1) 21 num1++; 22 } 23 printf("%d %d",num0,num1); 24 return 0; 25 }


PAT Basic 1057