解题思路:1、借用指针使用递归算法实现右移;2、将左移转化为右移,统一函数

注意事项:1、本题中的整数是32位无符号整数,输入和输出时可以使用%u进行处理2、末尾输出换行
参考代码:

#include<stdio.h>

#include<math.h>

void move(int a[32],int n)      //先实现右移一位的功能,再使用递归算法右移n位

{

    int *p,a_end;

    a_end=a[31];

    for(p=&a[31];p>a;p--)

    {

        *p=*(p-1);

    }

    a[0]=a_end;

    n--;

    if(n>0) move(a,n);

}

int main()

{

    int i,n,a[100],n2,k;

    unsigned int value,sum=0;

    scanf("%u %d",&value,&n);

    for(i=31;i>=0;i--)       //拆分求二进制

    {

        a[i]=value%2;

        value/=2;

    }

    if(n<0)                     //左移n位,相当于右移m-n位(m为总位数)

    {

        n=n+32;

    }

    move(a,n);


    for(i=31,k=0;i>=0;i--,k++)  //将移位后的二进制数组重新组合

    {

        sum=sum+pow(2,k)*a[i];

    }

    printf("%u\n",sum);

    return 0;

}


点赞(3)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论