原题链接:[编程入门]自定义函数之通用位移
解题思路:
将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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复