目录
函数式判断素数
函数式二分法
数组替换
求二进制不同位的个数
密码输入
递归输出单值
二进制求一的个数
前言
本文将结合一些典例来讲解知识点,同时为了方便大家听得懂我会在编程中添加一些有必要的注释供大家理解。目录的排列没有顺序。作者我也是一个C语言B站初学者,欢迎一起学习交流,批评指正。
1,函数式判断素数
什么是素数?
质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数)。 比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的地位。
代码解析:
#include<stdio.h>
//当实参实比例化之后其实相当于实参的一份临时拷贝
int is_prime(int x)
{
int j;
for(j = 2;j <= sqrt(x); j++)
{
if(x%j == 0)
return 0;
}
return 1;
}
int main()
{
//打印1-100内的素数
for(int arr = 1;arr <= 100; arr++)
{
if(is_prime(arr) == 1)
{
printf("%d ",arr);
}
}
}
我们的函数is_prime是判断X是否为素数,是就返回1,不是就返回0,其中x%j==0是对1-100内的素数的判断条件,我们用for的循环去执行这个条件,就是对X这个数除以2-x的所有数之后判断在这遍历的过程中有没有和他整除的数,有就不是素数。
函数式二分法
什么是二分法?
二分法简单讲就是一分为二的查找方法,用图说明:
代码解析:
#include<stdio.h>
int is_ar(int arr[],int q,int sz)
{
int left = 0;
//元素个数减一就是数组下标
int right = sz - 1;
while(left <= right)
{
//数组中间的元素下标
int mid = (left + right)/2;
if ( arr[mid] > q)
{
right = mid -1;
}
else if(arr[mid] < q)
{
left = mid +1;
}
else{
return mid;
}
}
if(left > right)
{
return -1;
}
}
int main()
{
//arr数组1-10
int arr[] = {1,2,3,4,5,6,7,8,9,10};
//查找9
int q = 9;
//元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
//查找函数
int s = is_ar(arr,q,sz);
if( s == -1){
printf("no");
}
else{
printf("this is %d",s);
}
return 0;
}
在1-10中查找9,没找到返回-1,返回其他就是找到了。将要查找的数总是与数组中的中间元素比较,看它在哪个区间,因此来划分区域。
数组替换
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main ()
{
char arr [] = "wertsyui";
char arr2[] = "########";
int c = 0;
int d = sizeof(arr)/sizeof(arr[0])-2;
while(c <= d)
{
arr2[c] = arr[c];
arr2[d] = arr[d];
c++;
d--;
Sleep(1000);
system("cls");
printf("%s\n",arr2);
}
}
这里是将数组arr2中的#号替换为arr数组里的字符。int d 中的减二是将/0也一拼减了。这里介绍两个Windows.h里的库函数,Sleep是缓时间函数,这里的1000就是1秒;system是控制台函数,cls是控制台的清除。
求二进制不同位的个数
这里是输入两个值,它们转化成为二进制后比较它们的二进制序列中不同位的个数。
#include<stdio.h>
//异或 不同为1,同则为0
//求二进制不同位个数
int get_diff_bit(int n,int m)
{
int count;
int tmp = n^m;
while(tmp)
{
tmp = tmp&(tmp-1);
count++;
}
return count;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int count = get_diff_bit(n,m);
printf("%d",count);
}
这里是用异或进行比较。
密码输入
#include<stdio.h>
int main()
{
int ret = 0;
char password[20] = {0};
int ch = 0;
printf("请输入密码\n");
scanf("%s",password);
//输入密码时确认会输入回车
//这时缓存区会接收一个\n
//这个\n会被getchar接收
//所以再输入一个getchar()接收/n
while((ch = getchar() )!= '\n')
{
;
}
printf("是否确认");
ret = getchar();
if(ret == 'y')
{
printf("输入成功\n");
}
else{
printf("输入失败\n");
}
return 0;
}
这里我们没有设置正确的密码,只是说了一个密码输入的格式, 要注意的是 while((ch = getchar() )!= '\n') { ; }是判断输入密码是否为空,(ch = getchar() )!= '\n'是一个常见的字符比较函数, ret = getchar();与scanf的作用一样。
递归输出单值
#include<stdio.h>
//strlen Çó×Ö·û´®³¤¶È
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main ()
{
char arr[] = "bit";
int len =my_strlen(arr);
printf("len = %d\n",len);
return 0;
}
用递归的方法计算arr数组中字符串的个数,我们的函数 int my_strlen(char* str)中的*str != '\0'是判断最后一个数组元素的值是否为\n遇到\n则str++,并count计数++。
二进制求一的个数
int teat( int n)//这个可以算负数
{
int i,count=0;
for(i =0;i < 32;i++)
{
if(((n >> i) & 1) == 1)//按位与 只有俩个都为1则为1
//这里再添加一个方法 if n = n & (n - 1);count++;有几个1循环几次
{
count++;
}
}
return count;
}
int main()
{
int arr;
scanf("%d",&arr);
int count = teat(arr);
printf("%d",count);
system("pause");//system库函数-执行系统命命-pause(暂停)
return 0;
}
这里是利用按位与只有两个都为一时,为一判断一的个数的,if中如果&后为一级++。