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 运行结果如下: