其他分享
首页 > 其他分享> > JZOJ 部分有关进制题目 (2)

JZOJ 部分有关进制题目 (2)

作者:互联网

1080-- 【基础】 挑战赛第三题——二进制中的1

传送门icon-default.png?t=L892http://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;
}

标签:题目,进制,JZOJ,int,len,binray,二进制,n2,seat
来源: https://blog.csdn.net/weixin_44186414/article/details/120400344