C语言利用函数解决问题:1.实现reverse函数完成数组元素的逆置;2.将两个数组的元素进行互换;3.统计二进制中1的个数
CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
目录
一.实现reverse函数完成数组元素的逆置
问题描述
代码
二.将两个数组的元素进行互换
问题描述
代码
三.统计二进制中1的个数
问题描述
代码一
代码二
代码三
代码四(最经典)
一.实现reverse函数完成数组元素的逆置
问题描述
- 实现函数init(初始化数组为全0
- 实现print()打印数组的每个元素
- 实现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的个数
}
运行结果是: