OLD

以往旧的内容:不值一提

推箱子单关卡

初次使用二维数组并编写经典小游戏:推箱子!(单关卡)

注:查阅过百度,烦请喷哥留德。

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define H 8
#define L 8
int x,y; // 全局变量存储人的坐标
int map[H][L]=
{
{0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 1, 4, 1, 0, 0, 0},
{0, 0, 1, 0, 1, 1, 1, 1},
{1, 1, 1, 3, 0, 3, 4, 1},
{1, 4, 0, 3, 2, 1, 1, 1},
{1, 1, 1, 1, 3, 1, 0, 0},
{0, 0, 1, 1, 4, 1, 0, 0},
{0, 0, 1, 1, 1, 1, 0, 0} //0 空地,1墙,2人,3箱子,4目的地,7达到目的地 一个隐藏的6也是表示人,只不过这人站在目的地上面。
};
void draw_map();
void move();
void x_y();

int main()
{

while(1)
{
system("cls");
draw_map();
move();
}
}
// 输出图形
void draw_map()
{

int i,j;
for(i=0;i<H;i++)
{
for(j=0;j<L;j++)
{
switch(map[i][j]) // 0=空地,1=墙,2=人,3=箱子,4=目的地;
{
case 0:printf("--");break;
case 1:printf("■");break;
case 2:printf("♀");break;
case 3:printf("◆");break;
case 4:printf("¤");break;
case 6:printf("♂");break;
case 7:printf("★");break;
}
}
printf("\n");
}
}
// 移动
void move()
{
x_y();
boxs_num() ;
char WASD;
WASD =_getch();
switch(WASD)
{
// 上
case 'W':case 'w':case 72:
if( map[x-1][y] == 0 || map[x-1][y] == 4) // 人的前面位置为 空白 或者 人的前面值目的地
{
map[x][y] -=2;
map[x-1][y] +=2;
} //0 空地,1墙,2人,3箱子,4目的地,7达到目的地 一个隐藏的6也是表示人,只不过这人站在目的地上面。
else if( map[x-1][y] == 3 || map[x-1][y] == 7)
{
if(map[x-2][y] == 0 || map[x-2][y] == 4 )
{
map[x][y] -=2;
map[x-1][y] -=1; // 箱子变人
map[x-2][y] +=3; // 箱子前面 的空地变成 箱子
}
}
break;

// 下
case 'S':case 's':case 80:
if( map[x+1][y] == 0 || map[x+1][y] == 4) // 人的前面位置为 空白 或者 人的前面值目的地
{
map[x][y] -=2;
map[x+1][y] +=2;
} //0 空地,1墙,2人,3箱子,4目的地,7达到目的地 一个隐藏的6也是表示人,只不过这人站在目的地上面。
else if( map[x+1][y] == 3 || map[x+1][y] == 7)
{
if(map[x+2][y] == 0 || map[x+2][y] == 4 )
{
map[x][y] -=2;
map[x+1][y] -=1; // 箱子变人
map[x+2][y] +=3; // 箱子前面 的空地变成 箱子
}
}
break;
// 左
case 'A':case 'a':case 75:
if( map[x][y-1] == 0 || map[x][y-1] == 4) // 人的前面位置为 空白 或者 人的前面值目的地
{
map[x][y] -=2;
map[x][y-1] +=2;
} //0 空地,1墙,2人,3箱子,4目的地,7达到目的地 一个隐藏的6也是表示人,只不过这人站在目的地上面。
else if( map[x][y-1] == 3 || map[x][y-1] == 7)
{
if(map[x][y-2] == 0 || map[x][y-2] == 4 )
{
map[x][y] -=2;
map[x][y-1] -=1; // 箱子变人
map[x][y-2] +=3; // 箱子前面 的空地变成 箱子
}
}
break;
// 右
case 'D':case 'd':case 77:
if( map[x][y+1] == 0 || map[x][y+1] == 4) // 人的前面位置为 空白 或者 人的前面值目的地
{
map[x][y] -=2;
map[x][y+1] +=2;
} //0 空地,1墙,2人,3箱子,4目的地,7达到目的地 一个隐藏的6也是表示人,只不过这人站在目的地上面。
else if( map[x][y+1] == 3 || map[x][y+1] == 7)
{
if(map[x][y+2] == 0 || map[x][y+2] == 4 )
{
map[x][y] -=2;
map[x][y+1] -=1; // 箱子变人
map[x][y+2] +=3; // 箱子前面 的空地变成 箱子
}
}
break;

}
}

