記事のディレクトリ
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.アイデアと注意事項
アイデア:
- サンプルにはスペースがあります。入力にcinを使用すると、「pat」のみが入力されるため、出力は33になります。
- 文字列を使用して文字を格納し、最初にすべての文字を小文字に変換してから合計します。
- カウントされる英字数が0の場合、「0」と判断して直接終了します。
- 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;
}
結果: