210105|標準1152、1157、1546、2577、10818|C++


1152


1152:単語数

初めての試み


stringタイプを使用してgetline関数でスペースを含む文を受信
でも間違った答えを得た!
例と同じようにうまく動いているのに、なぜか…!!
#include <iostream>
#include <string>
using namespace std;

int main() {
	string sentence;
	getline(cin, sentence);

	int count = 0;
	for (int i = 0; i < sentence.size(); i++) {
		if (sentence[i] == ' ' && i != sentence.size() - 1) {
			if (i != 0)
				count++;
		}
		if (i == sentence.size() - 1)
			count++;
	}
	cout << count;
}

2回目の試み


だからcharタイプで文章を受け入れることにした.cin.getlineを使用して最大10万文字を受信します.しかし、結果は間違っていた.同様に、実行は正常です.
#include <iostream>
#include <cstring>
using namespace std;

int main() {
	char sentence[1000000];
	cin.getline(sentence, 1000000);

	int count = 0;
	for (int i = 0; i < strlen(sentence); i++) {
		if (sentence[i] == ' ' && i != strlen(sentence) - 1) {
			if (i != 0)
				count++;
		}
		if (i == strlen(sentence) - 1)
			count++;
	}
	cout << count;
}

終局


だから私は例外の処理に問題があることに気づいた.
従来の方法は、文字列の最初の部分を無条件に排除してcountを行い、文字列の最後の部分が現れた場合、無条件に単語の終了を判断してcount+1を行う.
まず、文入力が空の場合に0を返し、文字列数が0から終了までスペースを考慮して1からcountまで追加します.ここで、最初または最後が空白であればcount-1の方式です.
前の方式との違いや気づかなかった間違いをよく考えましたが・・・
気づかなかったどの部分で白俊が間違った答えだと判断したのか分からない.
#include <iostream>
#include <string>
using namespace std;

int main() {
	string sentence;
	getline(cin, sentence);

	if (sentence.empty()) {
		cout << "0";
		return 0;
	}

	int count = 1;
	for (int i = 0; i < sentence.length(); i++) {
		if (sentence[i] == ' ')
			count++;
	}
	if (sentence[0] == ' ')
		count--;
	if (sentence[sentence.length() - 1] == ' ')
		count--;

	cout << count;
}

1157


単語学習
#include <iostream>
#include <string>
using namespace std;

int main() {
	string word;
	cin >> word;

	int count[100] = { 0, };

	for (int i = 0; i < word.length(); i++) {
		if (word[i] >= 97 && word[i] <= 122) {
			word[i] -= 32;
		}
		count[word[i]]++;
	}

	int max = 0;
	char result = '?';
	for (int j = 65; j <= 90; j++) {
		if (max < count[j]) {
			max = count[j];
			result = j;
		}
		else if (max == count[j])
			result = '?';
	}

	cout << result;
}
アスキーコードを用いて小文字を大文字に変換した後、各文字のアスキーコードインデックスの番号をcount[100]に記憶する.
次に各インデックスを比較し、最大値を含むインデックスを見つけて出力します.インデックスはAskiコードを表すためです.
maxが対応するインデックス数と同じ場合は、次の操作を行います.変数をに格納します.

1546


1546号:平均値
#include <iostream>
#include <string>
using namespace std;

int main() {
	int size;
	cin >> size;
	double score[1000];
	int max = 0;
	for (int i = 0; i < size; i++) {
		cin >> score[i];
		if (score[i] > max)
			max = score[i];
	}

	double sum = 0;
	for (int i = 0; i < size; i++) {
		score[i] = score[i] / max * 100;
		sum += score[i];
	}

	cout << fixed;
	cout.precision(2);
	cout << sum / (double)size;
}

2577


2577:数値の個数
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
	int a, b, c;
	cin >> a >> b >> c;

	int r;
	r = a * b * c;
	string result = to_string(r);

	vector<string> vec(result.size());
	for (int i = 0; i < vec.size(); i++) {
		vec[i] = result[i];
	}

	int size = 0, count;
	while (size < 10) {
		count = 0;
		for (int i = 0; i < vec.size(); i++) {
			if (vec[i] == to_string(size))
				count++;
		}
		cout << count << endl;
		size++;
	}
}
to_string intを文字列に変換する関数です.

10818


10818号:最小、最大
#include <iostream>
#include <vector>
using namespace std;

int main() {
	int num;
	cin >> num;

	vector<int> vec(num);
	int min = 1000000, max = -1000000;
	for (int i = 0; i < num; i++) {
		cin >> vec[i];
		if (vec[i] < min)
			min = vec[i];
		if (vec[i] > max)
			max = vec[i];
	}

	cout << min << " " << max;
}