1080-- 【基础】 挑战赛第三题——二进制中的1
传送门http://www.jzoj.cn/problem.php?id=1080
题目描述
给定一个正整数N,请找出N转化为二进制后,其中所有1的位置。二进制的最低位(最右侧)为第0位。
输入
输入中包含一个正整数N ( 1 <= N <= 1000000)
输出
输出N转换为二进制后,所有1的位置,每行一个1的位置
样例
输入
13
输出
0
2
3
解析
本道题依然可以偷懒 (yeah,这道题仍然是基于第一道题十进制转二进制的!只不过我们需要求每个1的个数
我们把前面的代码先写掉,把输出二进制部分删掉,在前面定义一个叫seat的变量用于确定1的位置,转二进制循环中判断是否为1,如果是输出seat,最后把seat+1
不过,还有一种
注意了,在for计数循环中我们定义了一个i,所以大可不必在写一个seat变量,不过要注意一点,我写的循环i一开始是1,输出的时候要减1。原因是因为我喜欢从1而不是0开始,如果从0开始可以直接输出i了
代码
一:
#include <bits/stdc++.h>
using namespace std;
int n,n2,binray_len,ans = 0,seat = 0;
int main()
{
cin >> n;
n2 = n;
while (n2){
n2 /= 2;
binray_len++;
}
int binray[binray_len+1];
// cout << binray_len << endl;
for (int i = 1; i <= binray_len; i++){
binray[i] = n % 2;
if (binray[i] == 1) cout << seat << endl;
n /= 2;
seat++;
}
return 0;
}
二:
#include <bits/stdc++.h>
using namespace std;
int n,n2,binray_len,ans = 0;
int main()
{
cin >> n;
n2 = n;
while (n2){
n2 /= 2;
binray_len++;
}
int binray[binray_len];
// cout << binray_len << endl;
for (int i = 0; i <= binray_len; i++){ // 如果是1记得把数组项数增加1,否则会越界
binray[i] = n % 2;
if (binray[i] == 1) cout << i << endl;
n /= 2;
}
return 0;
}