PAT-B:1057ナンバーゼロワン(20ポイント)



1.トピック

指定された文字列の長さが10 5 10 ^ {5}を超えない1 05の文字列、この質問では、整数Nを取得するためにすべての英字のシリアル番号(文字azは大文字と小文字を問わずシリアル番号1〜26に対応)を追加してから、0の数とその中の数を分析する必要があります。 N1のバイナリ表現。
たとえば、文字列PAT(Basic)が与えられた場合、そのアルファベットの合計は16 + 1 + 20 + 2 + 1 + 19 + 9 + 3 = 71であり、71の2進値は1000111です。つまり、 30と41です。

入力形式:
1行の入力長さが[0、1 0 5] [0,10 ^ {5}]を超えない[ 0 1 05 ]キャリッジリターンで終わる文字列。

出力フォーマット:

スペースで区切って、0の数と1の数を1行に出力します。注:文字列に文字が含まれていない場合、Nは存在しないと見なされ、0と1はありません。

入力サンプル:
PAT(基本)
出力サンプル:
3 4


2.アイデアと注意事項

アイデア:

  1. サンプルにはスペースがあります。入力にcinを使用すると、「pat」のみが入力されるため、出力は33になります。
  2. 文字列を使用して文字を格納し、最初にすべての文字を小文字に変換してから合計します。
  3. カウントされる英字数が0の場合、「0」と判断して直接終了します。
  4. 16進変換用に外部関数が設定されています。この機能、演習の
    1022DベースA + B(20ポイント)言及さています。


3、ACコード

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
string dectobin(int n);
int main()
{
    
    
	int count_0 = 0;    	//统计  0 个数
	int count_1 = 0;		//统计 	1个数
	int count_al = 0;
	int i = 0;
	int sum = 0;
	string str;
	getline(cin, str);

	for (int i = 0; i <str.length(); i++)    		//统计字母字符,跳过非字母字符。
	{
    
    	
		str[i]=tolower(str[i]);
		
		if (isalpha(str[i]))
		{
    
    
			sum = sum + str[i] - 'a' + 1;
			count_al++;
		}
		else 
		{
    
    
			continue;
		}
	}

	if (count_al == 0)								//如果没有字母,直接输0
	{
    
    
		cout << "0 0" << endl;
		return 0;
	}
		str = dectobin(sum);						//字符串转化为二进制
		cout << str << endl;
	for (int i = 0; i < str.length(); i++)			//统计二进制中的 0和1个数
	{
    
    
		if (str[i] == '0')	count_0++;
		if (str[i] == '1')	count_1++;
	}
		cout << count_0 << " " << count_1 << endl;		//输出结果
}


string dectobin(int sum)
{
    
    
		string temp = "";
	while (sum != 0)
	{
    
    
		temp = temp + to_string(sum % 2);
		sum /= 2;
	}
		reverse(temp.begin(), temp.end());
		return temp;
}

結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/SKMIT/article/details/113992169