一、交换一个数组的前后依次的元素
//每天练一遍的代码
//交换一个数组的前后依次的元素
void reverse(int arr[], int sz)
{
int left = 0 ;
int right = sz -1 ;
while(left < right)
{
int tmp = arr[left];
arr[left] = arr[right] ;
arr[right] = tmp ;
left ++ ;
right --;
}
}
void Init(int arr[], int sz)
{
int i = sz;
for(i = 0 ; i <sz ; i++)
{
arr[i] = 0;
}
}
void Printf(int arr[], int sz)
{
int i = 0 ;
for(i = 0 ; i< 10 ; i++)
{
printf("%-2d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0 ;
int sz = sizeof(arr) / sizeof(arr[0]) ;
Printf(arr, sz);
//Init(arr,sz); //初始化
reverse(arr,sz);
Printf(arr, sz);
return 0 ;
}
---
二、计算一个十进制数转换成二进制数后1的个数
//计算一个十进制数转换成二进制数后1的个数
#include<stdlib.h>
int count_1( int a) //unsigned int 把有符号数转换成无符号数即可
{
//方法3,最高效简洁!
int count = 0 ;
while(a)
{
a = a&(a-1);
count ++;
}
//方法2
//int i = 0 ;
//for(i = 0 ; i<32 ; i++)
//{
// if( (a >> i) &1 == 1)
// {
// count ++ ;
// }
//}
//方法1
//需要将int a 改成 unsigned int a
//while( a ) //不用写a > 0
//{
// if(a%2 == 1)
// {
// count++ ;
// }
// a = a/2 ;
//}
return count ;
}
int main()
{
int a = 0;
printf("请输入:>");
scanf("%d",&a);
//像一个十进制数1231,计算有多少个1
//是先%10
//再/10
//反复循环
//直到为0
printf("%d\n",count_1(a));
//写完如下代码,可以不用调节控制台。不建议
//system("pause"); //system - 库函数 -执行系统命令 - 暂停
return 0 ;
}
三、二分法查找数据
//✨用函数实现二分查找
// ↓本质上arr是一个指针
int binary_search(int arr[], int i , int sz)
{
int left = 0;
int right = sz ; //所以将求sz的步骤放在主函数中,不然求到的sz不是数组的大小 sz错误结果为1
while(left <= right)
{
int mid = (left + right) / 2;
if(i<arr[mid])
{
right = mid - 1; //当i小于中间元素时,右端重新赋值为原中间元素-1
}
else if(i>arr[mid])
{
left = mid + 1; // 当i大于中间元素时,右端重新赋值为原中间元素+1
}
else
{
return mid ;
}
}
//if(left > right) //不用写
return -1 ;
}
四、冒泡法排序
//冒泡法排序
void bubble_sort(int arr[] , int sz)
{
//确定冒泡排序的趟数
int i = 0;
for(i=0; i<sz-1; i++) //i从0开始所以i<sz-1,不用加= 。
{
int flag = 1; //假设这个数组已经是升序
//每一趟冒泡排序
int j = 0;
for(j=0; j<sz-1-i; j++)
{
if(arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 0; //发生了交换,不是升序
}
}
if(flag == 1) //判断是否是升序
{
break;
}
}
}
#include<stdio.h>
int main()
{
int arr[] = {8,9,7,1,2,3,4,5,6,0};
int sz = sizeof(arr) / sizeof(arr[0]);
//对arr进行排序,排成升序
//arr是数组,我们对数组arr进行传参,实际上传递过去的是数组arr首元素的地址,&arr[0]
int i = 0;
bubble_sort(arr , sz);
//冒泡法排序函数
for(i=0; i<=sz-1; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
五、使用函数判断是否为素数,并打印1-1000之间的素数。
//打印1-1000之间的素数
//打印100到200之间的素数
#include<stdio.h>
int main()
{
int i = 0 ;
int count = 0 ;
for(i=101;i<=200;i+=2) //素数一定是奇数
{
//判断是否为素数的条件
//1.试除法
int j = 0 ;
for(j=2; j <= sqrt(i); j++) // j<i可以被优化为j<=sqrt(i)
{
if(i%j == 0)
break ; //素数的特点是其因数(不叫公倍数)只有 1和它本身
}
if(i==j)
{
printf("%d ",i);
count++; //如果i除以j的余数为0,且i和j相等,便可以判断出这个数是素数。
}
}
printf("\n一共有%d个\n",count);
return 0;
}