//获取人的坐标
void x_y()
{
int i,j;
for(i=0;i<H;i++)
{
for(j=0;j<L;j++)
{
if(map[i][j] == 2||map[i][j] == 6)
{x=i;y=j;}
}
}
printf("人的坐标(%d,%d)\n",x,y);
}
// 自动求得箱子个数
int boxs_num()
{
int i,j,boxs=0;
for(i=0;i<H;i++)
{
for(j=0;j<L;j++)
{
if(map[i][j] == 3)
boxs++;
}
}
if( boxs == 0 )
printf("游戏结束!\n");
}

运行结果:

1²+2²+3²+……10²

计算1²+2²+3²+……10²:

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include"stdio.h" 
int main()
{
int i,j,sum=0,temp;
for(i=1;i<=10;i++)
{
temp=i*i;
sum+=temp;
}
printf("sum=%d\n",sum);
}

运行结果:

1+2^2+3^3+4^4+5^5

计算:1+2^2+3^3+4^4+5^5:

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include"stdio.h" 
#define N 5
int main()
{
int i,j,temp,sum=0;
for(i=1;i<=N;i++)
{
temp=1;
for(j=1;j<=i;j++)
temp*=i;
sum+=temp;
}
printf("1+2^2+3^3+4^4+5^5=");
printf(" %d\n",sum);
}

运行结果:

1 3 3 9 2 7 1 4 4 1 6

输出数列: 1 3 3 9 2 7 1 4 4 1 6…… 前20项。

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include"stdio.h" 
#define N 20
int main()
{
int a[N],i,j,t=0;
a[0]=1;
a[1]=3;
for(i=2;i<N;i++)
{
a[i]=a[i-1]*a[i-2];
t=a[i];
if(t>=10)
{
j=t;
a[i]=t/=10;
a[++i]=j%=10;
}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
}

运行结果:

求2+22+222……前7项和

计算 2+22+222+2222+22222+222222+2222222

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include"stdio.h" 
#define N 7
int main()
{
int a,b,i,temp=10,sum=0;
a=b=2;
for(i=0;i<N;i++)
{
printf("%d+",a) ;
sum+=a;
a=b*temp+a;
temp*=10;
}
printf("\b=%d\n",sum);
}

运行结果:

21世纪的闰年和平年

源代码:

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
#include"stdio.h" 
int LeapYear_PeaceYear(int year)
{

if((year%4==0&&year%100!=0)||year%400==0)
return 1;
else
return 0;
}
int main()
{
int year,j=0;
printf("21世纪的闰年和平年:\n");
printf("闰年:\n");
for(year=2001;year<=2100;year++)
if(LeapYear_PeaceYear(year)==1)
{
printf("%d ",year);
j++;
if(j%6==0)
printf("\n");
}

printf("\n平年:\n");
j=0;
for(year=2001;year<=2100;year++)
if(LeapYear_PeaceYear(year)==0)
{
printf("%d ",year);
j++;
if(j%6==0)
printf("\n");
}
printf("\n");
}

运行结果:

九九乘法表

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include"stdio.h"
int main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%2d*%2d=%2d",i,j,i*j);
printf("\n");
}
}

运行结果:

倒着输出

输入一个整数:123 输出:321

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include"stdio.h"
int main()
{
int x,a,r=0,t=10,e;
printf("请输入一个数:\n");
scanf("%d",&x);
e=x;
while(x)
{
a=x%10;
r=r*t+a;
x/=10;
}
printf("%d---%d\n",e,r);
}

运行结果:

你知道你活了多少天了吗?

问题:求你存在于这个美丽世界的天数!

如有误 请指出。

源代码:

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
#include"stdio.h"

