函数的详解
当实参传递给形参的时候,形参是实参的一份临时拷贝。
对形参的修改不会影响实参。
只有通过指针来存储地址,指针来进行修改实参的值
函数题目
素数,只能被1和他本身整数的数叫素数
比如7 只能被1和7整除的,拿2~(i-1)的数来试,如果发现2到(i-1)有数字来整除j,说明i不是素数。
没必要从2到i-1之前来判断是不是素数,只需要判断sqrt(m)里的数是不是素数。
写一个函数可以判断一个数是不是素数。
打印100~200之间的素数
素数是只能被1和他本身整除的数
7
1和7整除
2 3 4 5 6
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//是素数就打印
//拿2~i-1之间的数字去试除i
int flag = 1;//flag是1,表示是素数
int j = 0;
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d ", i);
}
}
printf("\ncount = %d\n", count);
return 0;
}
#include <math.h>
sqrt是数学库函数
开平方
math.h
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
{
//判断i是否为素数
//是素数就打印
//拿2~i-1之间的数字去试除i
int flag = 1;//flag是1,表示是素数
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d ", i);
}
}
printf("\ncount = %d\n", count);
return 0;
}
写一个函数可以判断一个数是不是素数。
是素数返回1
不是素数返回0
int is_prime(int n)
{
int j = 0;
for (j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
{
//判断i是否为素数
//是素数就打印
//拿2~i-1之间的数字去试除i
if (is_prime(i))
{
printf("%d ", i);
count++;
}
}
printf("\ncount = %d\n", count);
return 0;
}
//2. 写一个函数判断一年是不是闰年。
//能被4整除并且不能被100整除的是闰年或者被400整除的是闰年
//1000-20000
int main()
{
int i = 0;
for (i = 1000; i <=2000; i++)
{
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
int is_leap_year(int i)
{
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int i = 0;
for (i = 1000; i <=2000; i++)
{
if (is_leap_year(i))
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
//二分查找
int cz(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};
int k = 3;
int sz = sizeof(arr) / sizeof(arr[0]);
int j = 0;
int ret=cz(arr, k, sz);
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了下标是%d\n", ret);
}
return 0;
}
不要在函数内部求参数元素的大小
//4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。
void add(int* p)
{
(*p)++;
}
int main()
{
int n = 0;
add(&n);
printf("%d\n", n);
add(&n);
printf("%d\n", n);
return 0;
}
函数的嵌套
链式访问。
printf()函数返回值看字符个数,首先看最内层的函数,打印43,有二个字符,返回2,一个字符返回1
虽然默认是int类型,但是不能这样做。非常不好
函数的递归
这个是倒置的
讲解递归方法
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num = 0;
scanf("%d", &num);
print(num);
return 0;
}
这里的arr传的是首元素地址,地址就是用指针来接受,来存储,*p解引用来找到元素一直自加,直到找到\0才结束。
这里的my_strlen(str+1),str是字符a地址,加一是字符b的地址 1+bc的长度
//实习自定义求字符串长度函数
int my_strlen(char* p)
{
if (*p != '\0')
{
return 1 + my_strlen(p + 1);
}
else
return 0;
}
int main()
{
char arr[] = "abc";//[a b c\0]
int ret=my_strlen(arr);
printf("%d\n", ret);
return 0;
}
//例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
int DigitSum(int n)
{
if (n > 9)
return DigitSum(n / 10) + n % 10;
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = DigitSum(n);
printf("%d ", ret);
return 0;
}
函数的迭代与递归
1!=1,2!=2*1,3!=3*2*1...................
//利用递归求n的阶乘
int dg(int n)
{
if (n <= 1)
{
return 1;
}
return n * dg(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret=dg(n);
printf("%d\n", ret);
return 0;
}
函数栈帧
每一次函数调用,都会向内存栈区申请一块空间,这一块空间主要是用来存放函数中的局部变量,和函数调用过程的上下文的信息,这个一块空间一般叫:函数的运行时堆栈,也叫函数栈帧空间编译会自动根据需要开辟空间的。
斐波拉契数
//斐波那契数
//前二个相加等于后面一个
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d", ret);
return 0;
}
//斐波那契数
//前二个相加等于后面一个
1 1 2 3 5 8 13 21 34 ......
产生新的a和b
//斐波那契数
//前二个相加等于后面一个
int fib(int n)
{
int a = 1;
int b = 1;
int c = 0;
while (n >= 3)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d", ret);
return 0;
}
辗转相除法
就是把a整除b的结果不等于0,就把c赋给b,b赋值给a,直到整除结果等于0,那个除的就是最大公约数。
最小公倍数就是二个数相乘除以最大公约数。
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
while (a % b) {
c = a % b;
a = b;
b = c;
}
printf("最大公约数%d\n", b);
int ret = a * b / b;
printf("最小公倍数%d\n", ret);
return 0;
}
//计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值,打印出结果
//分子总是1,分母是1-100
int main()
{
int i = 0;
double sum = 0;
int flag = 1;
for (i = 1; i <= 100; i++)
{
sum += flag * (1.0 / i);
flag = -flag;
}
printf("%lf", sum);
return 0;
}
99乘法表