問題文
整数 N が与えられます。N 以下の正の整数のうち、(先頭に 0 をつけずに十進法で表記したときの) 桁数が奇数であるようなものの個数を求めてください。
入力と出力
N
N 以下の正の整数のうち、桁数が奇数であるようなものの個数を出力せよ。
ACコード
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
int counter = 0;
// 全探索でiの桁数が奇数か調査
for(int i = 1; i < N + 1; i++) {
if (1 <= i and i <= 9) {
counter++;
}
else if (100 <= i and i <= 999) {
counter++;
}
else if (10000 <= i and i <= 99999) {
counter++;
}
}
cout << counter << endl;
}
つまずいたところ
int N;
cin >> N;
int counter = 0;
for(int i = 0; i < N; i++) {
string fact = i;
if(fact.size() % 2 != 0) {
counter++;
}
}
cout << counter << endl;
この問題は桁数が奇数のものの個数を数えるということだったので、最初はカウンタ変数iをstringとして受け取りstring.size() % 2 != 0
がtrueの場合、counterを増やすように設計しようとした。が、C++では単純に代入ではint型をstring型に変更できなかったので、ループにしたときintカウンタ変数を使うことができなかった。
C++は敷居が高いとか聞いてたけど、こういうことなのかとPHP、Pythonをメインで使っているヤマダは思った。
最終的に、ACコードのように、Nまでカウンタ変数をしらべ、それが制約上限の100000のうち、奇数の桁であるかを計測する方針で実装した。
(20221211 追記)
C++にも型キャストなるものがあることがわかった。
記述方法は
(型)値
https://atcoder.jp/contests/apg4b/tasks/APG4b_y
ただし、int型からstring型への変換のように、数値型以外への変換は基本的にはできないということに注意してください。
👆ただ、やはりこのやり方では無理そう。
to_string関数を使えばint→stringへの型変換ができる
string s = to_string(number);
ACコード(別パターン)
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
int counter = 0;
for(int i = 1; i < N+1; i++) {
// to_string関数使用。
string fact = to_string(i);
if(fact.size() % 2 != 0) {
counter++;
}
}
cout << counter << endl;
}