1. 程式人生 > >1057 數零壹——c實現

1057 數零壹——c實現

1057 數零壹 (20 分)

給定一串長度不超過 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

思路:

這道題的思路很明確:

  1. 儲存陣列;
  2. 全部轉化為小寫;
  3. 統計a~z字母之和;
  4. 轉化為2進位制,統計0和1的位數;

注意:當a~z字母之和為0時的特殊性,可能會導致0和1數的位數部隊。因此判斷之前需要先判斷sum!=0,才可以進行轉換。

程式碼:

//1057 數零壹v1
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
	char str[100005]={0},str1[100005]={0},c;
	int i=0,cnt_0=0,cnt_1=0;
	long long int sum=0; 
//	fgets(str,100005,stdin);    //也可以用這句程式碼代替下面一行,都可以一次讀入一行使用者輸入
	while((c=getchar())!='\n')  str[i++]=c;
	for(i=0;i<strlen(str);i++){
		str1[i]=tolower(str[i]);
		if(isalpha(str1[i]))	sum+=(str1[i]-'a'+1); 
	}	
	if(sum){
		while(sum/2)	//	sum/2!=0
		{
			if(sum%2==0)	cnt_0++;
			if(sum%2==1)	cnt_1++;
			sum/=2;
		}
		cnt_1++;
	}
	printf("%d %d",cnt_0,cnt_1);
	
}