C语言利用函数解决问题:1.实现reverse函数完成数组元素的逆置;2.将两个数组的元素进行互换;3.统计二进制中1的个数

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

目录

一.实现reverse函数完成数组元素的逆置

问题描述

代码

二.将两个数组的元素进行互换

问题描述

代码

三.统计二进制中1的个数

问题描述

代码一

代码二

 代码三

 代码四(最经典)


一.实现reverse函数完成数组元素的逆置

问题描述

  1. 实现函数init(初始化数组为全0
  2. 实现print()打印数组的每个元素
  3. 实现reverse()函数完成数组元素的逆置。

要求:自己设计以上函数的参数,返回值。

代码

#include<stdio.h>
void Init(int* arr,int sz)//在这里数组传过来的时候,要么用int* arr 要么用int arr[]
{
    for (int i=0;i<sz;i++)
    {
        arr[i]=0;
    }
}
void Print(int arr[],int sz)//在这里数组传过来的时候,要么用int* arr 要么用int arr[]
{
    for (int i=0;i<sz;i++)
    {
        printf("%d ",arr[i]);
    }
}
void Reverse(int arr[],int sz)
{
    int left=0;
    int right=sz-1;
    while(left<=right)//这里只用‘<’也可以
    {
        int temp=arr[left];
        arr[left]=arr[right];
        arr[right]=temp;
        left++;
        right--;
    }
}
int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9};
    int sz=sizeof(arr)/sizeof(arr[0]);
    //Init(arr,sz);
    Reverse(arr,sz);

    Print(arr,sz);
}

运行结果是:

二.将两个数组的元素进行互换

问题描述

将数组A中的内容和数组B中的内容进行交换。(数组―样大)

代码

#include<stdio.h>
void Print(int arr[],int sz)//在这里数组传过来的时候,要么用int* arr 要么用int arr[]
{
    for (int i=0;i<sz;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}
int main()
{
    int arr1[]={1,2,3,4,5};
    int arr2[]={6,7,8,9,0};
    int sz=sizeof(arr1)/sizeof(arr1[0]);
    for (int i=0;i<sz;i++)
    {
        int temp=arr1[i];
        arr1[i]=arr2[i];
        arr2[i]=temp;
    }
    Print(arr1,sz);
    Print(arr2,sz);
}

运行结果:

三.统计二进制中1的个数

问题描述

写一个函数返回参数二进制中1的个数。比如: 输入15, 0000 1111 4个1,那么就输出4

代码一

#include<stdio.h>
int count_bit_one(int a)
{
    int count=0;
    while(a)//一直除2取余,一旦a一直除到0就退出
    {
        if(a%2==1)
        {
            count++;//取余为1就说明二进制是1
        }
        a=a/2;
    }
    return count;
}
int main()
{
    int a=0;
    scanf("%d",&a);
    int count=count_bit_one(a);
    printf("%d",count);//输出count的得数也就是二进制中1的个数
}

运行结果:

这个代码有一个致命缺点,就是对于负数不能正确输出结果,比如输入-1



如上图二进制图所示,输入-1,按道理应该输出32,但运行结果却是0,解决方法也很简单:把a搞成无符号数,让负数的最高位不当做符号位,这样就不会有影响。

代码二

#include<stdio.h>
int count_bit_one(unsigned int a)
{
    int count=0;
    while(a)//一直除2取余,一旦a一直除到0就退出
    {
        if(a%2==1)
        {
            count++;//取余为1就说明二进制是1
        }
        a=a/2;
    }
    return count;
}
int main()
{
    int a=0;
    scanf("%d",&a);
    int count=count_bit_one(a);
    printf("%d",count);//输出count的得数也就是二进制中1的个数
}

只要将函数中的int a变为unsigned int a就行,我们再来运行试试:

 代码三

除了上述代码二可以解决问题,还可以用右移操作符和‘&’操作符来解决

 代码四(最经典)

还有一种最经典的解决方法,先解释一下原理:

如上图,让n=n&(n-1); 比如让n=13,这样不断循环计算下去,如上图我们会发现循环三次就能得到0,也就是说我们只要计算到最后结果是0时一共循环几次就得到了最后的结果

#include<stdio.h>
int count_bit_one(int a)
{
    int count=0;
    while(a)
    {
        a=a&(a-1);
        count++;
    }
    return count;
}
int main()
{
    int a=0;
    scanf("%d",&a);
    int count=count_bit_one(a);
    printf("%d",count);//输出count的得数也就是二进制中1的个数
}

 运行结果是:

 

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳862

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值