7 | int fun(char *a, char *h, char *p)
8 | {
9 | int i, j;
10 | /*删除指针h与p之间的所有“*”*/
11 | for(i=0,j=0; &h[i]
2 |
3 | int main(){
4 | int a=0; // 素数的个数
5 | int num=0; // 输入的整数
6 |
7 | printf("输入一个整数:");
8 | scanf("%d",&num);
9 |
10 | for(int i=2;i
8 | #include
9 | #include
10 | void main(){
11 | char s[100]; // 存放输入的字符串
12 | int i, j, n;
13 | printf("输入字符串:");
14 | gets(s);
15 |
16 | n=strlen(s);
17 | for(i=0,j=n-1;i=j)
20 | printf("是回文串\n");
21 | else
22 | printf("不是回文串\n");
23 | }
24 |
25 | //运行结果:
26 |
27 | //输入字符串:abcdcba
28 | //是回文串
29 |
--------------------------------------------------------------------------------
/经典项目/动态分配数组大小.c:
--------------------------------------------------------------------------------
1 | //我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。
2 |
3 | //这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源。
4 |
5 | //下面的代码实现了简单的动态数组:
6 |
7 | #include
8 | #include
9 |
10 | int main()
11 | {
12 | //从控制台获取初始数组大小
13 | int N;
14 | int *a;
15 | int i;
16 |
17 | printf("Input array length:");
18 | scanf("%d\n",&N);
19 |
20 | //分配空间
21 | a=(int *)calloc(N,sizeof(int));
22 | //填充数据
23 | for(i=0;i
9 | #include
10 | #include
11 |
12 | #define FILE_PATH "D:/demo.txt" // 文件路径
13 |
14 | int main(){
15 | char name[20]; // 姓名
16 | int age; // 年龄
17 | int studNo; // 学号
18 | float score; // 平均分
19 | FILE *fp; // 文件指针
20 |
21 | // 判断文件是否能够正确创建/打开
22 | if( (fp=fopen(FILE_PATH,"wt+")) == NULL ){
23 | perror(FILE_PATH);
24 | exit(1);
25 | }
26 |
27 | // 从控制台输入学生信息并写入文件
28 | printf("请输入姓名、年龄、学号和平均分(以空格分隔):\n");
29 | while(scanf("%s %d %d %f", name, &age, &studNo, &score)!= EOF){
30 | fprintf(fp,"%s\t%d\t%d\t%f\n", name, age, studNo, score);
31 | }
32 | // 刷新缓冲区,将缓冲区的内容写入文件
33 | fflush(fp);
34 | // 重置文件内部位置指针,让位置指针指向文件开头
35 | rewind(fp);
36 |
37 | // 从文件中读取学生信息
38 | printf("\n读取文件内容:\n");
39 | while(fscanf(fp, "%s\t%d\t%d\t%f", name, &age, &studNo, &score) != EOF){
40 | printf("%s %d %d %f\n", name, age, studNo, score);
41 | }
42 | fclose(fp);
43 |
44 | return EXIT_SUCCESS;
45 | }
46 |
47 |
48 | //运行结果:
49 |
50 | //请输入姓名、年龄、学号和平均分(以空格分隔):
51 | //棍哥 25 1 99.99
52 | //码农宿舍 2 3 89.9
53 | //www.0voice.com 3 2 100
54 | //^Z // ^Z 为 Ctrl+Z 组合键,表示输入结束
55 |
56 | //读取文件内容:
57 | //棍哥 25 1 99.989998
58 | //码农宿舍 2 3 89.900002
59 | //www.0voice.com 3 2 100.000000
60 |
--------------------------------------------------------------------------------
/经典项目/在字符串的指定位置插入字符.c:
--------------------------------------------------------------------------------
1 | /**
2 | 请编写程序,实现以下功能:在字符串中的所有数字字符前加一个$字符。例如,输入 A1B23CD45,输出 A$1B$2$3CD$4$5。
3 | */
4 |
5 | #include
6 | int fun(char *s)
7 | {
8 | char t[80];
9 | int i, j;
10 | for(i=0; s[i]; i++) /*将串s拷贝至串t*/
11 | t[i]=s[i];
12 | t[i]='\0';
13 | for(i=0,j=0; t[i]; i++)
14 | /*对于数字字符先写一个$符号,再写该数字字符*/
15 | if(t[i]>='0' && t[i]<='9')
16 | {
17 | s[j++]='$';
18 | s[j++]=t[i];
19 | }
20 | /*对于非数字字符原样写入串s*/
21 | else
22 | s[j++]=t[i];
23 | s[j]='\0'; /*在串s结尾加结束标志*/
24 | return 0;
25 | }
26 | int main()
27 | {
28 | char s[80];
29 | printf ( "Enter a string:" );
30 | scanf ("%s", s); /*输入字符串*/
31 | fun(s);
32 | printf ("The result: %s\n", s); /*输出结果*/
33 | return 0;
34 | }
35 |
36 | //运行结果:
37 |
38 | //Enter a string:A1B23CD45
39 | //The result: A$1B$2$3CD$4$5
40 |
--------------------------------------------------------------------------------
/经典项目/奶牛生子的问题.c:
--------------------------------------------------------------------------------
1 | //一只刚出生的奶牛,4年生1只奶牛,以后每一年生1只。现在给你一只刚出生的奶牛,求20年后有多少奶牛。
2 |
3 | //本题主要考察读者的分析能力,已知条件有两:
4 | //第一次,4年生一只。
5 | //然后每年生一只。
6 |
7 | //需要的结果中也提供了一个条件,就是20年。读者要注意的本题最难的地方是不光这只奶牛会生奶牛,它的孩子的孩子也会继续生奶牛,读者通过分析下面的代码就能看到难点所在。
8 |
9 | #include
10 |
11 | int CalCowsNum(int iYear){
12 | int iCnt =0;
13 | long lCowsNum = 1; //奶牛总数
14 | for(iCnt=1; iCnt<=iYear; iCnt++){
15 | if(iCnt>=4){ //4年以后奶牛数量开始增多
16 | if((iYear-iCnt)>3){ //第2个4年开始后产的奶牛开始生新奶牛
17 | lCowsNum += CalCowsNum(iYear - iCnt);
18 | }else{
19 | lCowsNum++;
20 | }
21 | }
22 | }
23 |
24 | return lCowsNum; //返回奶牛总数
25 | }
26 |
27 | int main(){
28 | int iYear =0;
29 | printf("Please input require years:");
30 | scanf ("%d", &iYear); //输入年数
31 | printf("In %d years, There is %d cows.\n", iYear, CalCowsNum(iYear)); //输出结果
32 |
33 | return 0;
34 | }
35 |
36 |
37 | //运行结果:
38 | //Please input require years:20
39 | //In 20 years, There is 345 cows.
40 |
--------------------------------------------------------------------------------
/经典项目/委派任务问题.c:
--------------------------------------------------------------------------------
1 | /**
2 | 某项任务需要在A、B、C、D、E、F这6个人中挑选人来完成,但挑选人受限于以下的条件:
3 | (1) A和B两个人至少去一人;
4 | (2) A和D不能同时去;
5 | (3) A、E和F三人中要挑选两个人去;
6 | (4) B和C同时去或者都不去;
7 | (5) C和D两人中只能去一个;
8 | (6) 如果D不去,那么E也不去。
9 |
10 | 试编程求出应该让哪几个人去完成这项任务。
11 | */
12 |
13 | #include
14 |
15 | int main()
16 | {
17 | int A, B, C, D, E, F;
18 | for(A=0; A<=1; A++)
19 | for(B=0; B<=1; B++)
20 | for(C=0; C<=1; C++)
21 | for(D=0; D<=1; D++)
22 | for(E=0; E<=1; E++)
23 | for(F=0; F<=1; F++)
24 | if(A+B>=1 && A+D!=2 && A+E+F==2
25 | && (B+C==0 || B+C==2)
26 | && C+D==1 && (D+E==0 || D==1))
27 | {
28 | printf("A%s被选择去完成任务。\n",A?"":"未");
29 | printf("B%s被选择去完成任务。\n",B?"":"未");
30 | printf("C%s被选择去完成任务。\n",C?"":"未");
31 | printf("D%s被选择去完成任务。\n",D?"":"未");
32 | printf("E%s被选择去完成任务。\n",E?"":"未");
33 | printf("F%s被选择去完成任务。\n",F?"":"未");
34 |
35 | }
36 |
37 | return 0;
38 | }
39 |
40 | //运行结果:
41 |
42 | //A被选择去完成任务。
43 | //B被选择去完成任务。
44 | //C被选择去完成任务。
45 | //D未被选择去完成任务。
46 | //E未被选择去完成任务。
47 | //F被选择去完成任务。
48 |
--------------------------------------------------------------------------------
/经典项目/存钱问题.c:
--------------------------------------------------------------------------------
1 | //假设银行整存整取存款不同期限的月息利率为:
2 |
3 | //0.63% 期限为1年
4 | //0.66% 期限为2年
5 | //0.69% 期限为3年
6 | //0.75% 期限为5年
7 | //84% 期限为8年
8 |
9 | //现在已知某人手上有2000元,要求通过计算选择出一种存钱方案,使得这笔钱存入银行20年后获得的利息最多,假定银行对超出存款期限的那部分时间不付利息。
10 |
11 | #include
12 | #include
13 |
14 | int main()
15 | {
16 | int x1, x2, x3, x5, x8;
17 | int y1 = 0, y2 = 0, y3 = 0, y5 = 0, y8 = 0;
18 | double max=0.0, result = 0.0; /*result变量存放最后结果*/
19 | /*使用for循环穷举所有可能存款方案*/
20 | for( x8=0; x8<=2; x8++ )
21 | for( x5=0; x5<=(20-8*x8)/5; x5++ )
22 | for( x3=0; x3<=(20-8*x8-5*x5)/3; x3++ )
23 | for( x2=0; x2<=(20-8*x8-5*x5-3*x3)/2; x2++ )
24 | {
25 | x1 = 20 - 8*x8 - 5*x5 - 3*x3 - 2*x2; /*存款期限限定条件*/
26 | /*判断条件*/
27 | result = 2000.0 * pow( (1+0.0063*12), x1)
28 | *pow( (1+2*0.0066*12), x2)
29 | *pow( (1+3*0.0069*12), x3)
30 | *pow( (1+5*0.0075*12), x5)
31 | *pow( (1+8*0.0084*12), x8);
32 | /*y1,y2,y3,y5,y8用于记录获利最多的存放方式*/
33 | if(result>max)
34 | {
35 | max = result; /*max变量存放当前的最大值*/
36 | y1 = x1;
37 | y2 = x2;
38 | y3 = x3;
39 | y5 = x5;
40 | y8 = x8;
41 | }
42 | }
43 |
44 | /*输出结果*/
45 | printf("获得利息最多的存款方式为:\n");
46 | printf("8年期限的存了%d次\n", y8);
47 | printf("5年期限的存了%d次\n", y5);
48 | printf("3年期限的存了%d次\n", y3);
49 | printf("2年期限的存了%d次\n", y2);
50 | printf("1年期限的存了%d次\n", y1);
51 | printf("存款人最终的获得的本利合计:%0.2f\n", result);
52 |
53 | return 0;
54 | }
55 |
56 |
57 | //运行结果:
58 |
59 | //获得利息最多的存款方式为:
60 | //8年期限的存了0次
61 | //5年期限的存了4次
62 | //3年期限的存了0次
63 | //2年期限的存了0次
64 | //1年期限的存了0次
65 | //存款人最终的获得的本利合计:8763.19
66 |
--------------------------------------------------------------------------------
/经典项目/定时关机小程序.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | void main()
6 | {
7 | char cmd[20]="shutdown -s -t ";
8 | char t[5]="0";
9 | int c;
10 |
11 | system("title C语言关机程序"); //设置cmd窗口标题
12 | system("mode con cols=48 lines=25"); //窗口宽度高度
13 | system("color f0"); //可以写成 red 调出颜色组
14 | system("date /T");
15 | system("TIME /T");
16 |
17 | printf("----------- C语言关机程序 -----------\n");
18 | printf("1.实现10分钟内的定时关闭计算机\n");
19 | printf("2.立即关闭计算机\n");
20 | printf("3.注销计算机\n");
21 | printf("0.退出系统\n");
22 | printf("-------------------------------------\n");
23 |
24 | scanf("%d",&c);
25 | switch(c) {
26 | case 1:
27 | printf("您想在多少秒后自动关闭计算机?(0~600)\n");
28 | scanf("%s",t);
29 | system(strcat(cmd,t));
30 | break;
31 | case 2:
32 | system("shutdown -p");
33 | break;
34 | case 3:
35 | system("shutdown -l");
36 | break;
37 | case 0:
38 | break;
39 | default:
40 | printf("Error!\n");
41 | }
42 | system("pause");
43 | return 0;
44 | }
45 |
--------------------------------------------------------------------------------
/经典项目/定时关机程序.c:
--------------------------------------------------------------------------------
1 | #
2 |
--------------------------------------------------------------------------------
/经典项目/实现动态数组,克服静态数组大小固定的缺陷.c:
--------------------------------------------------------------------------------
1 | //C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量。一旦定义了一个数组,系统将为它分配一个固定大小的空间,以后不能改变,称为静态数组。但在编程过程中,有时我们所需的内存空间无法预先确定,对于这个问题,用静态数组的办法很难解决。
2 |
3 | //动态数组是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
4 |
5 | //那么,如何创建动态数组,按照需要设置数组大小呢?
6 |
7 |
8 | #include
9 | #include
10 |
11 | int main(){
12 | int arrLen; // 数组长度
13 | int *array; // 数组指针
14 | int i; // 数组下标
15 |
16 | printf("输入数组长度:");
17 | scanf("%d", &arrLen);
18 |
19 | // 动态分配内存空间,如果失败就退出程序
20 | array = (int*)malloc( arrLen*sizeof(int) );
21 | if(!array){
22 | printf("创建数组失败!\n");
23 | exit(1);
24 | }
25 | // 向内存中写入数据
26 | for(i=0; i
5 | #include
6 | #include
7 |
8 | // argc: 统计运行程序时命令行参数的个数
9 | // *argv[]: 储存每个参数的字符串指针,每一个元素对应一个参数
10 | int main (int argc,char *argv[])
11 | {
12 | int ch,bian=0,count=0;
13 | char find[50],temp[1000];
14 | FILE *pt; //文件指针
15 |
16 | // 判断是否输入文件
17 | if (argc != 2){
18 | printf("请使用格式: %s 文件名",argv[0]);
19 | exit(1); //非正常退出
20 | }
21 |
22 | // 判断能否成功打开文件
23 | if ((pt = fopen(argv[1],"r"))== NULL){ //将argv[1]赋值给指针pt
24 | printf("打开文件 %s 失败",argv[1]);
25 | exit(1);
26 | }
27 |
28 | printf("请输入要查找的单词:");
29 | gets(find);
30 | while((ch=getc(pt))!=EOF){ //EOF 表示文件结束
31 | if ((ch!=' ')&&(ch!='\n')){
32 | temp[bian]=ch;
33 | bian++;
34 | } else {
35 | temp[bian]='\0';
36 | if ((strcmp(find,temp))==0) count++;
37 | bian=0;
38 | }
39 | }
40 | printf("共在文件%s中查找到字符串\"%s\" %d 个\n",argv[1],find,count);
41 |
42 | getch();
43 | return 0;
44 | }
45 |
--------------------------------------------------------------------------------
/经典项目/实现的猜拳游戏(剪子锤子布).c:
--------------------------------------------------------------------------------
1 | #
2 |
--------------------------------------------------------------------------------
/经典项目/将一个正整数分解质因数.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int main(){
4 | int n; // 用户输入的整数
5 | int i; // 循环标志
6 |
7 | printf("输入一个整数:");
8 | scanf("%d",&n);
9 | printf("%d=",n);
10 |
11 | // n>=2才执行下面的循环
12 | for(i=2; i<=n; i++){
13 | while(n!=i){
14 | if(n%i==0){
15 | printf("%d*",i);
16 | n=n/i;
17 | }else
18 | break;
19 | }
20 | }
21 | printf("%d\n",n);
22 |
23 | return 0;
24 | }
25 |
26 |
27 | //运行结果:
28 |
29 | //输入一个整数:10000
30 | //10000=2*2*2*2*5*5*5*5
31 |
--------------------------------------------------------------------------------
/经典项目/将字符串转换为整数.c:
--------------------------------------------------------------------------------
1 | //自定义一个函数,将字符串转换为整数,原型为:
2 | //
3 | //int ascii_to_integer( char *string );
4 | //
5 | //这个字符串参数必须包含一个或多个数字,函数应该把这些数字字符转换为整数并返回这个整数。如果字符串参数包含了任何非数字字符,函数就返回零。请不必担心算术溢出。
6 | //提示:这个技巧很简单你每发现一个数字,把当前值乘以10,并把这个值和新数字所代表的值相加。
7 | //这个问题应该用迭代方法解决,而不应采用递归方法。
8 |
9 |
10 | #include
11 |
12 | // 把一个数字字符串转换为一个整数。
13 | int ascii_to_integer( char *string )
14 | {
15 | int value; value = 0;
16 |
17 | // 逐个把字符串的字符转换为数字。
18 | while( *string >= '0' && *string <= '9' ){
19 | value *= 10;
20 | value += *string - '0';
21 | string++;
22 | }
23 |
24 | //错误检查:如杲由于遇到一个非数字字符而终止,把结果设置为0
25 | if( *string != '\0' )
26 | value = 0;
27 | return value;
28 | }
29 |
30 | int main()
31 | {
32 | char* numChar = "102";
33 | printf("%d\n", ascii_to_integer(numChar)+3);
34 |
35 | return 0;
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/经典项目/将真分数分解为埃及分数.c:
--------------------------------------------------------------------------------
1 | //现输入一个真分数,请将该分数分解为埃及分数。
2 |
3 | #include
4 | int main()
5 | {
6 | long int a, b, c;
7 | printf("Please enter a optional fraction(a/b):");
8 | scanf("%ld/%ld", &a, &b); /*输入分子a和分母b*/
9 | printf("It can be decomposed to:");
10 | while(1)
11 | {
12 | if(b%a) /*若分子不能整除分母,则分解出一个分母为b/a+1的埃及分数*/
13 | c = b/a + 1;
14 | else /*否则,输出化简后的真分数(埃及分数)*/
15 | {
16 | c = b / a;
17 | a = 1;
18 | }
19 | if(a==1)
20 | {
21 | printf("1/%ld\n", c);
22 | break; /*a为1标志结束*/
23 | }
24 | else
25 | printf("1/%ld + ", c);
26 | a = a * c - b; /*求出余数的分子*/
27 | b = b * c; /*求出余数的分母*/
28 | if(a==3 && b%2==0) /*若余数分子为3,分母为偶数,输出最后两个埃及分数*/
29 | {
30 | printf("1/%ld + 1/%ld\n", b/2, b);
31 | break;
32 | }
33 | }
34 |
35 | return 0;
36 | }
37 |
38 | //运行结果:
39 |
40 | //Please enter a optional fraction(a/b):8/11
41 | //It can be decomposed to:1/2 + 1/5 + 1/55 + 1/110
42 |
--------------------------------------------------------------------------------
/经典项目/常胜将军问题.c:
--------------------------------------------------------------------------------
1 | /**
2 | 有21根火柴,两人依次取,每次每人只可取走1〜4根,不能多取,也不能不取,谁取到最后一根火柴谁输。
3 | 请编写一个人机对弈程序,要求人先取,计算机后取;计算机为“常胜将军”。
4 | */
5 |
6 | #include
7 | int main()
8 | {
9 | int computer, people, spare = 21;
10 | printf(" -----------------------------------------\n");
11 | printf(" -------- 你不能战胜我,不信试试 --------\n");
12 | printf(" -----------------------------------------\n\n");
13 | printf("Game begin:\n\n");
14 | while(1)
15 | {
16 | printf(" ---------- 目前还有火柴 %d 根 ----------\n", spare);
17 | printf("People:");
18 | scanf("%d", &people);
19 | if(people<1 || people>4 || people>spare)
20 | {
21 | printf("你违规了,你取的火柴数有问题!\n\n");
22 | continue;
23 | }
24 | spare = spare - people;
25 | if( spare==0 )
26 | {
27 | printf("\nComputer win! Game Over!\n");
28 | break;
29 | }
30 | computer = 5 - people;
31 | spare = spare - computer;
32 | printf("Computer:%d \n", computer);
33 | if( spare==0 )
34 | {
35 | printf("\nPeople win! Game Over!\n");
36 | break;
37 | }
38 | }
39 | return 0;
40 | }
41 |
42 | //运行结果:
43 |
44 | /**
45 | -----------------------------------------
46 | -------- 你不能战胜我,不信试试 --------
47 | -----------------------------------------
48 |
49 | Game begin:
50 |
51 | ---------- 目前还有火柴 21 根 ----------
52 | People:1
53 | Computer:4
54 | ---------- 目前还有火柴 16 根 ----------
55 | People:3
56 | Computer:2
57 | ---------- 目前还有火柴 11 根 ----------
58 | People:2
59 | Computer:3
60 | ---------- 目前还有火柴 6 根 ----------
61 | People:4
62 | Computer:1
63 | ---------- 目前还有火柴 1 根 ----------
64 | People:1
65 |
66 | Computer win! Game Over!
67 | */
68 |
--------------------------------------------------------------------------------
/经典项目/平分7筐鱼.c:
--------------------------------------------------------------------------------
1 | /**
2 | 甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,
3 | 另外7筐则是空的,由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不
4 | 将鱼倒出来的前提下,怎样将鱼平分为3份?
5 | */
6 |
7 | #include
8 | int a[3][3], count;
9 | int main()
10 | {
11 | int i, j, k, m, n, flag;
12 | printf("It exists possible distribtion plans:\n");
13 | for(i=0; i<=3; i++) /*试探第一个人满筐a[0][0]的值,满筐数不能>3*/
14 | {
15 | a[0][0]=i;
16 | for(j=i; j<=7-i&&j<=3; j++) /*试探第二个人满筐a[1][0]的值,满筐数不能>3*/
17 | {
18 | a[1][0]=j;
19 | if((a[2][0]=7-j-a[0][0])>3)
20 | continue; /*第三个人满筐数不能>3*/
21 | if(a[2][0]
7 | #define N 14
8 | void main()
9 | {
10 | int i, j, k, n=0, a[N][N]; /*定义二维数组a[14][14]*/
11 | while(n<=0||n>=13){ /*控制打印的行数不要太大,过大会造成显示不规范*/
12 | printf("请输入要打印的行数:");
13 | scanf("%d",&n);
14 | }
15 | printf("%d行杨辉三角如下:\n",n);
16 | for(i=1;i<=n;i++)
17 | a[i][1] = a[i][i] = 1; /*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/
18 | for(i=3;i<=n;i++)
19 | for(j=2;j<=i-1;j++)
20 | a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/
21 | for(i=1;i<=n;i++){
22 | for(k=1;k<=n-i;k++)
23 | printf(" "); /*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/
24 | for(j=1;j<=i;j++) /*j<=i的原因是不输出其它的数,只输出我们想要的数*/
25 | printf("%6d",a[i][j]);
26 |
27 | printf("\n"); /*当一行输出完以后换行继续下一行的输出*/
28 | }
29 | printf("\n");
30 | }
31 |
32 |
33 | //运行结果:
34 | //请输入要打印的行数:10
35 | //10行杨辉三角如下:
36 | // 1
37 | // 1 1
38 | // 1 2 1
39 | // 1 3 3 1
40 | // 1 4 6 4 1
41 | // 1 5 10 10 5 1
42 | // 1 6 15 20 15 6 1
43 | // 1 7 21 35 35 21 7 1
44 | // 1 8 28 56 70 56 28 8 1
45 | // 1 9 36 84 126 126 84 36 9 1
46 |
--------------------------------------------------------------------------------
/经典项目/打鱼还是晒网问题.c:
--------------------------------------------------------------------------------
1 | #
2 |
--------------------------------------------------------------------------------
/经典项目/找到一个数的所有真因子.c:
--------------------------------------------------------------------------------
1 | //下面的代码,提示用户输入一个整数,并判断是否是素数,如果是将输出它本身,否则输出所有的真因子。
2 |
3 |
4 | #include
5 |
6 | int main(void) {
7 | int n,
8 | lcv,
9 | flag; // flag 被初始化为 1,如果后续判断 n 不是素数,那么它将变为 0
10 |
11 | printf("Enter value of N > ");
12 | scanf("%d", &n);
13 | for (lcv=2, flag=1; lcv <= (n / 2); lcv++) {
14 | if ((n % lcv) == 0) {
15 | if (flag)
16 | printf("The non-trivial factors of %d are: \n", n);
17 | flag = 0;
18 | printf("\t%d\n", lcv);
19 | }
20 | }
21 | if (flag)
22 | printf("%d is prime\n", n);
23 | }
24 |
25 |
26 | //可能的输出结果:
27 | //Enter value of N > 100 The non-trivial factors of 100 are:
28 | // 2
29 | // 4
30 | // 5
31 | // 10
32 | // 20
33 | // 25
34 | // 50
35 |
--------------------------------------------------------------------------------
/经典项目/抓交通肇事犯问题.c:
--------------------------------------------------------------------------------
1 | #
2 |
--------------------------------------------------------------------------------
/经典项目/换分币问题.c:
--------------------------------------------------------------------------------
1 | //将5元的人民币兑换成1元、5角和1角的硬币,共有多少种不同的兑换方法。
2 |
3 | #include
4 | int main()
5 | {
6 | int x, y, z, count=1;
7 | printf("可能的兑换方法如下:\n");
8 | for( x=0; x<=50; x+=10 ) /*x为1元硬币钱数,其取值为0,10,20,30,40,50*/
9 | for( y=0; y<=50-x; y+=5 ) /*y为5角硬币钱数,其取值为0,5,10,15,20,25,30,35,40,,45,50*/
10 | for( z=0; z<=50-x-y; z++) /*z为1角硬币钱数,其取值为0,1,...50*/
11 | if(x+y+z==50)
12 | {
13 | /*输出时,每行最多三种情况*/
14 | printf(count%3 ? "%d: 10*%d+5*%d+1*%d\t" : "%d:10*%d+5*%d+1*%d\n", count, x/10, y/5, z);
15 | count++;
16 | }
17 | return 0;
18 | }
19 |
20 | //运行结果:
21 |
22 | //可能的兑换方法如下:
23 | //1: 10*0+5*0+1*50 2: 10*0+5*1+1*45 3:10*0+5*2+1*40
24 | //4: 10*0+5*3+1*35 5: 10*0+5*4+1*30 6:10*0+5*5+1*25
25 | //7: 10*0+5*6+1*20 8: 10*0+5*7+1*15 9:10*0+5*8+1*10
26 | //10: 10*0+5*9+1*5 11: 10*0+5*10+1*0 12:10*1+5*0+1*40
27 | //13: 10*1+5*1+1*35 14: 10*1+5*2+1*30 15:10*1+5*3+1*25
28 | //16: 10*1+5*4+1*20 17: 10*1+5*5+1*15 18:10*1+5*6+1*10
29 | //19: 10*1+5*7+1*5 20: 10*1+5*8+1*0 21:10*2+5*0+1*30
30 | //22: 10*2+5*1+1*25 23: 10*2+5*2+1*20 24:10*2+5*3+1*15
31 | //25: 10*2+5*4+1*10 26: 10*2+5*5+1*5 27:10*2+5*6+1*0
32 | //28: 10*3+5*0+1*20 29: 10*3+5*1+1*15 30:10*3+5*2+1*10
33 | //31: 10*3+5*3+1*5 32: 10*3+5*4+1*0 33:10*4+5*0+1*10
34 | //34: 10*4+5*1+1*5 35: 10*4+5*2+1*0 36:10*5+5*0+1*0
35 |
--------------------------------------------------------------------------------
/经典项目/掷骰子游戏.c:
--------------------------------------------------------------------------------
1 | /**
2 | 骰子是一个有六个面的正方体,每个面分别印有1〜6之间的小圆点代表点数。假设这个游戏的规则是:
3 | 两个人轮流掷骰子6次,并将每次投掷的点数累加起来。点数多者获胜;点数相同则为平局。
4 |
5 | 要求编写程序模拟这个游戏的过程,并求出玩100盘之后谁是最终的获胜者。
6 | */
7 |
8 | #include
9 | #include
10 | #include
11 | int main()
12 | {
13 | int d1, d2, c1, c2, i, j;
14 | c1 = c2 = 0; /*初始化*/
15 | srand((unsigned)time(NULL));
16 | rand(); /*初始化随机数产生器*/
17 | for(i=1; i<=100; i++)
18 | { /*模拟游戏过程*/
19 | d1 = d2 = 0;
20 | for(j=1; j<=6; j++)
21 | { /*两个人轮流掷骰子*/
22 | d1 = d1+rand()+1;
23 | d2 = d2+rand()+1;
24 | }
25 | if(d1>d2)
26 | c1++; /*累加获胜盘数*/
27 | else if(d1c2) /*输出最终获胜者信息*/
31 | printf("\nThe first win.\n");
32 | else
33 | if (c1
7 | int main(){
8 | int a[4][4],b[4][4],i,j; /*a 存放原始数组数据,b 存放旋转后数组数据*/
9 | printf("input 16 numbers: ");
10 | /*输入一组数据存放到数组 a 中,然后旋转存放到 b 数组中*/
11 | for(i=0;i<4;i++){
12 | for(j=0;j<4;j++){
13 | scanf("%d",&a[i][j]);
14 | printf("%6d",a[i][j]);
15 | b[3-j][i]=a[i][j];
16 | }
17 | printf("\n");
18 | }
19 | printf("array b:\n");
20 | for(i=0;i<4;i++){
21 | for(j=0;j<4;j++)
22 | printf("%6d",b[i][j]);
23 | printf("\n");
24 | }
25 | return 0;
26 | }
27 |
28 | //运行结果:
29 | //input 16 numbers: 1 34 6 4 56 2 5 6 9 12 23 23 46 77 12 34
30 | // 1 34 6 4
31 | // 56 2 5 6
32 | // 9 12 23 23
33 | // 46 77 12 34
34 | //array b:
35 | // 4 6 23 34
36 | // 6 5 23 12
37 | // 34 2 12 77
38 | // 1 56 9 46
39 |
--------------------------------------------------------------------------------
/经典项目/文本文件复制代码.c:
--------------------------------------------------------------------------------
1 | //下面的程序,与 Unix 的 cp 命令类似,需要两个文件名作为参数,将第一个文件的内容复制到第二个文件。
2 |
3 | //该程序涉及到main()函数传参的问题,请查看:C语言mian()函数详解
4 |
5 |
6 | #include
7 | #include
8 |
9 | int main(int argc, char * argv[]){
10 | FILE *fin, *fout;
11 | char c;
12 |
13 | if (argc!=3){
14 | printf("Usage: %s filein fileout\n", argv[0]);
15 | exit(0);
16 | }
17 | if ((fin=fopen(argv[1],"r"))==NULL){
18 | perror("fopen filein");
19 | exit(0);
20 | }
21 | if ((fout=fopen(argv[2],"w"))==NULL){
22 | perror("fopen fileout");
23 | exit(0);
24 | }
25 |
26 | while ((c=getc(fin))!=EOF)
27 | putc(c,fout);
28 |
29 | fclose(fin);
30 | fclose(fout);
31 | return 0;
32 | }
33 |
--------------------------------------------------------------------------------
/经典项目/新娘和新郎问题.c:
--------------------------------------------------------------------------------
1 | //对情侣参加婚礼,3个新郞为A、B、C,3个新娘为X、Y、Z,有人不知道谁和谁结婚,于是询问了6位新人中的3位,但听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C; C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。
2 | //算法分析
3 | //将A、B、C这3人用 1、2、3 表示,将X和A结婚表示为“X=1”,将Y不与A结婚表示为“Y!=1”。按照题目中的叙述可以写出表达式:
4 | //x!=1 A不与X结婚
5 | //x!=3 X的未婚夫不是C
6 | //z!=3 C不与Z结婚题意还隐含着X、Y、Z这3个新娘不能结为配偶,则有:x!=y 且x!=z且y!=z,穷举以上所有可能的情况,代入上述表达式中进行推理运算,若假设的情况使上述表达式的结果均为真,则假设情况就是正确的结果。
7 |
8 | //根据算法分析,可以利用计算机程序对这些情况进行穷举,然后得出正确的结果。
9 | //根据算法分析,该问题的程序实现如下:
10 |
11 |
12 | #include
13 |
14 | void Marry(void);
15 |
16 | int main(){
17 | Marry();
18 |
19 | return 0;
20 | }
21 |
22 | void Marry(){
23 | int x, y, z;
24 | for (x=1;x<=3;x++) //穷举x的全部可能配偶
25 | for (y=1;y<=3;y++) //穷举y的全部可能配偶
26 | for(z=1;z<=3;z++) //穷举z的全部可能配偶
27 | if (x!=1 && x!=3 && z!=3 && x!=y && x!=z && y!=z){ //判断配偶是否满足题意
28 | printf ("X和%c结婚\n", 'A'+x-1); //打印判断结果
29 | printf ("Y和%c结婚\n", 'A'+y-1);
30 | printf ("Z和%c结婚\n", 'A'+z-1);
31 | }
32 | }
33 |
34 |
35 | //运行结果:
36 | //X和B结婚
37 | //Y和C结婚
38 | //Z和A结婚
39 |
--------------------------------------------------------------------------------
/经典项目/新郎和新娘问题.c:
--------------------------------------------------------------------------------
1 | /**
2 | 有3对情侣结婚,假设2个新郎为A、B、C,3个新娘为X、Y、Z,有参加婚礼的人搞不清谁和谁结婚,所以去询问了这6位新人中的3位,
3 | 得到的回答如下:新郎A说他要和新娘X结婚;新娘X说她的未婚夫是新郎C;而新郎C说他要和新娘Z结婚。
4 |
5 | 听到这样的回答后,提问者知道他们都是在开玩笑,说的都是假话,但他仍搞不清谁和谁结婚,现在请编程求出到底哪位新郎和哪位新
6 | 娘结婚。
7 | */
8 |
9 | #include
10 | int main()
11 | {
12 | char x, y, z;
13 | for(x='A'; x<='C'; x++)
14 | for(y='A'; y<='C'; y++)
15 | for(z='A'; z<='C'; z++)
16 | if(x!='A' && x!='C' && z!='C' && x!=y && x!=z && y!=z)
17 | {
18 | printf("结果为:\n");
19 | printf("新娘X与新郎%c结婚。\n", x);
20 | printf("新娘Y与新郎%c结婚。\n", y);
21 | printf("新娘Z与新郎%c结婚。\n", z);
22 | }
23 |
24 | return 0;
25 | }
26 |
27 | //运行结果:
28 |
29 | //结果为:
30 | //新娘X与新郎B结婚。
31 | //新娘Y与新郎C结婚。
32 | //新娘Z与新郎A结婚。
33 |
--------------------------------------------------------------------------------
/经典项目/最佳存款方案.c:
--------------------------------------------------------------------------------
1 | //假设银行一年整存零取的月息为 0.63%。现在某人手中有一笔钱,他打算在今后的 5 年中的每年年底取出 1000 元,到第 5 年时刚好取完,请算出他存钱时应存入多少。
2 |
3 |
4 | #include
5 | int main()
6 | {
7 | int i;
8 | double money=0.0;
9 | for(i=0; i<5; i++)
10 | money=(money+1000.0)/(1+0.0063*12);
11 | printf("应存入的钱数为:%0.2f\n", money); /*结果保留两位小数*/
12 | return 0;
13 | }
14 |
15 | //运行结果:
16 |
17 | //应存入的钱数为:4039.44
18 |
--------------------------------------------------------------------------------
/经典项目/歌星大奖赛.c:
--------------------------------------------------------------------------------
1 | //在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1〜100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
2 |
3 | #include
4 | int main()
5 | {
6 | int m, n, temp, i;
7 | printf("Input m & n:");
8 | scanf("%d%d", &m, &n);
9 | if(m0; i++) /*从大数开始寻找满足条件的自然数*/
16 | if(i%m==0 && i%n==0)
17 | {/*输出满足条件的自然数并结束循环*/
18 | printf("The LCW of %d and %d is: %d\n", m, n, i);
19 | break;
20 | }
21 |
22 | return 0;
23 | }
24 |
25 | //运行结果:
26 |
27 | //Input m & n:6 24
28 | //The LCW of 24 and 6 is: 24
29 |
--------------------------------------------------------------------------------
/经典项目/比较两个分数的大小.c:
--------------------------------------------------------------------------------
1 | //比较两个分数的大小。
2 |
3 | #include
4 | int zxgb(int a, int b); /*函数声明*/
5 | int main()
6 | {
7 | int i, j, k, l, m, n;
8 | printf("Input two FENSHU:\n");
9 | scanf("%d/%d,%d/%d", &i, &j, &k, &l); /*输入两个分数*/
10 | m=zxgb(j, l)/j*i; /*求出第一个分数通分后的分子*/
11 | n=zxgb(j, l)/l*k; /*求出第二个分数通分后的分子*/
12 | if(m>n) /*比较分子的大小*/
13 | printf("%d/%d>%d/%d\n", i, j, k, l);
14 | else
15 | if(m == n)
16 | printf("%d/%d=%d/%d\n", i, j, k, l); /*输出比较的结果*/
17 | else
18 | printf("%d/%d<%d/%d\n", i, j, k, l);
19 | return 0;
20 | }
21 | int zxgb(int a, int b)
22 | {
23 | long int c;
24 | int d;
25 | /*若a
4 | int main()
5 | {
6 | int hun, ten, ind, n;
7 | printf("result is:");
8 | for( n=100; n<1000; n++ ) /*整数的取值范围*/
9 | {
10 | hun = n / 100;
11 | ten = (n-hun*100) / 10;
12 | ind = n % 10;
13 | if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind) /*各位上的立方和是否与原数n相等*/
14 | printf("%d ", n);
15 | }
16 | printf("\n");
17 |
18 | return 0;
19 | }
20 |
21 | //运行结果:
22 |
23 | //result is:153 370 371 407
24 |
--------------------------------------------------------------------------------
/经典项目/求nt的值(3种方法).c:
--------------------------------------------------------------------------------
1 | //求π的近似值,一般有两个公式,如下所示:
2 |
3 | //公式①:
4 | // π/4 ≈ 1 - 1/3 + 1/5 - 1/7 + ...
5 |
6 | //公式②:
7 | // π/2 ≈ 2/1 * 2/3 * 4/3 * 4/5 * 6/5 * 6/7 * ...
8 |
9 | //题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止。
10 | //题目2) 根据公式②,用前100项之积计算π的值。
11 | //题目1)提供了一种解法,题目2)提供了两种解法,请看解析。
12 |
13 |
14 |
15 | #include
16 | #include
17 | #include
18 | int main(){
19 | float s=1;
20 | float pi=0;
21 | float i=1.0;
22 | float n=1.0;
23 | while(fabs(i)>=1e-6){
24 | pi+=i;
25 | n=n+2;
26 | // 这里设计的很巧妙,每次正负号都不一样
27 | s=-s;
28 | i=s/n;
29 | }
30 | pi=4*pi;
31 | printf("pi的值为:%.6f\n",pi);
32 |
33 | return 0;
34 | }
35 |
36 |
37 | //运行结果:
38 | //pi的值为:3.141594
39 |
--------------------------------------------------------------------------------
/经典项目/求不重复的3位数.c:
--------------------------------------------------------------------------------
1 | //用1、2、3、4共4个数字能组成多少个互不相同且无重复数字的三位数?都是多少?
2 |
3 | #include
4 |
5 | int main()
6 | {
7 | int i, j, k, count=0;
8 | for(i=1; i<5; i++)
9 | for(j=1; j<5; j++)
10 | for(k=1; k<5; k++)
11 | {
12 | if(i!=k && i!=j && j!=k) /*判断三个数是否互不相同*/
13 | {
14 | count++;
15 | printf("%d%d%d ", i, j, k);
16 | if(count%8 == 0) /*每输出8个数换行*/
17 | printf("\n");
18 | }
19 | }
20 | printf("\nThe total number is %d.\n", count);
21 |
22 | return 0;
23 | }
24 |
25 |
26 | //运行结果:
27 |
28 | //123 124 132 134 142 143 213 214
29 | //231 234 241 243 312 314 321 324
30 | //341 342 412 413 421 423 431 432
31 | //
32 | //The total number is 24.
33 |
--------------------------------------------------------------------------------
/经典项目/求亲密数.c:
--------------------------------------------------------------------------------
1 | //如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
2 |
3 |
4 | #include
5 | int main()
6 | {
7 | int a, i, b, n;
8 | printf("There are following friendly--numbers pair smaller than 3000:\n");
9 | for( a=1; a<3000; a++ ) /*穷举3000以内的全部整数*/
10 | {
11 | for( b=0, i=1; i<=a/2; i++) /*计算数a的各因子,各因子之和存放于b*/
12 | if(!(a%i))
13 | b+=i;
14 | for( n=0, i=1; i<=b/2; i++ ) /*计算b的各因子,各因子之和存于n*/
15 | if(!(b%i))
16 | n+=i;
17 | if(n==a && a
5 | #include
6 | int main()
7 | {
8 | int a, b, c, count=0;
9 | printf("100以内的勾股数有:\n");
10 | printf(" a b c a b c a b c a b c\n");
11 | /*求100以内勾股数*/
12 | for(a=1; a<=100; a++)
13 | for(b=a+1; b<=100; b++)
14 | {
15 | c=(int)sqrt(a*a+b*b); /*求c值*/
16 | if(c*c==a*a+b*b && a+b>c && a+c>b && b+c>a && c<=100) /*判断c的平方是否等于a2+b2*/
17 | {
18 | printf("%4d %4d %4d ", a, b, c);
19 | count++;
20 | if(count%4==0) /*每输出4组解就换行*/
21 | printf("\n");
22 | }
23 | }
24 |
25 | printf("\n");
26 | return 0;
27 | }
28 |
29 |
30 | //运行结果:
31 |
32 | /*
33 | 100以内的勾股数有:
34 | a b c a b c a b c a b c
35 | 3 4 5 5 12 13 6 8 10 7 24 25
36 | 8 15 17 9 12 15 9 40 41 10 24 26
37 | 11 60 61 12 16 20 12 35 37 13 84 85
38 | 14 48 50 15 20 25 15 36 39 16 30 34
39 | 16 63 65 18 24 30 18 80 82 20 21 29
40 | 20 48 52 21 28 35 21 72 75 24 32 40
41 | 24 45 51 24 70 74 25 60 65 27 36 45
42 | 28 45 53 28 96 100 30 40 50 30 72 78
43 | 32 60 68 33 44 55 33 56 65 35 84 91
44 | 36 48 60 36 77 85 39 52 65 39 80 89
45 | 40 42 58 40 75 85 42 56 70 45 60 75
46 | 48 55 73 48 64 80 51 68 85 54 72 90
47 | 57 76 95 60 63 87 60 80 100 65 72 97
48 | */
49 |
--------------------------------------------------------------------------------
/经典项目/求回文数.c:
--------------------------------------------------------------------------------
1 | //打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。
2 |
3 |
4 | #include
5 | int main()
6 | {
7 | int m[16], n, i, t, count=0;
8 | long unsigned a, k;
9 | printf("No. number it's square(palindrome)\n");
10 | for( n=1; n<256; n++ ) /*穷举n的取值范围*/
11 | {
12 | k=0; t=1; a=n*n; /*计算n的平方*/
13 | for( i=0; a!=0; i++ ) /*从低到高分解数a的每一位存于数组m[1]~m[16]*/
14 | {
15 | m[i] = a % 10;
16 | a /= 10;
17 | }
18 | for(; i>0; i--)
19 | {
20 | k += m[i-1] * t; /*t记录某一位置对应的权值 */
21 | t *= 10;
22 | }
23 | if(k == n*n)
24 | printf("%2d%10d%10d\n", ++count, n, n*n);
25 | }
26 | return 0;
27 | }
28 |
29 | //运行结果:
30 |
31 | //No. number it's square(palindrome)
32 | //1 1 1
33 | //2 2 4
34 | //3 3 9
35 | //4 11 121
36 | //5 22 484
37 | //6 26 676
38 | //7 101 10201
39 | //8 111 12321
40 | //9 121 14641
41 | //10 202 40804
42 | //11 212 44944
43 |
--------------------------------------------------------------------------------
/经典项目/求回文素数.c:
--------------------------------------------------------------------------------
1 | /**
2 | 所谓回文素数指的是,对一个整数n从左向右和从右向左读其数值都相同且n为素数,则称整数为回文素数。
3 |
4 | 对于偶数位的整数,除了11以外,都不存在回文素数。即所有的4位整数、6位整数、 8位整数…都不存在回文素数。下面列出两位和三位整数中包含的所有回文素数。
5 |
6 | 两位回文素数:11
7 |
8 | 三位回文素数:101、131、151、181、191、313、353、373、383、727、757、787、 797、 919、 929
9 |
10 | 本题要求解的问题是:求出所有不超过1000的回文素数。
11 | */
12 |
13 | #include
14 |
15 | int fun(int n);
16 |
17 | int main()
18 | {
19 | int i, j, k, n, m;
20 | printf("不超过1000的回文数:\n");
21 | for(i=0; i<=9; ++i) /*穷举第一位*/
22 | for(j=0; j<=9; ++j) /*穷举第二位*/
23 | for(k=0; k<=9; ++k) /*穷举第三位*/
24 | {
25 | n=i*100+j*10+k; /*计算组成的整数*/
26 | m=k*100+j*10+i; /*计算对应的反序数*/
27 | if(i==0 && j==0) /*处理整数的前两位为0的情况*/
28 | {
29 | m=m/100;
30 | }
31 | else if(i==0) /*处理整数的第一位为0的情况*/
32 | {
33 | m=m/10;
34 | }
35 | if(n>10 && n==m && fun(n)) /*若大于10且为回文素数,则输出*/
36 | {
37 | printf("%d\t", n);
38 | }
39 | }
40 | printf("\n");
41 |
42 | return 0;
43 | }
44 |
45 | /*判断参数n是否为素数*/
46 | int fun(int n)
47 | {
48 | int i;
49 | for(i=2; i<(n-1)/2; ++i)
50 | {
51 | if(n%i == 0)
52 | return 0;
53 | }
54 | return 1;
55 | }
56 |
57 |
58 | //运行结果:
59 |
60 | //不超过1000的回文数:
61 | //11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
62 |
--------------------------------------------------------------------------------
/经典项目/求多项式之和.c:
--------------------------------------------------------------------------------
1 | /**
2 | 计算下列多项式的值:
3 |
4 | S = 1 + 1/(1*2) + 1/(1*2*3) + ... + 1/(1*2*3* ... * 50)
5 |
6 | 从键盘上输入50后,输出为1.718282。
7 | */
8 |
9 | #include
10 | int main()
11 | {
12 | double s=0, t; /*s记录多项式的和、t记录每一项分式的分母*/
13 | int i, n, j; /*n控制项数*/
14 | printf("please input the number of n:"); /*输入n的值*/
15 | scanf("%d", &n);
16 | for(i=1; i<=n; i++) /*i控制对应项数*/
17 | {
18 | t=1; /*每次循环之前给t赋初值*/
19 | for(j=1; j<=i; j++)
20 | t = t * j; /*求每一项的阶乘*/
21 | s = s + 1/t;
22 | }
23 | printf("%f\n", s);
24 |
25 | return 0;
26 | }
27 |
28 |
29 | //运行结果
30 |
31 | //please input the number of n:50
32 | //1.718282
33 |
--------------------------------------------------------------------------------
/经典项目/求孪生素数.c:
--------------------------------------------------------------------------------
1 | /**
2 | 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经近的不能再近了,如同孪生兄弟一样,所以将这一对素数称为孪生素数。
3 |
4 | 显然,最小的一对孪生素数是(1,3)。我们可以写出3〜100以内的孪生素数,一共有8对,分别是(3,5),(5,7),(11,13),(17,19),
5 | (29,31),(41,43),(59,61)和(71,73)。随着数字的增大,孪生素数的分布也越来越稀疏,人工寻找孪生素数变得非常困难。
6 |
7 | 本题要解决的问题是:编程求出3〜1000以内的所有孪生素数。
8 | */
9 |
10 |
11 | #include
12 | #include
13 |
14 | int prime(int n)
15 | {
16 | int j;
17 | long k;
18 | k=sqrt(n)+1;
19 | for(j=2; j<=k; j++)
20 | {
21 | if (n%j == 0)
22 | {
23 | return 0; /*n能被j整除,不是素数,返回0*/
24 | }
25 | }
26 | return 1; /*n是素数,返回1*/
27 | }
28 |
29 | int main ()
30 | {
31 | int i, count=0;
32 | printf("The twin prime pairs between 3 and 1000 are: \n");
33 | for (i=3; i<1000; i++)
34 | if( prime(i) && prime(i+2) )
35 | {
36 | printf("(%-3d,%3d) ", i, i+2);
37 | count++;
38 | if(count%5 == 0) /*变量count控制每行打印的个数,每打印5对孪生素数换行*/
39 | printf("\n");
40 | }
41 |
42 | return 0;
43 | }
44 |
45 |
46 | //运行结果:
47 |
48 | //The twin prime pairs between 3 and 1000 are:
49 | //(3 , 5) (5 , 7) (11 , 13) (17 , 19) (29 , 31)
50 | //(41 , 43) (59 , 61) (71 , 73) (101,103) (107,109)
51 | //(137,139) (149,151) (179,181) (191,193) (197,199)
52 | //(227,229) (239,241) (269,271) (281,283) (311,313)
53 | //(347,349) (419,421) (431,433) (461,463) (521,523)
54 | //(569,571) (599,601) (617,619) (641,643) (659,661)
55 | //(809,811) (821,823) (827,829) (857,859) (881,883)
56 |
--------------------------------------------------------------------------------
/经典项目/求完数.c:
--------------------------------------------------------------------------------
1 | //求某一范围内完数的个数。
2 | //如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。
3 |
4 |
5 | #include
6 | int main()
7 | {
8 | int i, j, s, n; /*变量i控制选定数范围,j控制除数范围,s记录累加因子之和*/
9 | printf("请输入所选范围上限:");
10 | scanf("%d", &n); /* n的值由键盘输入*/
11 | for( i=2; i<=n; i++ )
12 | {
13 | s=0; /*保证每次循环时s的初值为0*/
14 | for( j=1; j
4 | int main()
5 | {
6 | int m, n, temp, i;
7 | printf("Input m & n:");
8 | scanf("%d%d", &m, &n);
9 | if(m0; i--) /*按照从大到小的顺序寻找满足条件的自然数*/
16 | if(m%i==0 && n%i==0)
17 | {/*输出满足条件的自然数并结束循环*/
18 | printf("The GCD of %d and %d is: %d\n", m, n, i);
19 | break;
20 | }
21 |
22 | return 0;
23 | }
24 |
25 | //运行结果:
26 |
27 | //Input m & n:100 125
28 | //The GCD of 125 and 100 is: 25
29 |
--------------------------------------------------------------------------------
/经典项目/求最小公倍数.c:
--------------------------------------------------------------------------------
1 | //求任意两个正整数的最小公倍数(LCM)。
2 |
3 | #include
4 | int main()
5 | {
6 | int m, n, temp, i;
7 | printf("Input m & n:");
8 | scanf("%d%d", &m, &n);
9 | if(m0; i++) /*从大数开始寻找满足条件的自然数*/
16 | if(i%m==0 && i%n==0)
17 | {/*输出满足条件的自然数并结束循环*/
18 | printf("The LCW of %d and %d is: %d\n", m, n, i);
19 | break;
20 | }
21 |
22 | return 0;
23 | }
24 |
25 |
26 | //运行结果:
27 |
28 | //Input m & n:6 24
29 | //The LCW of 24 and 6 is: 24
30 |
--------------------------------------------------------------------------------
/经典项目/求某一年的某一月有多少天问题.c:
--------------------------------------------------------------------------------
1 | //从键盘输入年号和月号,求这一年的这一月共有多少天。
2 | //分析
3 | //这个问题需要考虑闰年问题,因为二月份的天数与闰年有关。闰年的判断依据是:若某年能被4整除,但不能被100整除,则这一年是闰年;若某年能被400整除,则这一年也是闰年。请考虑:闰年如何表达?
4 |
5 | //本题13个分支(比1年12个月共需12个分支多1),编程可使用的多分支结构有哪些?else…if、if…else的嵌套和switch使用哪一个最为简捷?是switch吗?
6 |
7 |
8 | #include
9 | #include
10 |
11 | void main(){
12 | int year, month, days;
13 |
14 | printf("输入年份:");
15 | scanf("%d",&year);
16 | printf("输入月份:");
17 | scanf("%d", &month);
18 |
19 | switch(month){
20 | case 1:
21 | case 3:
22 | case 5:
23 | case 7:
24 | case 8:
25 | case 10:
26 | case 12:
27 | days=31;
28 | break;
29 | case 4:
30 | case 6:
31 | case 9:
32 | case 11:
33 | days=30;
34 | break;
35 | case 2:
36 | // 判断闰年
37 | if(year%4==0 && year%100!=0 || year%400==0)
38 | days=29;
39 | else
40 | days=28;
41 | break;
42 | default:
43 | printf("月份输入错误!\n");
44 | exit(1);
45 | break;
46 | }
47 | printf("天数:%d\n", days);
48 | }
49 |
50 |
51 | //第一次运行结果:
52 | //输入年份:2014
53 | //输入月份:10
54 | //天数:31
55 |
56 | //第二次运行结果:
57 | //输入年份:2013
58 | //输入月份:02
59 | //天数:28
60 |
61 | //第三次运行结果:
62 | //输入年份:2000
63 | //输入月份:2
64 | //天数:29
65 |
--------------------------------------------------------------------------------
/经典项目/求梅森素数.c:
--------------------------------------------------------------------------------
1 | /**
2 | 梅森数(Mersenne Prime)指的是形如2n-1的正整数,其中指数n是素数,即为Mn。如果一个梅森数是素数,则称其为梅森素数。例如22-1=3、23-1=7都是梅森素数。
3 |
4 | 当n=2,3,5,7时,Mn 都是素数,但n=11时,Mn=M11=211-1=2047=23X89,显然不是梅森素数。
5 |
6 | 1722年,瑞士数学大师欧拉证明了231-1=2147483647是一个素数,它共有10位数,成为当时世界上已知的最大素数。
7 |
8 | 迄今为止,人类仅发现了47个梅森素数。梅森素数历来都是数论研究中的一项重要内容,也是当今科学探索中的热点和难点问题。
9 |
10 | 试求出指数n<20的所有梅森素数。
11 | */
12 |
13 | #include
14 | #include
15 | int prime(int n)
16 | {
17 | int i;
18 | long k;
19 | k=sqrt(n)+1;
20 | for(i=2; i<=k; i++)
21 | if(n%i == 0)
22 | return 0;
23 | return 1;
24 | }
25 | int main()
26 | {
27 | int mp, n=0, i;
28 | printf("Mersenne Prime:\n");
29 | for(i=2; i<=20; i++)
30 | {
31 | mp=pow(2,i)-1;
32 | if( prime(mp) )
33 | {
34 | n++;
35 | printf("M(%d)=%d", i, mp);
36 | printf("\n");
37 | }
38 | }
39 | printf("the number of Mersenne Prime less than 20 is:%d\n", n);
40 |
41 | return 0;
42 | }
43 |
44 |
45 | //运行结果:
46 |
47 | //Mersenne Prime:
48 | //M(2)=3
49 | //M(3)=7
50 | //M(5)=31
51 | //M(7)=127
52 | //M(13)=8191
53 | //M(17)=131071
54 | //M(19)=524287
55 | //the number of Mersenne Prime less than 20 is:7
56 |
--------------------------------------------------------------------------------
/经典项目/求给定范围内的所有素数.c:
--------------------------------------------------------------------------------
1 | //求给定范围start〜end之间的所有素数。
2 |
3 | #include
4 | #include
5 | int main()
6 | {
7 | int start, end, i, k, m, flag=1, h=0;
8 | do
9 | {
10 | printf("Input START and END:");
11 | scanf("%d%d", &start, &end);
12 | }while(!(start>0 && start
9 | int main()
10 | {
11 | long mul, number, k, a, b;
12 | printf("It exists following automorphic nmbers small than 100000:\n");
13 | for( number=0; number<100000; number++ )
14 | {
15 | for( mul=number, k=1; (mul/=10)>0; k*=10 );
16 | /*由number的位数确定截取数字进行乘法时的系数k*/
17 | a = k * 10; /*a为截取部分积时的系数*/
18 | mul = 0; /*积的最后n位*/
19 | b = 10; /*b为截取乘数相应位时的系数*/
20 | while(k>0)
21 | {
22 | mul=( mul + ( number%(k*10) )*( number%b - number%(b/10) ) )%a;
23 | /*(部分积+截取被乘数的后N位*截取乘数的第M位),%a再截取部分积*/
24 | k /= 10; /*k为截取被乘数时的系数*/
25 | b *= 10;
26 | }
27 | if(number == mul) /*判定若为自守数则输出*/
28 | printf("%ld ", number);
29 | }
30 | printf("\n");
31 |
32 | return 0;
33 | }
34 |
35 | //运行结果:
36 |
37 | //It exists following automorphic nmbers small than 100000:
38 | //0 1 5 6 25 76 376 625 9376 90625
39 |
--------------------------------------------------------------------------------
/经典项目/求车速.c:
--------------------------------------------------------------------------------
1 | //一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。
2 | //两小时后里程表上出现了一个新的对称数,该数仍为五位数。问该车的速度是多少?新的对称数是多少?
3 |
4 | #include
5 | int main()
6 | {
7 | int t, a[5]; /*数组a存放分解后的五个数字*/
8 | long int k, i;
9 | /*以95860为初值,循环试探*/
10 | for(i=95860; ; i++)
11 | {
12 | /*从高到低分解当前i中保存的五位数,并顺次存放在数组元素a[0]~a[4]中*/
13 | for(t=0,k=100000; k>=10; t++)
14 | {
15 | a[t] = (i%k) / (k/10);
16 | k /= 10;
17 | }
18 | if( (a[0]==a[4]) && (a[1]==a[3]) )
19 | {
20 | printf("里程表上出现的新的对称数为:%d%d%d%d%d\n",
21 | a[0], a[1], a[2], a[3], a[4] );
22 | printf("该车的速度为:%.2f\n", (i-95859)/2.0);
23 | break; /*跳出循环*/
24 | }
25 | }
26 |
27 | return 0;
28 | }
29 |
30 |
31 | //运行结果:
32 |
33 | //里程表上出现的新的对称数为:95959
34 | //该车的速度为:50.00
35 |
--------------------------------------------------------------------------------
/经典项目/求高次方数的尾数.c:
--------------------------------------------------------------------------------
1 | //求13的13次方的最后三位数。
2 |
3 | #include
4 | int main()
5 | {
6 | int i, x, y, last=1; /*变量last保存求得的x的y次方的部分积的后三位*/
7 | printf("Input x and y:\n");
8 | scanf("%d %d", &x, &y);
9 | for(i=1; i<=y; i++) /*x自乘的次数y*/
10 | last = last * x % 1000; /*将last乘x后对1000取模,即求积的后三位*/
11 | printf("The last three digits is:%d\n", last);
12 |
13 | return 0;
14 | }
15 |
16 | //运行结果:
17 |
18 | //Input x and y:
19 | //13 13
20 | //The last three digits is:253
21 |
--------------------------------------------------------------------------------
/经典项目/求黑洞数.c:
--------------------------------------------------------------------------------
1 | /**
2 | 编程求三位数中的“黑洞数”。
3 |
4 | 黑洞数又称陷阱数,任何一个数字不全相同的整数,经有限次“重排求差”操作,总会得到某一个或一些数,这些数即为黑洞数。
5 | “重排求差”操作是将组成一个数的各位数字重排得到的最大数减去最小数,
6 | 例如207,“重排求差”操作序列是720-027=693,963-369=594,954-459=495,再做下去就不变了,再用208算一次,也停止到495,
7 | 所以495是三位黑洞数。
8 | */
9 |
10 |
11 | #include
12 | int maxof3(int, int, int);
13 | int minof3(int, int, int);
14 | int main()
15 | {
16 | int i, k;
17 | int hun, oct, data, max, min, j, h;
18 | printf("请输入一个三位数:");
19 | scanf("%d", &i);
20 | hun=i/100;
21 | oct=i%100/10;
22 | data=i%10;
23 | max=maxof3(hun, oct, data);
24 | min=minof3(hun, oct, data);
25 | j=max-min;
26 | for(k=0; ; k++) /*k控制循环次数*/
27 | {
28 | h=j; /*h记录上一次最大值与最小值的差*/
29 | hun=j/100;
30 | oct=j%100/10;
31 | data=j%10;
32 | max=maxof3(hun, oct, data);
33 | min=minof3(hun, oct, data);
34 | j=max-min;
35 | if(j==h) /*最后两次差相等时,差即为所求黑洞数*/
36 | {
37 | printf("%d\n", j);
38 | break; /*跳出循环*/
39 | }
40 | }
41 | return 0;
42 | }
43 | /*求三位数重排后的最大数*/
44 | int maxof3(int a,int b,int c)
45 | {
46 | int t;
47 | if(a
5 | int main()
6 | {
7 | long n, sum, i;
8 | int flag=1;
9 | while(flag)
10 | {
11 | printf("输入N:");
12 | scanf("%ld", &n);
13 | printf("在1-%ld之间的阶梯数为:\n", n);
14 | sum=0;
15 | for( i=7; i<=n; i++ )
16 | if( i%7 == 0 )
17 | if( i%6 == 5 )
18 | if( i%5 == 4 )
19 | if( i%3 == 2 )
20 | {
21 | sum++;
22 | printf("%ld\n", i);
23 | }
24 | printf("在1-%ld之间,有%ld个数可以满足爱因斯坦对阶梯的要求。\n", n, sum);
25 | printf("继续请输入1,否则输入0:\n");
26 | scanf("%d", &flag);
27 |
28 | }
29 | return 0;
30 | }
31 |
32 |
33 | //运行结果:
34 |
35 | /*
36 | 输入N:123
37 | 在1-123之间的阶梯数为:
38 | 119
39 | 在1-123之间,有1个数可以满足爱因斯坦对阶梯的要求。
40 | 继续请输入1,否则输入0:
41 | 1
42 | 输入N:1234
43 | 在1-1234之间的阶梯数为:
44 | 119
45 | 329
46 | 539
47 | 749
48 | 959
49 | 1169
50 | 在1-1234之间,有6个数可以满足爱因斯坦对阶梯的要求。
51 | 继续请输入1,否则输入0:
52 | */
53 |
--------------------------------------------------------------------------------
/经典项目/牛顿迭代法求方程根.c:
--------------------------------------------------------------------------------
1 | //编写用牛顿迭代法求方程根的函数。方程为,系数a、b、c、d由主函数输入。求x在1附近的一个实根。求出根后,由主函数输出。
2 |
3 | //牛顿迭代法的公式是:,设迭代到 时结束。
4 |
5 |
6 | #include
7 | #include
8 |
9 | int main()
10 | {
11 | /*函数功能是用牛顿迭代法求方程的根*/
12 | float solution( float a, float b, float c, float d);
13 | float a, b, c, d, x; /*a,b,c,d代表所求方程的系数,x用来记录求得的方程根*/
14 | printf("请输入方程的系数:");
15 | scanf("%f %f %f %f", &a, &b, &c, &d);
16 | x = solution(a, b, c, d);
17 | printf("所求方程的根为x=%f", x);
18 |
19 | return 0;
20 | }
21 |
22 | float solution(float a, float b, float c, float d)
23 | {
24 | float x0, x=1.5, f, fd, h; /*f用来描述方程的值,fd用来描述方程求导之后的值*/
25 | do
26 | {
27 | x0 = x; /*用所求得的x的值代替x0原来的值*/
28 | f = a*x0*x0*x0 + b*x0*x0 + c*x0 + d;
29 | fd = 3*a*x0*x0 + 2*b*x0 + c;
30 | h = f / fd;
31 | x = x0 - h; /*求得更接近方程根的x的值*/
32 | }
33 | while(fabs(x-x0) >= 1e-5);
34 |
35 | return x;
36 | }
37 |
38 | //运行结果:
39 |
40 | //请输入方程的系数:2 -3 4 -2
41 | //所求方程的根为x=0.694146
42 |
--------------------------------------------------------------------------------
/经典项目/狼追兔子.c:
--------------------------------------------------------------------------------
1 | /**
2 | 一只兔子躲进了10个环形分布的洞中的一个。狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找;
3 | 也没有找到,就隔2个洞,到第6个洞去找;以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,
4 | 请问兔子可能在哪个洞中?
5 | */
6 |
7 |
8 | #include
9 | int main()
10 | {
11 | int n=0, i=0, x=0;
12 | int a[11];
13 | for(i=0; i<11; i++) /*设置数组初值*/
14 | a[i]=1;
15 | for(i=0; i<1000; i++) /*穷举搜索*/
16 | {
17 | n+=(i+1);
18 | x=n%10;
19 | a[x]=0; /*未找到,置0*/
20 | }
21 | for(i=0; i<10; i++) /*输出结果*/
22 | {
23 | if(a[i])
24 | printf("可能在第%d个洞\n", i);
25 | }
26 | return 0;
27 | }
28 |
29 | //运行结果:
30 |
31 | //可能在第2个洞
32 | //可能在第4个洞
33 | //可能在第7个洞
34 | //可能在第9个洞
35 |
--------------------------------------------------------------------------------
/经典项目/猜牌术.c:
--------------------------------------------------------------------------------
1 | //魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,并使牌面朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大声数数,你们听,不信?
2 | //你们就看,魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手中的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,
3 | //将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3,这样依次进行,将13张牌全部翻出来,
4 | //准确无误。问魔术师手中的牌原始次序是怎样安排的?
5 |
6 |
7 | #include
8 |
9 | int a[14];
10 |
11 | int main()
12 | {
13 | int i, j=1, n;
14 | printf("魔术师手中的牌原始次序是:\n");
15 | for( i=1; i<=13; i++ )
16 | {
17 | n=1;
18 | do
19 | {
20 | if(j>13)
21 | j=1;
22 | if(a[j]) /*盒子非空*/
23 | j++;
24 | else /*盒子为空*/
25 | {
26 | if(n==i)
27 | a[j]=i;
28 | j++;
29 | n++;
30 | }
31 | }
32 | while(n<=i);
33 | }
34 | for( i=1; i<=13; i++ )
35 | printf("%d ", a[i]);
36 | printf("\n");
37 |
38 | return 0;
39 | }
40 |
41 |
42 | //运行结果:
43 |
44 | //魔术师手中的牌原始次序是:
45 | //1 8 2 5 10 3 12 11 9 4 7 6 13
46 |
--------------------------------------------------------------------------------
/经典项目/猴子吃桃问题.c:
--------------------------------------------------------------------------------
1 | //猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?
2 | //分析
3 | //1) 设x1为前一天桃子数,设x2为第二天桃子数, 则:
4 | // x2=x1/2-1, x1=(x2+1)*2
5 | // x3=x2/2-1, x2=(x3+1)*2
6 | // 以此类推: x前=(x后+1)*2
7 |
8 | //2) 从第10天可以类推到第1天,是一个循环过程。
9 |
10 |
11 | #include
12 | #include
13 |
14 | int main(){
15 | int day, x1, x2;
16 | day=9;
17 | x2=1;
18 | while(day>0) {
19 | x1=(x2+1)*2; // 第一天的桃子数是第2天桃子数加1后的2倍
20 | x2=x1;
21 | day--;
22 | }
23 | printf("the total is %d\n",x1);
24 |
25 | return 0;
26 | }
27 |
28 | //运行结果:
29 |
30 | //the total is 1534
31 |
--------------------------------------------------------------------------------
/经典项目/百钱百鸡问题.c:
--------------------------------------------------------------------------------
1 | #
2 |
--------------------------------------------------------------------------------
/经典项目/矩阵转置.c:
--------------------------------------------------------------------------------
1 | //编写一个程序,将一个3行3列的矩阵转置。
2 |
3 | #include
4 | int main()
5 | {
6 | int n[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
7 | int i, j, temp;
8 | printf("原始矩阵:\n");
9 | for(i=0; i<3; i++)
10 | {
11 | for(j=0; j<3; j++)
12 | printf("%d ", n[i][j]); /*输出原始矩阵*/
13 | printf("\n");
14 | }
15 | for(i=0; i<3; i++)
16 | for(j=0; j<3; j++)
17 | {
18 | if (j>i)
19 | { /*将主对角线右上方的数组元素与主对角线左下方的数组元素进行单方向交换*/
20 | temp=n[i][j];
21 | n[i][j]=n[j][i];
22 | n[j][i]=temp;
23 | }
24 | }
25 | printf("转置矩阵:\n");
26 | for(i=0; i<3; i++)
27 | {
28 | for(j=0; j<3; j++)
29 | printf("%d ", n[i][j]); /*输出原始矩阵的转置矩阵*/
30 | printf("\n");
31 | }
32 | return 0;
33 | }
34 |
35 |
36 | //运行结果:
37 |
38 | //原始矩阵:
39 | //1 2 3
40 | //4 5 6
41 | //7 8 9
42 | //转置矩阵:
43 | //1 4 7
44 | //2 5 8
45 | //3 6 9
46 |
--------------------------------------------------------------------------------
/经典项目/线性同余法产生随机数.c:
--------------------------------------------------------------------------------
1 | //线性同余法产生随机数序列的公式为:
2 | // x[k+1] = (a*x[k] + c) % m
3 |
4 | //参数 a, c, m 都是由用户来设定的,并和一个种子数(例如 x[0])一起作为命令行参数传递给生成的程序。
5 |
6 | //一个简单的例子:a=7, c=1, m=13, and seed=5
7 |
8 | //一个复杂的例子:a=69069, c=0, m=2^32=4294967296, seed=31
9 |
10 | //下面的代码将输出一个随机数序列(最多有 m-1 个不同的值),然后继续循环。
11 |
12 |
13 | #include
14 | #include
15 | #include
16 | #include
17 |
18 | static long seed = 13;
19 | static long a;
20 | static long c;
21 | static long m;
22 |
23 | void random_init(long s) {
24 | if (s != 0) seed = s;
25 | }
26 |
27 | long random() {
28 | seed = (a*seed + c)%m;
29 | return seed;
30 | }
31 |
32 | int main(int argc, char * argv[]) {
33 | long s;
34 | int k;
35 | if (argc != 5) {
36 | printf("usage: %s a, c, m, seed\n", argv[0]);
37 | return 1;
38 | }
39 | a = atoi(argv[1]);
40 | c = atoi(argv[2]);
41 | m = atoi(argv[3]);
42 | s = atoi(argv[4]);
43 | random_init(s);
44 |
45 | for (k = 0; k < m-1; k++) {
46 | printf("%8ld", random());
47 | if (k % 8 == 7) { // 输出 8 个数字以后换行
48 | printf("\n");
49 | Sleep(1); // 暂停 1 秒
50 | }
51 | }
52 | printf("\n");
53 | return 0;
54 | }
55 |
--------------------------------------------------------------------------------
/经典项目/统计文件中单词的个数.c:
--------------------------------------------------------------------------------
1 | ///文本检索是软件最常用的一个功能,用C语言写一段程序,统计某个文件中单词的个数。
2 | //提示:单词是以空格为分隔的。
3 | //文本检索是软件最常用的一个功能,下面的代码将教你如果使用C语言统计单词的个数。
4 |
5 | #include
6 | #include
7 | #include
8 | #include
9 |
10 | // argc: 统计运行程序时命令行参数的个数
11 | // *argv[]: 储存每个参数的字符串指针,每一个元素对应一个参数
12 | int main (int argc,char *argv[])
13 | {
14 | int ch,bian=0,count=0;
15 | char find[50],temp[1000];
16 | FILE *pt; //文件指针
17 |
18 | // 判断是否输入文件
19 | if (argc != 2){
20 | printf("请使用格式: %s 文件名",argv[0]);
21 | exit(1); //非正常退出
22 | }
23 |
24 | // 判断能否成功打开文件
25 | if ((pt = fopen(argv[1],"r"))== NULL){ //将argv[1]赋值给指针pt
26 | printf("打开文件 %s 失败",argv[1]);
27 | exit(1);
28 | }
29 |
30 | printf("请输入要查找的单词:");
31 | gets(find);
32 | while((ch=getc(pt))!=EOF){ //EOF 表示文件结束
33 | if ((ch!=' ')&&(ch!='\n')){
34 | temp[bian]=ch;
35 | bian++;
36 | } else {
37 | temp[bian]='\0';
38 | if ((strcmp(find,temp))==0) count++;
39 | bian=0;
40 | }
41 | }
42 | printf("共在文件%s中查找到字符串\"%s\" %d 个\n",argv[1],find,count);
43 |
44 | getch();
45 | return 0;
46 | }
47 |
--------------------------------------------------------------------------------
/经典项目/统计英文字母、空格、数字和其它字符的数目.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int main(){
4 | char c; //用户输入的字符
5 | int letters=0, // 字母数目
6 | space=0, // 空格数目
7 | digit=0, // 整数数目
8 | others=0; // 其他字符数目
9 |
10 | printf("输入一些字符:");
11 | while((c=getchar())!='\n'){ // 每次读取一个字符,回车时结束
12 | if(c>='a'&&c<='z'||c>='A'&&c<='Z')
13 | letters++;
14 | else if(c==' ')
15 | space++;
16 | else if(c>='0'&&c<='9')
17 | digit++;
18 | else
19 | others++;
20 | }
21 |
22 | printf("\n统计结果:\n英文字母=%d\n空格=%d\n整数=%d\n其他字符=%d\n\n", letters, space, digit, others);
23 |
24 | return 0;
25 | }
26 |
27 |
28 | //运行结果:
29 |
30 | //输入一些字符:rwrwewre2345asdJSJQI%^&(& *&sdf YY( 2342-k'
31 |
32 | //统计结果:
33 | //英文字母=22
34 | //空格=5
35 | //整数=8
36 | //其他字符=10
37 |
--------------------------------------------------------------------------------
/经典项目/统计输入的字符串的长度.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | int main(){
5 | char str[21];
6 | int strLen;
7 |
8 | printf("Input your string: ");
9 | scanf("%s", str);
10 | strLen = strlen(str);
11 | printf("string = %s\nlength = %d\n", str, strLen);
12 |
13 | return 0;
14 | }
15 |
16 |
17 | //运行结果:
18 |
19 | //Input your string: 1234567890
20 | //string = 1234567890
21 | //length = 10
22 | //----------------------------------
23 | //Input your string: 123456 7890
24 | //string = 123456
25 | //length = 6
26 | //----------------------------------
27 | //Input your string: 1234567890123456789012345
28 | //string = 1234567890123456789012345
29 | //length = 25
30 | // 提示程序停止运行
31 |
--------------------------------------------------------------------------------
/经典项目/舍罕王的失算.c:
--------------------------------------------------------------------------------
1 | //相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8×8 共64格的象棋棋盘说:陛下,请您赏给我一些麦子吧。就在棋盘的第1格中放1粒,第2格放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上64格,我就感激不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。请编程求出国王总共需要将多少麦子赏赐给他的宰相。
2 |
3 | //该问题描述比较复杂,但只要抽象出其数学模型,便很容易解决了。
4 |
5 | //根据题意,麦子的放法是:在棋盘的第1格中放1粒,第2格放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依次放完棋盘上64格。
6 |
7 | //由此可推知,按照如此放法可得到的麦子的总数为:
8 |
9 | //2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 + ... + 2^63 = ?
10 |
11 |
12 | #include
13 | #include
14 | int main()
15 | {
16 | double sum = 0; /*定义double型变量sum存放累加和*/
17 | int i;
18 | /*使用循环求累加和*/
19 | for( i=1; i<=64; i++ )
20 | sum = sum + pow(2.0, (i-1)); /*注意变量为double型*/
21 | printf("国王总共需要赏赐给宰相的麦子数为:\n%f\n", sum); /*打印结果*/
22 | return 0;
23 | }
24 |
25 |
26 | //运行结果:
27 |
28 | //国王总共需要赏赐给宰相的麦子数为:
29 | //18446744073709551616.000000
30 |
--------------------------------------------------------------------------------
/经典项目/获取开机时间.c:
--------------------------------------------------------------------------------
1 | //这个其实不难,就是用到一个简单的Windows API,代码请见解析。
2 |
3 | //获取开机时间要用到 GetTickCount() 这个 API,功能是获取重系统开始到运行时的时间。代码如下:
4 |
5 |
6 | #include
7 | #include
8 |
9 | int main()
10 | {
11 | DWORD k = GetTickCount();
12 | int s = k/1000;
13 | int min = 0, h = 0;
14 | if (s >= 60){
15 | min = s / 60;
16 | s = s % 60;
17 | }
18 | if (min >= 60){
19 | h = min / 60;
20 | min = min % 60;
21 | }
22 | printf("重系统启动到现在过了的时间:%d h %d min %d s\n",h,min,s);
23 |
24 | system("pause");
25 | return 0;
26 | }
27 |
28 | //运行结果:
29 | //重系统启动到现在过了的时间:40 h 20 min 33 s
30 | //请按任意键继续. . .
31 |
--------------------------------------------------------------------------------
/经典项目/要发就发(1898)问题.c:
--------------------------------------------------------------------------------
1 | /**
2 | “1898—要发就发”。请将不超过1993的所有素数从小到大排成第一行,第二行上的每个数都等于它上面相邻两个素数之差。
3 | 编程求出:第二行数中是否存在若干个连续的整数,它们的和恰好为1898?假如存在的话,又有几种这样的情况?
4 |
5 | 两行数据分别如下:
6 | 第一行:2 3 5 7 11 13 17......1979 1987 1993
7 | 第二行:1 2 2 4 2 4......8 6
8 | */
9 |
10 |
11 | #include
12 | #include
13 |
14 | #define NUM 320
15 |
16 | int number[NUM]; /*存放不超过1993的全部素数*/
17 | int fun(int i);
18 |
19 | int main()
20 | {
21 | int i, j, count=0;
22 | printf("列出第一行中差值为1989的所有素数组合:\n");
23 | for(j=0, i=3; i<=1993; i+=2) /*求出不超过1993的全部素数*/
24 | if( fun(i) )
25 | number[j++]=i;
26 | for(j--; number[j]>1898; j--) /*从最大的素数开始向1898搜索*/
27 | {
28 | for(i=0; number[j]-number[i]>1898; i++); /*循环查找满足条件的素数*/
29 | if(number[j]-number[i] == 1898) /*若两个素数的差为1898,则输出*/
30 | printf("(%d).%3d,%d\n", ++count, number[i], number[j]);
31 | }
32 |
33 | return 0;
34 | }
35 |
36 | int fun(int i)
37 | {
38 | int j;
39 | if( i<=1 )
40 | return 0; /*判断是否为素数,为1是素数,为0不是素数*/
41 | if( i==2 )
42 | return 1;
43 | if( !(i%2) )
44 | return 0; /*if no, return 0*/
45 | for(j=3; j<=(int)(sqrt((double)i)+1); j+=2)
46 | if( !(i%j) ) return 0;
47 | return 1;
48 | }
49 |
50 |
51 | //运行结果:
52 |
53 | //列出第一行中差值为1989的所有素数组合:
54 | //(1). 89,1987
55 | //(2). 53,1951
56 | (3). 3,1901
57 |
--------------------------------------------------------------------------------
/经典项目/计算一个数的平方根.c:
--------------------------------------------------------------------------------
1 | //正数n的平方根可以通过计算一系列近似值来获得,每个近似值都比前一个更加接近准确值。第一个近似值是1,接下来的近似值则通过下面的公式来获得。
2 |
3 |
4 | //编写一个程序,读入一个值,计算并打印出它的平方根。如果你将所有的近似值都打印出来,你会发现这种方法获得准确结果的速度有多快。原则上,这种计算可以永远进行下去,它会不断产生更加精确的结果。但在实际中,由于浮点变量的精度限制,程序无法一直计算下去。当某个近似值与前一个近似值相等时,你就可以让程序停止继续计算了。
5 |
6 | //必须使用浮点变量,而且程序应该对负值输入进行检查。
7 |
8 |
9 | // 计算一个数的平方根。
10 | #include