int main()
{
int days_of_year(int year);
int between_year_brgin_and_year_end(int year_begin,int year_end) ;
int days(int year,int month,int day);


int year_begin,month_begin,day_begin,sum_begin=0;
int year_end,month_end,day_end,sum_end=0;
int sum_middle=0;
printf("请输入起始日期:\n");
scanf("%d%d%d",&year_begin,&month_begin,&day_begin);
sum_begin=days(year_begin,month_begin,day_begin);//例如:2017 8 20 求1--7月分的天数
sum_begin+=day_begin;//求 1--7份的天数 + 8月 的天数(20) == 232 天
//printf("%d/%d/%d 是%d年的第%d天\n",year_begin,month_begin,day_begin,year_begin,sum_begin);


printf("请输入截止日期:\n");
scanf("%d%d%d",&year_end,&month_end,&day_end);
sum_end=days(year_end,month_end,day_end);//例如:2019 8 20 求1--7月分的天数
sum_end+=day_end;//求 1--7份的天数 + 8月 的天数(20) == 232 天
//printf("%d/%d/%d 是%d年的第%d天\n",year_end,month_end,day_end,year_end,sum_end);
sum_middle+=between_year_brgin_and_year_end(year_begin,year_end);//求起始年份与结束年份 中间年份的天数
//printf("中间年份的天数:%d\n",sum_middle); //例如: 2017--2019 即 求中间年份 2018 的天数


if(year_begin!=year_end)
sum_begin=days_of_year(year_begin)-sum_begin;//求2017 8 20 之后 到2017年的最后一天的 天数
// 例如 2017 8 20 是2017年的 第232天
// 2017年剩余的天数 365-232= 133天


printf("%d/%d/%d--",year_begin,month_begin,day_begin);
printf("%d/%d/%d", year_end,month_end,day_end);
if(year_begin==year_end)
printf("相隔: %d天\n",sum_end-sum_begin);//如果是同一年的情况下:例如:2019/1/1---2019/2/1 ==32-1=31
else
printf("相隔:%d天\n",sum_begin+sum_middle+sum_end);//2017/8/20 --- 2019/8/20
// sum_begin + sum_middle + sum_end
// 133 + 365 + 232
//2017年剩余的天数 + 2018的天数 + 8/20是2019的第 xxx天
if(sum_begin+sum_middle+sum_end>=365)
printf("≈%d年\n",(sum_begin+sum_middle+sum_end)/365);//如果天数太大 转换为大概年份
}
int days_of_year(int year)//求 闰年平年的天数
{
if(year%4==0&&year%100!=0||year%400==0)
return 366;
else
return 365;
}

int between_year_brgin_and_year_end(int year_begin,int year_end)//求起始年份与结束年份 中间年份的天数
{ //例如: 2017--2019 即 求中间年份 2018的天数
int sum=0;
if(year_begin!=year_end)
{
for(year_begin+=1;year_begin<year_end;year_begin++)
sum+=days_of_year(year_begin);
}
return sum;
}

int days(int year,int month,int day)//求某年某月 是某年的多少天
{ //例如: 2019 8 20 前 8-1个月的天数
int sum=0;
switch(month-1)
{
case 12:sum+=31;
case 11:sum+=30;
case 10:sum+=31;
case 9:sum+=30;
case 8:sum+=31;
case 7:sum+=31;
case 6:sum+=30;
case 5:sum+=31;
case 4:sum+=30;
case 3:sum+=31;
case 2:if(year%4==0&&year%100!=0||year%400==0)
sum+=29;
else
sum+=28;
case 1:sum+=31;
}
return sum;
}

运行结果:

斐波拉契数列

fibonacci sequence

利用数组求出斐波拉契数列前20项:

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include"stdio.h" 
#define N 20
int main()
{
int a[N],i;
a[0]=a[1]=1;
printf("斐波拉契数列:\n");
for(i=2;i<N;i++)
{
a[i]=a[i-1]+a[i-2];
}
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
}

运行结果:

质数

除了1和它本身以外不再有其他因数的自然数。

我认为除了1和它本身之外 太孤独了!

so lonely_number()

源代码:

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
#include"stdio.h" 
int lonely_number(int number)//除了1和它本身以外不再有其他因数的自然数。
{
int i;
for(i=2;i<=number/2;i++)
if(number%i==0)
break;
if(i>number/2)
return 1;
else
return 0;
}
int main()
{
int i,j=0;
printf("1000以内的质数(素数):\n");
for(i=1;i<=1000;i++)
{
if(lonely_number(i))
{
printf("%3d ",i);
j++;
if(j%10==0)
printf("\n");
}
}
}

运行结果:

max min sum ave

输入N个数字求出
最大值和最小值

平均值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#define N 5 //自定义几个
int main()
{
int a[N],i,sum=0,ave,max,min;
printf("请输入%d个整数:",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]); //输入N个数字
for(i=0;i<N;i++)
sum+=a[i]; //求和
max=min=a[0]; //假定第一个元素为最大值,最小值
for(i=0;i<N;i++)
{
if(a[i]>max)
max=a[i]; //求最大
else if(a[i]<min)
min=a[i]; //求最小
}
ave=sum/N; //求平均值
printf("max=%d\nmin=%d\nsum=%d\nave=%d\n",max,min,sum,ave);//输出
}

运行结果:
请输入5个整数:1 2 3 4 5
max=5
min=1
sum=15
ave=3

使用python画❤

利用python画一个❤

导入 turtle 库 并起一个别名为: t

这样便于操作:

有点粗糙!

源代码:

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
import turtle as t
#画人
t.color('black')
t.pensize(2)
t.circle(40)
t.right(90)
t.forward(110)
t.right(45)
t.forward(60)
t.penup()
t.backward(60)
t.left(43)
t.pendown()
t.goto(45,-111)
t.goto(45,-180)
t.penup()
t.goto(0,-45)
t.left(90)
t.pendown()
t.goto(70,-45)
t.goto(89,-30)
t.penup()
t.goto(0,-55)
t.pendown()
t.goto(72,-55)
t.right(34)
t.forward(22)
t.penup()
t.left(34)
t.goto(199,-50)
t.pendown()

t.pensize(1)

t.delay(0)
#画❤
def h():
for i in range(200):
t.right(1)
t.forward(1)

t.color('red','pink')
t.begin_fill()
t.left(140)
t.forward(111.65)
h()
t.left(120)
h()
t.forward(111.65)
t.end_fill()

t.hideturtle()




运行结果:

完全数(1000以内)(Perfect number)

输出1000以内的完全数(Perfect number)

如果一个数恰好等于它的因子之和,则称该数为“完全数”

如: 6 ,28, 469 ……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int perfect_number(int number)
{
int s,j;
s=0;
for(j=1;j<=number/2;j++)
if(number%j==0)
s+=j;
if(number==s)
return 1;
else
return 0;
}
int main(int argc, char *argv[])
{
int number;
printf("1000以内的完数:\n");
for(number=1;number<=1000;number++)
if(perfect_number(number)==1)
printf("%d ",number);
}

运行结果:

百钱买鸡

我国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”:

鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

公鸡一只五元,母鸡一只三元,小鸡崽崽三只一元。

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include"stdio.h" 
int main()
{
int cock,hen,chick;
for(cock=0;cock<=20;cock++)//100元全买公鸡可以买20只,也可以不买
for(hen=0;hen<=33;hen++)//100元全买母鸡可以买33只,也可以不买
for(chick=3;chick<=99;chick++)//100元全买小鸡最多99只,且是3的倍数
if(cock*5+hen*3+chick/3==100)//是否花了100元
if(cock+hen+chick==100)//是否总共有100只
if(chick%3==0)//买小鸡的数量是否是3的倍数
printf("cock:%d hen:%d chick:%d\n",cock,hen,chick);
}

运行结果:

大小写互换

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include"stdio.h"
#define N 100
int main()
{
int i;
char ch[N];
printf("请输入一串字符:\n");
gets(ch);
for(i=0;i<N;i++)
{
if(ch[i]>='a'&&ch[i]<='z')
ch[i]-=32;
else if(ch[i]>='A'&&ch[i]<='Z')
ch[i]+=32;
}
puts(ch);
}

运行结果:

单词个数

编写一个程序记录这行一共有多少个单词!

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include"stdio.h"
#define N 100
int main()
{
char ch[N];
int i,sum=0;
printf("请输入一句话:\n");
gets(ch);
for(i=0;ch[i]!='\0';i++)
{
if(ch[i]!=' '&&(ch[i+1]==' '||ch[i+1]=='\0'))
{
sum++;
}
}
printf("一共有 %d 个单词!\n",sum);
}

运行结果:

二分查找

输入一个数,确定它在数组中的位置,如果没有这个数输出-1,否则输出它的下标!

