C语言经典100题之精华

【程序 1】1~4 组成无重复数字的三位数。
题目:有 1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?程序分析:可填在百位、十位、个位的数字都是 1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
程序源代码:

#include<stdio.h>
void main()
{
   
	int i,j,k,sum=0;
	for(i=1;i<=4;i++)
		for(j=1;j<=4;j++)
			for(k=1;k<=4;k++)
			{
   
				if(i!=j&&j!=k&&i!=k)
				{
   
					sum++;
					printf("%d,%d,%d\n",i,j,k);
				}
			}
			printf("%d\n",sum);
}

【程序 2】企业利润计算(switch) 题目:企业发放的奖金根据利润提成。利润(I)低于或等于 10 万元时,奖金可提 10%;利润高于 10 万元, 低于 20 万元时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可可提成 7.5%;20 万到 40 万之 间时,高于 20 万元的部分,可提成 5%;40 万到 60 万之间时高于 40 万元的部分,可提成 3%;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%,高于 100 万元时,超过 100万元的部分按 1%提成,从 键盘输入当月利润 i,求应发放奖金总数a?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成浮点型。
程序源代码:

#include<stdio.h>
void main()
{
   
	double i;
	printf("input i:");
	scanf("%lf",&i);
	double a,a1,a2,a3,a4,a5;
	a1=10000*0.1;
	a2=a1+10000*0.075;
	a3=a2+20000*0.05;
	a4=a3+20000*0.03;
	a5=a4+40000*0.015;
	if(i<=10000)
		a=i*0.1;
	else if(i<=20000)
		a=a1+(i-10000)*0.075;
	else if(i<=40000)
		a=a2+(i-20000)*0.005;
	else if(i<=60000)
		a=a3+(i-40000)*0.005;
	else if(i<=100000)
		a=a4+(i-60000)*0.015;
	else
		a=a5+(i-100000)*0.005;
		printf("%0.5lf\n",a);
}

【程序 3】加 100 是完全平方数 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168又是一个完全平方数,请问该数是多少?
程序分析:在 10 万以内判断,先将该数加上 100 后再开方,再将该数加上 268 后再开方,如果开方后 的结果满足如下条件,即是结果。
程序源代码:

#include <stdio.h>
#include <math.h>
void main()
{
    
    long int i,x,y;
    for (i=0; i<100000; i++) {
   
        x = sqrt(i+100);
        y = sqrt(i+100+168);
        if (x*x == i+100&&y*y == i+100+168) 
		{
   
            printf("%ld\n",i);
        }
    }
}

【程序 4】年月日判断是年份的第几天。
题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以 3 月5 日为例,应该先把前两个月的加起来,然后再加上5 天即本年的第几天,特殊情况,闰年且输入月份大于 3时需考虑多加一天。
程序源代码:

