当前位置: 首页 > news >正文

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的个数
}

 运行结果是:

 

相关文章:

  • Html:网站设计的内容概览简介、网页设计流程/工具/内容组成、脚本代码之详细攻略
  • 网络安全笔记 -- XXEXML(利用、检测、绕过)
  • c语言小项目(静态通讯录)
  • 数据结构与算法——左程云09
  • C++异常
  • 【ASM】字节码操作 如何使用 visitFrame
  • 【Spring Boot 集成应用】 OAUTH2统一认证单点登录中的各种模式说明
  • 数据链路层的检错技术——循环冗余校验CRC(Cyclic Redundancy Check)
  • 【C++】IO流
  • Pytorch理解
  • 区块链中的隐私保护技术
  • postgres 源码解析 元组插入流程 Heap_Insert
  • 什么是数字化转型? 怎样算是转型?
  • js单行代码------日期和时间
  • 公众号网课查题接口
  • create-react-app做的留言板
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 最常见的 200+ 面试题:面试必备
  • Object.assign方法不能实现深复制
  • Objective-C 中关联引用的概念
  • Python学习之路16-使用API
  • ReactNative开发常用的三方模块
  • SQLServer之索引简介
  • sublime配置文件
  • 闭包,sync使用细节
  • 从零搭建Koa2 Server
  • 分类模型——Logistics Regression
  • 简单易用的leetcode开发测试工具(npm)
  • 前端面试之闭包
  • 新版博客前端前瞻
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)STL算法之遍历容器
  • (3)(3.5) 遥测无线电区域条例
  • (3)选择元素——(17)练习(Exercises)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (全注解开发)学习Spring-MVC的第三天
  • (一)认识微服务
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 发送邮件
  • .NET简谈设计模式之(单件模式)
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net与java建立WebService再互相调用
  • .vue文件怎么使用_vue调试工具vue-devtools的安装