源代码:

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
#include <stdio.h>
#define N 5
int main(int argc, char *argv[])
{
int a[N],i,j,t,h,e,m,n;
m=h=0;
e=N-1;
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=N-1;j>i;j--)
if(a[j]>a[j-1])
t=a[j],a[j]=a[j-1],a[j-1]=t;
printf("此数组:");
for(i=0;i<N;i++)
printf("%d ",a[i]);
putchar('\n');
printf("请输入您要查找的数:\n");
scanf("%d",&n);
while(h<=e)
{
m=(h+e)/2;
if(a[m]==n)
break;
else if(n>a[m])
e=m-1;
else
h=m+1;
}
if(h<=e)
printf("%d的下标为%d\n",n,m);
else
printf("-1\n");
}

运行结果:

汉洛塔

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

18446744073709511615秒

这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

分析:

①: 如果只有 1 个 则 直接从 A 柱 移动到 C 柱

②:>1:

1: 将 n-1 个盘子,从 A 借助 C 移动到: B

2: 将 A 上剩下的 1 个 盘子移动到 C

3: 将 n-1 个盘子, 从 B 借助 A 移动到: C

源代码:

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
#include"stdio.h"

int s=0,i=1; //全局变量

void h(int n,char a,char b,char c)
{
if(n==1)
{
printf("%5d : %c------>%c\n",i++,a,c); // 一个盘子 直接 从 A ----> C
s++;
}
else
{
h(n-1,a,c,b); // 将 n-1 个盘子,从 A 借助 C 移动到: B
printf("%5d : %c------>%c\n",i++,a,c); // 将 A 上剩下的 1 个 盘子移动到 C
h(n-1,b,a,c); // 将 n-1 个盘子, 从 B 借助 A 移动到: C
s++;
}
}

int main()
{
int n;
printf("请输入有几个盘子:");
scanf("%d",&n);

h(n,'A','B','C');

printf("%d个盘子供需移动:%d次!\n",n,s);
}

运行结果:

猴子吃桃

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。求一共有多少个桃!

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第 10 天早上想再吃时,发现只剩下一个桃子了。编
写程序求猴子第一天摘了多少个桃子*/

#include"stdio.h"
int main()
{
int day,peach_before,peach_after=1;
for(day=10;day>1;day--) // 综上所述 最后一天还剩一个桃,故:从后往前推
{
peach_before=(peach_after+1)*2; // 前一天的桃子总数 == (后一天的桃子总数 + 1 ) * 2
peach_after = peach_before; // 之后的一天的数量 == 刚刚得到的结果
}
printf("总共有 %d 个桃!\n",peach_before);
}

运行结果:

回文数

“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。

简单来说: 正读与反读都一样!

源代码:

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
#include"stdio.h"
int h_h(int x)
{
int i,j,m;
for(i=0;i<x;i++)
{
j=i;
m=0;
while(j)
{
m=m*10+j%10;
j/=10;
}
if(i==m)
printf("%d ",i);
}
return i;
}
int main()
{
int x,y,i;
printf("请输入一个范围 如:100\n");
scanf("%d",&x);
if(h_h(x));

}

运行结果:

阶乘

比如 5!=5X4X3X2X1 =120

6! =6X5X4X3X2X1 =720

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include"stdio.h" 
int main()
{
int a,i;
double sum=1;
printf("请输入一个数:\n");
scanf("%d",&a);
for(i=1;i<=a;i++)
{
sum*=i;
}
printf("%d!=%f\n",a,sum);
}

运行结果:

冒泡法排序

冒泡法排序:

源代码:

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
#include"stdio.h" 
#define N 5
int main()
{
int a[N],i,j,t;
printf("请输入%d个数:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++)
{
for(j=N-1;j>i;j--)
{
if(a[j]>a[j-1]) // > 为降序,< 为升序
{
t=a[j],a[j]=a[j-1],a[j-1]=t;
}
}
}
printf("冒泡法排序 降序:\n");
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}

}

运行结果:

x%2==0&&x%3==0

输入一些正整数(以0表示结束),统计并输出能被3整除的偶数的数及个数!

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include"stdio.h"
#include"stdlib.h"
int main()
{
int i,s=0;
printf("请输入一些正整数(以0结束):\n");
while(1)
{
scanf("%d",&i);
if(i==0)
break;
else if(i%2==0&&i%3==0)
{
s++;
printf("%d,",i);
}
}
if(s==0)
exit(0);
else
printf("————能被3整除的偶数 共%d个!\n",s);
}

