C语言编程经典100例——21至30例

2023-12-14 18:20:44

目录

第 21 例

第 22 例

第 23 例

第 24 例

第 25 例

第 26 例

第 27 例

第 28 例

第 29 例

第 30 例


第 21 例

程序源码:

/*
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少桃子。

程序分析:采取逆向思维的方法,从后往前推断。

1) 设x1为前一天桃子数,设x2为第二天桃子数, 则:

x2=x1/2-1, x1=(x2+1)*2

x3=x2/2-1, x2=(x3+1)*2

以此类推: x前=(x后+1)*2

2) 从第10天可以类推到第1天,是一个循环过程。
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int day, x1 = 0, x2;
    day=9;
    x2=1;
    while(day>0)
	{
        x1=(x2+1)*2;  // 第一天的桃子数是第2天桃子数加1后的2倍
        x2=x1;
        day--;
    }
    printf("第一天共摘了 %d 个桃子。\n",x1);
	printf ("\n");

    return 0;
}

程序运行结果:

第 22 例

程序源码:

/*
题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单,有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。

程序分析:详见下面的代码。
*/

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char i,j,k;
    for(i='x';i<='z';i++)
	{
        for(j='x';j<='z';j++)
		{
            if(i!=j)
			{
                for(k='x';k<='z';k++)
				{
                    if(i!=k&&j!=k)
					{
                        if(i!='x'&&k!='x'&&k!='z')
						{
                            printf("三对赛手的名单为:\na--%c\nb--%c\nc--%c\n",i,j,k);
                        }
                    }
                }
            }
        }
    }

    return 0;
}

程序运行结果:

第 23 例

程序源码:

/*
题目:打印出如下图案(菱形)。

   *
  ***
 *****
*******
 *****
  ***
   *

程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
*/

#include <stdio.h>

int main()
{
    int i,j,k;
    for(i=0;i<=3;i++)
	{
        for(j=0;j<=2-i;j++)
		{
            printf(" ");
        }
        for(k=0;k<=2*i;k++)
		{
            printf("*");
        }
        printf("\n");
    }
    for(i=0;i<=2;i++)
	{
        for(j=0;j<=i;j++)
		{
            printf(" ");
        }
        for(k=0;k<=4-2*i;k++)
		{
            printf("*");
        }
        printf("\n");
    }

	return 0;
}

程序运行结果:

第 24 例

程序源码:

/*
题目:有一个分数数列如下,2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

程序分析:重点是抓住分子与分母的变化规律。
*/

#include <stdio.h>
 
int main()
{
    int i,t;
    float sum=0;
    float a=2,b=1;
    for(i=1;i<=20;i++)
    {
        sum=sum+a/b;
        t=a;
        a=a+b;
        b=t;
    }
    printf("这个数列的前20项之和等于 %9.6f\n",sum);

	return 0;
}

程序运行结果:

第 25 例

程序源码:

/*
题目:求1!+2!+3!+...+20!的值。

程序分析:此程序只是把累加变成了累乘。
*/

#include <stdio.h>
 
int main()
{
    int i;
    long double sum,mix;
    sum=0,mix=1;
    for(i=1;i<=20;i++)
    {
        mix=mix*i;
        sum=sum+mix;
    }  
    printf("1!+2!+3!+...+20! = %lf\n",sum);

	return 0;
}

程序运行结果:

第 26 例

程序源码:

/*
题目:利用递归方法求5!。

程序分析:递归公式:f(n)=f(n-1)*n
*/

#include <stdio.h>
 
int main()
{
    int i;
    int fact(int);
    for(i=0;i<6;i++)
	{
        printf("%d! = %d\n",i,fact(i));
    }

	return 0;
}

int fact(int j)
{
    int sum;
    if(j==0)
	{
        sum=1;
    }
	else
	{
        sum=j*fact(j-1);
    }

    return sum;
}

程序运行结果:

第 27 例

程序源码:

/*
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

程序分析:详见下面的代码。
*/

#include <stdio.h>
 
int main()
{
    int i=5;
    void palin(int n);
    printf("请输入5个字符:");
    palin(i);
    printf("\n");

	return 0;
}

void palin(int n)
{
    char next;
    if(n<=1)
	{
        next=getchar();
        printf("相反顺序输出结果是:");
        putchar(next);
    }
	else
	{
        next=getchar();
        palin(n-1);
        putchar(next);
    }
}

