原题链接:[编程入门]自定义函数之通用位移
解题思路: 将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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复