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

编程题#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 
//#include 
//#include 
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

你可能感兴趣的:(Coursera,程序设计与算法(专项课程))