問題文
正整数 N が与えられるので、1 以上 N 以下の整数のうち、最も 2 で割れる回数が多いものを求めてください。答えは必ず 1 つに定まります。
入力と出力
N
問題の答えを出力する
ACコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int main() {
int n;
cin >> n;
int ans = -1;
int maxcnt = -1;
for (int i=1; i<n+1; i++) {
int counter = 0;
int y = i;
while (y % 2 == 0) {
counter++;
y /= 2;
}
if (maxcnt < counter) {
maxcnt = counter;
ans = i;
}
}
cout << ans << endl;
}
失敗したこと/学んだこと
- 失敗コード
for (int i=1; i<n+1; i++) {
int counter = 0;
while (i % 2 == 0) {
counter++;
i /= 2;
}
if (maxcnt < counter) {
maxcnt = counter;
ans = i;
}
while内でforで宣言したiを直接操作してしまっている。なのでforと同じレイヤーにあるif内でiが書き換えられてしまった。
- for文内でカウンタ変数を使って操作をしたい場合は一度コピーを作ってから行う。