解题思路:
    将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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论