解题思路: 将10进制转化为2进制保存到一个数组中。。。。。话不多说,看代码,代码中有比较详细的解释 注意事项: n>0和n<0两种情况只要换个角度思考就能通过同一个代码块处理,能节省不少代码(第一次走了远路)。 参考代码: #include<stdio.h> unsigned move(unsigned, int); //声明move函数 int main(){ unsigned value; int n; scanf("%u %d", &value, &n); printf("%u\n", move(value, n)); return 0; } unsigned move(unsigned value, int n){ unsigned sum = 0, k = 1; //sum作为新10进制数。 unsigned bits[32]; //最长32位,定义一个32个元素的数组用于保存二进制 int i; //i用作循环变量 for(i=0; i<32; i++){ //该循环语句用于将10进制转化为二进制并保存到bits数组中 bits[i]= value % 2; value /= 2; } if(n < 0){ //当n小于零时,可以把,这样就统一了n>0及n<0时的处理方法 n = 32 + n; //相当于32-abs(n);把主体作为需要移动的部分 } unsigned temp[n]; //中转数组,用于保存需要移动的元素 for(i=0; i<n; i++){ //把原数组中前面的n个元素保存到中转数组中 temp[i] = bits[i]; } for(i=0; i<32-n; i++){ //把原数组中剩余部分依次往前移 bits[i] = bits[i+n]; } for(i=0; i<n; i++){ bits[32-n+i] = temp[i]; //再把中转数组中的元素填到原数组的后面 } //下面是未合并n>0和n<0的处理方法,分两种情况分别处理(处理步骤和上面一样) /* if(n < 0){ //截取后面部分移到前面 for(i=0; i<abs(n); i++){ temp[i] = bits[32-abs(n)+i]; } for(i=32-abs(n)-1; i>=0; i--){ bits[i-n] = bits[i]; } for(i=0; i<abs(n); i++){ bits[i] = temp[i]; } }else{ //截取前面部分移到后面 for(i=0; i<n; i++){ temp[i] = bits[i]; } for(i=0; i<32-n; i++){ bits[i] = bits[i+n]; } for(i=0; i<n; i++){ bits[32-n+i] = temp[i]; } }*/ for(i=0; i<32; i++){ //将处理后的二进制转换为10进制 sum += bits[i]*k; k *= 2; } return sum; }
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:1038 |
小明A+B (C语言代码)浏览:1256 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:832 |
K-进制数 (C语言描述,蓝桥杯)浏览:925 |
【亲和数】 (C语言代码)浏览:599 |
图形输出 (C语言代码)浏览:1387 |
判定字符位置 (C语言代码)浏览:799 |
输入输出格式练习 (C语言代码)浏览:752 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:617 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1189 |