运行结果:

计算三角形的类型和面积

海伦公式:

海伦公式,传说中是古代的叙拉古国王希伦二世发现的公式,利用三角形的三边来求三角形的面积,但后人求证出此公式其实是 阿基米德这个老头发现的! (详细情况请自行百科:)

ps:中国宋代的数学家秦九韶在1247年独立提出了“三斜求积术”

一个三角形 三边分别为: a、b、c,s为面积

s=(a+b+c)/2

s=根号{s(s-a)(s-b)(s-c)}

此公式就摆脱了 高与底

#include”math.h”

<math.h> 头文件包含了一系列与数学计算相关的函数和宏。

sqrt(平方根计算)

sqrt 就是公式中的根号,用法: sqrt(xxxx)

源代码:

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
#include"stdio.h"
#include"math.h"
int main()
{
float a,b,c,area,s;
printf("请输入三角形的三边长:\n");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c||a+c>b||b+c>a)// 两边之和大于第三边
{
s=(a+b+c)/2;
area=(float)sqrt(s*(s-a)*(s-b)*(s-c));//海伦公式
printf("三角形的面积:%f\n",area);
if(a==b&&a==c)
printf("此为:等边三角形!\n"); //判断等边
else if(a==b||a==c||b==c)
printf("此为:等腰三角形!\n");//判断等腰
else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) //判断直角
printf("此为:直角三角形!\n");
else
printf("此为:普通三角形!\n");//其他普通三角形
}
else
printf("不能构成三角形!\n");
}

运行结果:

十进制转二进制

编写一个C程序实现进制转换:

10 to 2:

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int stoe(int number)
{
int i,e=1;
long sum=0;
while(number)
{
sum+=number%2*e;
number/=2;
e*=10;
}
return sum;
}
int main(int argc, char *argv[])
{
int x;
long y=0;
printf("请输入一个整数:");
scanf("%d",&x);
y=stoe(x);
printf("十进制:%d\n二进制%ld\n",x,y);
}

运行结果:

十进制转二进制数组

编写一个c程序实现使用数组进行进制转换:

