编程题#8:计算整数k
来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
总时间限制: 1000ms 内存限制: 1024kB
描述
输入整数 n ( 0 <=n<= 2^30) , 以及整数i,j(0 <= i,j <31,i < j-1), 输出整数k(按十六进制输出结果 ),k的第i位和n相同,第j位和n不同,i,j之间的位是1, 其他位都是0。这里提到的所有的位,指的都是二进制位,最右边算第0位。
输入
第一行是整数 t,表示数据组数。
每组输入数据是一行,三个整数 n,i和j。
输出
对每组输入数据,按十六进制输出结果。
样例输入
2
23 3 5
7 0 2
样例输出
30
3
提示
本题请写出完整的程序。
程序解答:
#include <iostream>
//#include <iomanip>
//#include <cmath>
using namespace std;
void printk(int n, int i, int j){
int a[31] = { 0 };
int b[31] = { 0 };
int k = 0;
int i1 = 0;
while (n){ //二进制如何转十进制,十进制如何转二进制 https://jingyan.baidu.com/article/597a0643614568312b5243c0.html
a[i1] = n % 2; //在线任意进制转换计算 http://jinzhi.supfree.net
i1++;
n /= 2;
}
b[i] = a[i]; //使得 k的第i位和n相同
for (int j1 = i + 1; j1 < j; j1++) //使得 i,j之间的位是1
b[j1] = 1;
if (a[j] == 0) //使得 第j位和n不同
b[j] = 1;
else
b[j] = 0;
for (int ii = 0; ii < 31; ii++) //将b[31]转为10进制的
k += b[ii] * int(pow(2, ii));
cout << hex << k << endl; //以十六进制形式输出k
}
int main(int argc, char* argv[]){
int t, n, i, j;
cin >> t;
while (t--){
cin >> n >> i >> j;
printk(n, i, j);
}
return 0;
}
其他解法参考:
http://blog.csdn.net/NNNNNNNNNNNNY/article/details/50677067