分段函数

部分简单分段函数代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <math.h>
int shushu_num = 0;//判断素数个数,全局变量
int pingfanghshu_num = 0;//判断素数个数,全局变量
int shushu(int num) {
for (int i = 2; i <num; i++)
{
if (num%i==0)
{
return 0;
}
}
shushu_num++;
printf("%d ", num);

}

//判断平方数
int pingfanghshu(int num)
{
for (int i = 2; i < num; i++)
{
if (sqrt(num)==i&&num%i==0)
{
printf("%d ", num);
pingfanghshu_num++;
return 0;
}
}
}
//整数因子
int zhengshuyinzi(int num,int *p) {
static int zhengshuyinzi_num = 0;
printf("改前地址%d\n", p);
p = &zhengshuyinzi_num;
printf("改后地址%d\n", p);

printf("%d的整数因子有", num);
for (int i = 1; i <= num; i++)
{
if (num % i == 0)
{
printf("%d ",i);
zhengshuyinzi_num++;
}
}
return zhengshuyinzi_num;
}
//辗转相除求最大公因数
//两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数
int gcd(int a, int b) {
if (a == b)
return a;
if (a < b)
return gcd(b-a, a);
else {
return gcd(a-b, a);
}
}
//阶乘
int jc1(int num) {
int jc = 1;
for (int i = 1; i <= num; i++)
jc *= i;
return jc;
}
//递归求法
int jc2(int num) {
if (num <= 1) {
return 1;
}
else {
return jc2 (num - 1) * num;
}
}

int main()
{

printf("100以内的素数有\n");
for (int i = 2; i < 100; i++)
{
shushu(i);
}
printf("\n共%d个\n",shushu_num);
for (int i = 1; i <=100; i++)
{
pingfanghshu(i);
//这样写有个问题,没有1,可能是sqrt精度问题
}
printf(" 共%d个\n", pingfanghshu_num);
int num=0,*p=&num;
printf(" 共%d个\n", zhengshuyinzi(100, p) );
//printf("%d",zhengshuyinzi_num);
//去掉注释编译器报错,因为这是函数内的局部变量,尽管跳出函数后static变量依然存在
//不会销毁,但是在主函中属于定义域外,不能访问
//此时已经退出zhengshuyinzi,函数的所有局部变量都销毁了,尝试用指针访问不销毁的static变量
printf("主函取的地址%d,num的地址%d\n",p,&num);
//这一步并没有取到值,原因是可以通过指针传地址进去,用指针来修改实参的值
//但是zhengshuyinzi中的指针也是一个局部变量,zhengshuyinzi退出后变量销毁,并没有改变主函的指针指向
//实际上只是改变了zhengshuyinzi中指针p的拷贝的指向,可以用这个指针改变实参,但没有修改主函p指针指向
printf("p的值%d\n",*p);
printf("最大公因数%d\n", gcd(10,100));
printf("100阶乘%d,%d\n", jc1(10),jc2(10));
//注意int的范围,如果阶乘值太大,会溢出
}