#include <stdio.h>
int main()
{
   
    int i, days = 0;
    int year, month, day;
    int day_tab[13] = {
   0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    printf("输入年、月、日,用空格隔开:");
    scanf("%d%d%d", &year, &month, &day);
    for (i=1; i<month; i++)
    {
   
        days += day_tab[i];
    }
    days += day;
    if ((year%4==0 && year%100!=0 || year%400==0) && month>=3)
        days+=1;
    printf("%d年%d月%d日是这一年的第%d天!\n", year, month, day, days);
    return 0;
}

【程序 5】三个数,从小到大输出。
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到 x 上,先将x 与 y进行比较,如果 x>y则将 x 与 y的值进行交换,然后再用 x与 z 进行比较,如果 x>z 则将 x 与z 的值进行交换,这样能使x 最小。
程序源代码:

#include<stdio.h>
void main() 
{
    
int x,y,z,t; 
scanf("%d %d %d",&x,&y,&z); 
if (x>y) 
{
   
	t=x;x=y;y=t;
} /*交换x,y的值*/ 
if(x>z) 
{
   
	t=x;x=z;z=t;
}/*交换x,z的值*/ 
if(y>z) 
{
   
	t=y;y=z;z=t;
}/*交换z,y的值*/ 
printf("small to big: %d %d %d\n",x,y,z); 
}

【程序 6】用号输出字母 C 的图案。
题目:用
号输出字母 C 的图案。
程序分析:可先用’*'号在纸上写出字母 C,再分行输出。
程序源代码:

#include<stdio.h>
void main()
{
   
	printf("********\n");
	printf("**\n");
	printf("**\n");
	printf("**\n");
	printf("********\n");

}

【程序 7】输出特殊图案,请在 c 环境中运行,看一看,Very Beautiful!
题目:输出特殊图案,请在 c 环境中运行,看一看,Very Beautiful!
程序分析:字符共有 256 个。不同字符,图形不一样。
程序源代码:

#include<stdio.h>
void main()
{
   
	 char a=176,b=219;
	 printf("%c%c%c%c%c\n",b,a,a,a,b);
	 printf("%c%c%c%c%c\n",a,b,a,b,a);  
	 printf("%c%c%c%c%c\n",a,a,b,a,a);  
	 printf("%c%c%c%c%c\n",a,b,a,b,a);
	 printf("%c%c%c%c%c\n",b,a,a,a,b);
}

【程序 8】题目:输出 9*9 口诀。
程序分析:分行与列考虑,共 9 行 9列,i 控制行,j 控制列。
程序源代码:

#include<stdio.h>
#define N 9
void main()
{
   
	 int i,j,t;
	 for(i=1;i<=N;i++)
	 {
   
		 for(j=i;j<=N;j++)
		 {
   
			 t=i*j;
			 printf("%d*%d=%d\t",i,j,t);
		 }
		 printf("\n");
	 }
}

【程序 9】题目:要求输出国际象棋棋盘。
程序分析:#设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
#i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
#i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
#棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
程序源代码:

#include <stdio.h>
void main()
{
   
    int i,j;
    for(i=0;i<8;i++)
    {
   
        for(j=0;j<8;j++)
        if((i+j)%2==0)
        printf("%c%c",219,219);
        else
        printf("  ");
        printf("\n");
    }
}

【程序 10】题目:打印楼梯,同时在楼梯上方打印两个笑脸。
程序分析:用 i 控制行,j 来控制列,j 根据 i的变化来控制输出黑方格的个数。
程序源代码:

#include<stdio.h>
int main()
{
   
	int i,j;
    printf("\1\1\n");     //打印两个笑脸
    for(i=1;i<11;i++)
     {
    
		for(j=1;j<i;j++)
			printf("%c%c",23,23);   //23这个数字可以是任意数,代表该数所对应的符号
		printf("\n");
      }
  return 0;
}

【程序 11】(古典问题)兔子问题。 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:兔子的规律为数列 1,1,2,3,5,8,13,21… 2.
程序源代码:

#include <stdio.h>
//兔子问题
void main()
{
   
    long f1,f2;
    int i;
    f1=f2=1;
    for(i=1;i<20;i++)
    {
   
        printf("%12d%12d",f1,f2);
        if(i%2==0) printf("\n");//每行输出四个数
        f1=f1+f2;   //给下一次的F1赋值
        f2=f1+f2;   //给下一次的F2赋值
    }
	printf("\n");
}

【程序 12】判断 101 到 200 之间的素数。
题目:判断 101-200 之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除 2到 sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。(效率升级版)(用开方和略过偶数的方式减少运算量)
程序源代码:

#include <stdio.h>
#include<math.h>
void main()
{
   
	int i,j;
	int sum = 0;
	for (i = 101; i <= 200; i+=2)
	{
   
		for (j = 2; j <= sqrt(i); j++)
		{
   
			if (i%j == 0)
			{
   
				break;
			}
		}
		if (j>sqrt(i))
			{
   
				printf("%d\t", i);
				sum++;
				if(sum%5==0)
					printf("\n");
			}
	}
	printf("\nsum=%d\n", sum);
}

【程序 13】打印出所有的“水仙花数”。
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方+3 的三次方。
程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。
程序源代码:

#include<stdio.h>
void main()
{
   
	int a,i,j,k,sum=0;
	for(a=100;a<1000;a++)
	{
   
		i=a%10;  //个位
		j=a/10%10;  //十位
		k=a/100;   //百位
		if(i*i*i+j*j*j+k*k*k==a)
		{
   
			printf("%d\t",a);
		sum++;
		}
	}
	printf("sum=%d\n",sum);
}

【程序 14】将一个正整数分解质因数
题目:将一个正整数分解质因数。例如:输入 90,打印出 90=233*5。
程序分析:对 n进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果 n>k,但 n能被 k整除,则应打印出 k的值,并用 n除以 k的商,作为新的正整数n, 重复执行第一步。 (3)如果 n不能被 k整除,则用 k+1 作为 k的值,重复执行第一步。
思路是这样的,从1到N先找出最小的质因数,如果等于本身,那么说明只有一个质因数,如果不是,那么将该质因数打印出来,并将N/该质因数作为新的N值进行运算。
程序源代码:

#include <stdio.h>
#include <stdlib.h>
//将一个正整数分解质因数
int main()
{
   
    int i,n;
    printf("Please input an integer!\n");
    scanf("%d",&n);
    for(i=2;i<=n;i++)
    {
   
        while(n!=i)     //若i=n,则质因数就是n本身
        {
   
            if(n%i==0)  //若i是质因数,则打印出i的值,并用商给n赋新值
            {
   
                printf("%d*",i);
                n=n/i;
            }
            else 
				break;//若不能被i整除,则算下一个i
        }
    }
    printf("%d\n",n);   //这里是打印最后一个质因数,也就是等于i时的那个
    return 0;
}

【程序 15】利用条件运算符的嵌套完成学习成绩的转换。
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90 分的同学用 A 表示,60-89 分之间的用 B 表示, 60 分以下的用 C 表示。
程序分析:(a>b)?a:b , 若a>b,则表达式值为a,否则为b. 这是条件运算符的基本例子。
程序源代码:

#include <stdio.h>
int main()
{
   
    int score;
    char grade;
    printf("Please input your score.\n");
    scanf("%d",&score);
    grade=score<60?'C':(score<90?'B':'A');
    printf("You are Level %c\n",grade);
    return 0;
}

【程序 16】求最大公约数和最小公倍数。
题目:输入两个正整数 m和 n,求其最大公约数和最小公倍数。
程序分析:利用辗除法。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 / 105 = 2余42,所以105和42的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零。这时的除数就是所求的两个数的最大公约数。
程序源代码:
#include<stdio.h>
//最大公约数函数(利用欧几里得算法)

int cy(int x, int y)
{
   
	if(y==0)
		return x;
	else 
	return cy(y,x%y);
}
//最小公倍数函数
int cb(int x, int y)
{
   
	return (x*y)/cy(x, y);
}
void main()
{
   
	int a, b;           //输入两个整数
	scanf("%d %d", &a, &b);
	printf("cy=%d, cb=%d\n", cy(a, b), cb(a, b)); //输出最大公约数和最小公倍数
}

【程序 17】输入一行字符,分别统计出其中英文字母、、、、的个数。
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析:利用 while语句,条件为输入的字符不为’\n’.
程序源代码:

#include <stdio.h>
int main()
{
   
    int letters=0,spaces=0,numbers=0,others=0
  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值