程序运行结果:

第 28 例

程序源码:

/*
题目:编写一个程序计算两个矩阵的叉乘,并输出结果。

程序分析:详见下面的代码。
*/

#include <stdio.h>

#define N 3
#define M 4

int main ()
{
	int a[N][M],b[M][N];    //定义二维整型数组a和b。
	int i,j,k,s;

	printf ("请输入二维整型数组a的12个元素:\n");
	//利用双重循环通过键盘给二维整型数组a赋值。
	for (i=0;i<N;i++)
	{
		for (j=0;j<M;j++)
		{
			printf ("a[%d][%d]=",i,j);
			scanf ("%d",&a[i][j]);
		}
	}

	printf ("\n请输入二维整型数组b的12个元素:\n");
	//利用双重循环通过键盘给二维整型数组a赋值。
	for (i=0;i<M;i++)
	{
		for (j=0;j<N;j++)
		{
			printf ("b[%d][%d]=",i,j);
			scanf ("%d",&b[i][j]);
		}
	}

	//输出二维整型数组a。
	printf ("\n二维整型数组a:\n");
	for (i=0;i<N;i++)
	{
		for (j=0;j<M;j++)
		{
			printf ("%-5d",a[i][j]);
		}
		printf ("\n");
	}

	//输出二维整型数组b。
	printf ("\n二维整型数组b:\n");
	for (i=0;i<M;i++)
	{
		for (j=0;j<N;j++)
		{
			printf ("%-5d",b[i][j]);
		}
		printf ("\n");
	}

	//计算 s = a×b 的值,并输出 s 的值。
	printf ("\n“二维整型数组a×二维整型数组b”的结果是:\n");
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)
		{
			for (k=s=0;k<M;k++)
			{
				s+=a[i][k]*b[k][j];
			}
			printf ("%-10d",s);
		}
		printf ("\n");
	}
	printf ("\n");

	return 0;
}

程序运行结果:

第 29 例

程序源码:

/*
题目:给一个不多于5位的正整数,求它是几位数,并逆序打印出各位数字。

程序分析:分解出每一位数,详见下面的代码。
*/

#include <stdio.h>
 
int main( )
{
    long a,b,c,d,e,x;
    printf("请输入一个不多于 5 位的正整数:");
    scanf("%ld",&x);
    a=x/10000;        //分解出万位
    b=x%10000/1000;   //分解出千位
    c=x%1000/100;     //分解出百位
    d=x%100/10;       //分解出十位
    e=x%10;           //分解出个位
    if (a!=0)
	{
		printf("该数字为 5 位数,逆序输出为:%ld%ld%ld%ld%ld\n",e,d,c,b,a);
    }
	else if(b!=0)
	{
		printf("该数字为 4 位数,逆序输出为:%ld%ld%ld%ld\n",e,d,c,b);
    } 
	else if(c!=0)
	{
		printf("该数字为 3 位数,逆序输出为:%ld%ld%ld\n",e,d,c);
    } 
	else if(d!=0)
	{
		printf("该数字为 2 位数,逆序输出为:%ld%ld\n",e,d);
    } 
	else if(e!=0)
	{
		printf("该数字为 1 位数,逆序输出为:%ld\n",e);
    }

	return 0;
}

程序运行结果:

第 30 例

程序源码:

/*
题目:输入一个5位数,判断它是不是回文数。个位与万位相同,十位与千位相同的5位数是回文数,比如12321是回文数。

程序分析:分解出每一位数,详见下面的代码。
*/

#include <stdio.h>
 
int main( )
{
    long ge,shi,qian,wan,x;
    printf("请输入一个 5 位数:");
    scanf("%ld",&x);
    wan=x/10000;        //分解出万位
    qian=x%10000/1000;  //分解出千位
    shi=x%100/10;       //分解出十位
    ge=x%10;            //分解出个位
    
	if (ge==wan&&shi==qian)
	{ 
		//个位等于万位并且十位等于千位
        printf("%d 是回文数!\n",x);
    }
	else
	{
        printf("%d 不是回文数!\n",x);
    }

	return 0;
}

程序运行结果:

文章来源:https://blog.csdn.net/ZK180531/article/details/133582221
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。