KY187 二进制数
描述
大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0。
思路
对数字不断对2取模运算和除2,就能得到结果。
代码
#include <iostream>
#include<vector>
using namespace std;
int main() {
unsigned int n;
while(cin >> n){
vector<int> bin;
while(n != 0){
bin.push_back(n % 2);
n /= 2;
}
for (int i = bin.size() - 1; i >= 0; i--) {
cout << bin[i];
}
cout << endl;
}
return 0;
}
KY176 排列与二进制
描述
在组合数学中,我们学过排列数。从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n中取m的排列数,记为p(n, m)。具体计算方法为p(n, m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)! (规定0!=1).当n和m不是很小时,这个排列数是比较大的数值,比如 p(10,5)=30240。如果用二进制表示为p(10,5)=30240=( 111011000100000)b,也就是说,最后面有5个零。我们的问题就是,给定一个排列数,算出其二进制表示的后面有多少个连续的零。
思路
通过函数算出排列组合的数字,在算出数字的二进制形式
在算很大的排列组合时,会出现溢出的情况,所以不能直接计算排列组合的结果
long long型也无法解决问题
代码1(计算可能溢出)
#include <iostream>
#include<vector>
using namespace std;
long double function(long double x, long double y) {
long double ret_x = x, ret_y = y;
for (size_t i = x - 1; i > 0; i--) {
ret_x *= i;
}
ret_y = x - y;
for (size_t i = x - y - 1; i > 0; i--) {
ret_y *= i;
}
return ret_x / ret_y;
}
int main() {
long double n, m;
while (cin >> n >> m) {
if (n == 0)
break;
long long temp = function(n, m);
vector<int> v;
while (temp != 0) {
v.push_back(temp % 2);
temp /= 2;
}
int i;
for (i = 0; i < v.size(); i++) {
if (v[i] == 1)
break;
}
cout << i << endl;
}
}
思路2
只需要算乘得的数字中有多少2,累加就能得到结果
代码2
#include <iostream>
#include<vector>
using namespace std;
int main() {
int n, m, k;
while (cin >> n >> m) {
if (n == 0)
break;
int ret = 0;
for (int i = n - m + 1; i <= n; i++) {
k = i;
while (k % 2 == 0) {
ret++;
k /= 2;
}
}
cout << ret << endl;
}
return 0;
}
KY30 进制转换
描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
思路
数字大小很长,不能用一般的整型数来接受,要使用字符串类型来接受
代码
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
string Divide(string str, int x) {
int remainder = 0;
for (size_t i = 0; i < str.size(); i++) {
int current = remainder * 10 + str[i] - '0';
str[i] = current / x + '0';
remainder = current % x;
}
int pos = 0;
while (str[pos] == '0') {
pos++;
}
return str.substr(pos);
}
int main() {
string str;
while (cin >> str) {
vector<int> binary;
while (str.size() != 0) {
int last = str[str.size() - 1] - '0';
binary.push_back(last % 2);
str = Divide(str, 2);
}
for (int i = binary.size() - 1; i >= 0; --i) {
cout << binary[i];
}
cout << endl;
}
return 0;
}