10 to 2:

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include"stdio.h"
#define N 100
int main()
{
int a[N],i=0,x;
printf("please enter number:\n");
scanf("%d",&x);
printf("十进制:%d\n",x);
while(x)
{
a[i]=x%2;
x/=2;
i++;
}
printf("二进制:");
for(i--;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}

运行结果:

水仙花

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include"stdio.h"
int sxh(int x)
{
int a,b,c,s;
a=x%10;
b=x/10%10;
c=x/100;
s=a*a*a+b*b*b+c*c*c;
if(x==s)
return 1;
else
return 0;
}
int main()
{
int x,y;
printf("所有的水仙花:\n");
for(x=100;x<=999;x++)
{
if(sxh(x))
printf("%d ",x);
}
}

运行结果:

顺序查找

输入一个数,确定它在数组中的位置,如果没有这个数输出-1,否则输出它的下标!

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include"stdio.h" 
#define N 5
int main()
{
int a[N],i,x;
printf("请输入%d个数:\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("此数组:");
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n请输入你要查找的数字:\n");
scanf("%d",&x);
for(i=0;i<N;i++)
if(a[i]==x)
break;
if(i<N)
printf("%d的下标为%d\n",x,i);
else
printf("-1\n");
}

运行结果:

提取数字或字母

输入一串字符提取其中的数字或字母!

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include"stdio.h" 
#define N 100
int main()
{
char ch[N];
int i,j;
gets(ch);
for(i=j=0;ch[i]!='\0';i++)
{
//if(ch[i]>='a'&&ch[i]<='z'||ch[i]>='A'&&ch[i]<='Z') //提取字母
if(ch[i]>='0'&&ch[i]<='9')//提取数字
{
ch[j]=ch[i];
j++;
}
}
ch[j]='\0';
puts(ch);
}

运行结果:

同构数

正整数n若是它平方数的尾部,则称n为同构数。

例如:5的平方数是25,且5出现在25的右侧,那么5就是一个同构数.。

输出 1000 以内的同构数:

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include"stdio.h" 
#define N 1000
int main()
{
int i,s;
printf("%d 内的同构数:\n",N);
for(i=1;i<=N;i++)
{
s=i*i;
if(s%10==i||s%100==i||s%1000==i)
{
printf("%d---%d ",i,s);
}
}
printf("\n\n");
}

运行结果:

同构数

正整数n若是它平方数的尾部,则称n为同构数。

例如:5的平方数是25,且5出现在25的右侧,那么5就是一个同构数.。

输出 1000 以内的同构数:

源代码:

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
#include"stdio.h" 
int main()
{
int i;
int t(int n);
for(i=1;i<1000;i++)
{
if(t(i)==1)
printf("%d ",i);
}
}
int t(int n)
{
int pp=0;
pp=n*n;
while(n)
{
if(n%10!=pp%10)
break;
n/=10;
pp/=10;
}
if(n==0)
return 1;
else
return 0;
}

运行结果:

完全数(Perfect number)

判断一个数是否为完全数(Perfect number)

如果一个数恰好等于它的因子之和,则称该数为“完全数”

如: 6 ,28, 469 ……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include"stdio.h" 
int main()
{
int number,sum=0,i;
printf("请输入一个数:\n");
scanf("%d",&number);
for(i=1;i<=number/2;i++)
{
if(number%i==0)
sum+=i;
}
if(number==sum)
printf("%d是完数\n",number);
else
printf("%d不是完数\n",number);
}

运行结果:

基姆拉尔森计算公式

通过使用基姆拉尔森计算公式计算星期几!!!

W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7

公式中d表示日期中的日数,m表示月份数,y表示年数

注意:把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

源代码:

①:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include"stdio.h" 
int main()
{
char *weekday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int year,month,day,w;
printf("请输入年/月/日:\n");
scanf("%d%d%d",&year,&month,&day);
if(month==1)
{
month=13;
year--;
}
else if(month==2)
{
month=14;
year--;
}
w=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
printf("%d/%d/%d :%s\n",year,month,day,weekday[w]);

}

②:

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
#include"stdio.h"
int main()
{
int year,month,day,weekday;
printf("请输入年/月/日:\n");
scanf("%d%d%d",&year,&month,&day);
if(month==1)
{
month=13;
year--;
}
else if(month==2)
{
month=14;
year--;
}
weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
printf("%d/%d/%d :",year,month,day);
switch(weekday)
{
case 0:puts("Sunday");break;
case 1:puts("Monday");break;
case 2:puts("Tuesday");break;
case 3:puts("Wednesday");break;
case 4:puts("Thursday");break;
case 5:puts("Friday");break;
case 6:puts("Saturday");break;
}

}

运行结果:

选择排序

选择排序

源代码:

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
#include"stdio.h"
#define N 5
int main()
{
int a[N],i,j,t;
printf("请输入%d个数:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);

}
for(i=0;i<N-1;i++)
{
for(j=i+1;j<N;j++)
{
if(a[j]>a[i]) // > 为降序,< 为升序
{
t=a[j],a[j]=a[i],a[i]=t;
}
}
}
printf("选择排序 降序:\n");
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
}

运行结果:

渔夫打渔晒网

如果一个渔夫从 2019 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2019 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。

源代码:

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
/*如果一个渔夫从 2019 年 1 月 1 日开始每三天打一次渔,两天晒一次网,

编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。*/

/*(1) 自定义函数 leap(),用来判断输入的年份是否是闰年。

(2) 自定义函数 number(),用来计算输入日期距 2019 年 1 月 1 日共有多少天。

(3) main() 函数作为程序的入口函数,在 main() 函数中调用上面两个函数。程序代码如下:*/

#include"stdio.h"

int main()
{
int leap(int year); //函数声明
int number(int y,int m,int d);

int year,month,day,sum=0;
printf("请输入年/月/日:\n");
scanf("%d%d%d",&year,&month,&day);
if(leap(year)==366) //闰年||平年
printf("%d年是闰年!\n",year);
else
printf("%d年是平年!\n",year);

sum=number(year,month,day); //调用函数求天数

if(sum%5<4&&sum%5>0) //如果余数 为 1,2,3 就打渔,否则就 晒网
printf("%d/%d/%d :打渔!\n",year,month,day);
else
printf("%d/%d/%d :晒网!\n",year,month,day);
}

int leap(int year)//求闰年,平年
{
if(year%4==0&&year%100!=0||year%400==0)
return 366;
else
return 365;
}

int number(int y,int m,int d)//求某日 是这年的多少天
{
switch(m-1)
{
case 11:d+=30;
case 10:d+=31;
case 9:d+=30;
case 8:d+=31;
case 7:d+=31;
case 6:d+=30;
case 5:d+=31;
case 4:d+=30;
case 3:d+=31;
case 2:if(y%4==0&&y%100!=0||y%400==0)
d+=29;
else
d+=28;
case 1:d+=31;
}
return d;
}

运行结果:

输入一串字符统计里面各个大写字母的个数

(其它字符同理)

源代码:

无详解!具体自己分析!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include"stdio.h" 
int main()
{
int sum[26],i;
char ch;
for(i=0;i<26;i++)
sum[i]=0;
while((ch=getchar())!='\n')
if(ch>='A'&&ch<='Z')
sum[ch-65]++;
for(i=0;i<26;i++)
if(sum[i]!=0)
printf("字母 %c 有 %d 个!\n",i+65,sum[i]);
}

运行结果:

最大公约数&&最小公倍数

公约数,亦称“公因数”。它是一个能被若干个整数同时均整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。

公倍数(common multiple)是指在两个或两个以上的自然数中,如果它们有相同的倍数,这些倍数就是它们的公倍数。公倍数中最小的,就称为这些整数最小公倍数(lowest common multiple)

示意图:

穷举法

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
#include"stdio.h" 

int max_gys(int number,int number_2)
{
int i,gys=1;
if(number>number_2)
i=number,number=number_2,number_2=i;

for(i=1;i<=number;i++)
if(number%i==0&&number_2%i==0)
gys=i;
return gys;
/*for(i=number;i>0;i--)
if(number%i==0&&number_2%i==0)
{gys=i;break;}
return gys;
*/
}

int min_gbs(int number,int number_2)
{
int i,gbs;
if(number>number_2)
i=number,number=number_2,number_2=i;

for(i=number;i>0;i++)
if(i%number==0&&i%number_2==0)
{
gbs=i;
break;
}
return gbs;
}
int main()
{
int i,a,b,m,n,t,gy,gb;
printf("请输入两个数:\n");
scanf("%d%d",&a,&b);
m=a,n=b;

printf("%d 和 %d 的最大公约数:%d\n",m,n,max_gys(a,b));
printf("%d 和 %d 的最小公倍数:%d\n",m,n,min_gbs(a,b));
/*gb=m*n/max_gys(a,b);//最小公倍数 也可以 两数相乘除以最大公约数 */

}


短除法

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
#include"stdio.h"

int max_gys(int number,int number_2)
{
int i,gys=1;
if(number<number_2)
i=number,number=number_2,number_2=i;

for(i=2;i<=number; )
{
if(number%i==0&&number_2%i==0)
{
number/=i;
number_2/=i;
gys*=i;
}
else
i++;
}
return gys;
}
int main()
{
int i,a,b,m,n,gy=1,gb=1,t;
printf("请输入两个数字:\n");
scanf("%d%d",&a,&b);
m=a,n=b;
gb=m*n/max_gys(a,b);
printf("%d 和 %d的最大公约数为:%d\n",m,n,max_gys(a,b));
printf("%d 和 %d的最小公倍数为:%d\n",m,n,gb);
}

辗转相除法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include"stdio.h" 
int main()
{
int a,b,r,m,n,gb;
printf("请输入两个数:\n");
scanf("%d%d",&a,&b);
m=a,n=b;
while(b) //b=r 即用 a%b 作为循环条件
{
r=a%b;
a=b; //最大公约数 为 a
b=r;
}
gb=m*n/a;
printf("%d和%d的最大公约数为:%d\n",m,n,a);
printf("%d和%d的最小公倍数为:%d\n",m,n,gb);
}

减法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include"stdio.h" 
int main()
{
int a,b,m,n,gb;
printf("请输入两个数:\n");
scanf("%d%d",&a,&b);
m=a,n=b;
while(a!=b)
{
if(a>b) //最大公约数 为 a
a-=b;
if(b>a)
b-=a;
}
gb=m*n/a;
printf("%d和%d的最大公约数为:%d\n",m,n,a);
printf("%d和%d的最小公倍数为:%d\n",m,n,gb);
}

最终结果: