问题描述
- C语言题目,跪求大神给个代码,实在不会啊
-
描述
大家都知道二进制数只含有0和1,那么问题来了,告诉你一个区间[L,R),L,R都是int范围类的正整数.且L < R,在这个区间里的所有数转化为二进制后所有位数之和最大的数是?(如果有多个输出值最小的)输入
多组测试数据,每组测试数据仅含有两个整数L,R。
输出
一个整数,表示在以上区间内转化成二进制后所有位数之和最大的数
样例输入
4 7
样例输出
5
解决方案
#include <stdio.h>
int cal(int n){
int res = 0;
while(n){
res += (n & 1);
n >>= 1;
}
return res;
}
int main()
{
int l,r;
int i, res;
int tmp, curr_max = 0;
printf("请输入L和R的值n");
while(scanf("%d%d", &l, &r)){
for(i = l; i < r; i++){
tmp = cal(i);
if(tmp > curr_max){
curr_max = tmp;
res = i;
}
}
printf("最终的结果:%dn", res);
}
return 0;
}
解决方案二:
#include
using namespace std;
int cal(int n){
int res = 0;
while(n){
res += (n & 1);
n >>= 1;
}
return res;
}
int main()
{
int l,r;
int i, res;
int tmp, curr_max = 0;
cout << "请输入L和R的值" << endl;
cin >> l >> r;
for(i = l; i < r; i++){
tmp = cal(i);
// cout << "tmp:" << tmp << endl;
if(tmp > curr_max){
curr_max = tmp;
res = i;
}
}
cout << res << endl;
return 0;
}
解决方案三:
#include
int cal(int n){
int res = 0;
while(n){
res += (n & 1);
n >>= 1;
}
return res;
}
int main()
{
int l,r;
int i, res;
int tmp, curr_max = 0;
printf("请输入L和R的值n");
while(scanf("%d%d", &l, &r)){
for(i = l; i < r; i++){
tmp = cal(i);
if(tmp > curr_max){
curr_max = tmp;
res = i;
}
}
printf("最终的结果:%dn", res);
}
return 0;
}
解决方案四:
提供一个与众不同的思路。
建立一个0 - 7数值的位数之和表。如 int a[8] = {0, 1, 1, 2, 1, 2, 2, 3};
对每一个整数,每3位统计一次1的位数,具体是多少,就查上面的表。
如果想更快,就建 0 - 15, 0 - 31等表格,但要是2的n次幂,方便计算。