1.判断一个数是否为素数
代码如下:
#include <stdio.h>
int jum(int num)
{
	int i = 0;
	for (i = 2;i < num;i++)
	{
		if (num % i == 0)
		{
			return 0;
			break;
		}
	}
	return 1;
}
void Jum1(int (*pf)(int))
{
	int num = 0;
	printf("请输入操作数:");
	scanf_s("%d",&num);
	if (jum(num))
	{
		printf("是素数\n");
	}
	else
	{
		printf("不是素数\n");
	}
}
int main()
{
	int input = 0;
	do {
		printf("输入1判断操作数是否为素数,输入0停止判断\n");
		scanf_s("%d", &input);
		switch (input)
		{
			case 1:
				Jum1(jum);
				break;
			case 0:
				printf("退出判断\n");
				break;
			default:
				printf("输入有误,请重新输入\n");
			    break;
		}
	} while (input);
	return 0;
}
运行结果如下:

2.写一个函数,实现寻找一个有序数组
这里采用二分法寻找一个有序数组的下标,首先给出一个错误的代码,如下:
#include<stdio.h>
int binary_search(int arr[], int k)
{
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	//这里规定若找到,则返回下标;找不到则返回-1
	int ret = binary_search(arr, k);
	if (ret == -1)
	{
		printf("没有找到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}
这里看似逻辑是正确的,实际上却是错误的,运行结果如下:

明明当k=7时是在我们所设置的数组里,却显示没有找到,我们进入调试功能看一下是哪方面出了问题。
未进入到函数时,调试如下:

这里我们可以看到数组arr已经创建,类型为int,
程序进入到我们所写的函数时,调试如下:

这里我们可以看到,从主函数传递过去的arr变了,不再是数组,而是一个地址,类型由int变成int*,变成了指针,而指针的大小只有4(32位)或8(64位),这里我使用的是64位,所以
sizeof(arr)= 8,而sizeof(arr[0])= 4为一个int类型变量的大小,所以这里sz根本就不是数组的大小,所以运行结果错误。
原因在于,数组在传参数时,传递的是数组名,而在前面的数组知识中讲过--http://t.csdnimg.cn/Wudzn,数组名就是数组首元素的地址,所以数组传参时,并没有把整个数组传递给形参,实际上只是传递的数组地址,所以函数里的arr实际上是一个指针变量。
所以不能在函数里计算数组的大小,正确的代码如下:
#include<stdio.h>
int binary_search(int arr[], int k, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//这里规定若找到,则返回下标;找不到则返回-1
	int ret = binary_search(arr, k, sz);
	if (ret == -1)
	{
		printf("没有找到\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}
运行结果如下:

注:数组传参时,只需要传递数组名即可, 所以这里是int ret = binary_search(arr, k, sz);而不是
int ret = binary_search(arr[ ], k, sz).
3.输入两个数,求这两个数的最大公约数
求两个最大公约数的方法有很多,最基本也是最“笨”的方法就是最大公约数不会大于两个数中较小的那个数,具体代码如下:
#include<stdio.h>
void Find(int x, int y)
{
	int i = 0;
	for (i = x;i > 0;i--)
	{
		if (y % i == 0 && x % i == 0)
		{
			printf("最大约数为:%d\n", i);
			break;
		}
	}
}
int main()
{
	int a = 0;
	int b = 0;
	scanf_s("%d %d", &a, &b);
	if (a < b)
	{
		Find(a, b);
	}
	else
	{
		int tmp = a;
		a = b;
		b = tmp;
		Find(a, b);
	}
	return 0;
}我们输入32 24两个数,代码运行结果如下:

上面代码的计算量较大,下面是另外一种求解最大公约数的方法,代码如下:
#include <stdio.h>
// 函数声明
int gcd(int a, int b);
int main() {
    int num1, num2;
    printf("请输入两个整数:\n");
    scanf("%d %d", &num1, &num2);
    int result = gcd(num1, num2);
    printf("最大公约数是:%d\n", result);
    return 0;
}
// 求最大公约数的函数
int gcd(int a, int b) {
    int temp;
    while (b != 0) {
        temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
在该代码中,我们定义了一个 gcd 函数,用于求解两个数的最大公约数。该函数使用了欧几里德算法,通过逐渐缩小两个数的差异来计算最大公约数。
我们输入 24 44 运行结果如下:




















