給定一串長度不超過?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
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn = 100010; char str[maxn];int getSum(char s[]){int len = strlen(s);int sum = 0;for(int i = 0; i < len; i++){if(s[i] >= 'a' && s[i] <= 'z') sum += s[i] - 'a' + 1;if(s[i] >= 'A' && s[i] <= 'Z') sum += s[i] - 'A' + 1;}return sum; }void count(int n){int cnt1 = 0,cnt0 = 0;while(n) //如果用do while循環則會出現第三個測試點不過。存疑 {if(n%2==0)cnt0++;else cnt1++;n/=2;}printf("%d %d",cnt0,cnt1); }int main(){//fgets(str,maxn,stdin);//getline(cin,str); cin.getline(str,maxn); int sum = getSum(str);count(sum);return 0; }
//網上看到的,這個輸入模式我比較陌生。侵刪 #include<cstdio> int main(){char ch;int sum = 0;while((ch = getchar()) != '\n'){if(ch >= 'a' && ch <= 'z') sum += ch - 'a' + 1;if(ch >= 'A' && ch <= 'Z') sum += ch - 'A' + 1;}int zero = 0,one = 0;while(sum){if(sum % 2 == 0) zero++;else one++;}printf("%d %d",zero,one);return 0; }
?