您的位置:首页 > 编程语言 > C语言/C++

期末考试 编程题#8:计算整数k(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;进制转换)

2017-12-05 21:10 513 查看
编程题#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