【C语言入门级题目2】四位数各位数之和、爱因斯坦数学题(梯子阶数问题)、三色球问题、杨辉三角数列问题、100匹马驮100担货

写在开头:题源来自于凌云、吴海燕、谢满德老师们编著的《C语言程序设计与实践》第五章C语言结构的课后练习题。

编译器:Dev C++

代码是根据自己的逻辑来实现的,部分题目的算法思想写在了程序代码的注释中。有些解法仅仅是能够实现最终结果,但不一定是最优算法,比如有许多两个for循环甚至三个或更多的for循环暴力实现的算法,这些算法是一定可以优化的。希望我的解法能够给大家有所帮助,如果读者大大们有更好的思路和算法,也希望能在评论区留下更宝贵的智慧。

在这里插入图片描述

  1. 输入一个四位数x,计算每一位数字相加之和
/*输入一个四位数x,计算每一位数字相加之和*/
/*算法思想:先取一个个位数,然后去掉个位数变成一个新数
再取新数的个位数,再去掉个位数变成一个新数,循环次数为数字的位数*/
#include<stdio.h>
int main(){
	int i,x;
	int sum=0;
	int mod=10;	//除10 
	int dev=10;	//对10取余 
	int t;
	printf("请输入一个四位数x:");
	scanf("%d",&x);
	if(x<1000||x>9999){
	//判断输入是否非法 
		printf("输入非法!\n");
		return -1; 
	}	
	for(i=0;i<4;i++){
		t = x%10;	//取个位数
		x /= dev;	//去掉个位数
		sum += t;	//对每位数相加求和 
	}
	printf("sum = %d",sum);
	return 0; 
} 

效果图如下:

在这里插入图片描述

  1. 爱因斯坦数学题:有一条长梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨4阶,最后剩下3阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;若每步跨7阶,最后才正好1阶都不剩。
/*爱因斯坦的数学题:长梯问题*/
/*解题思路:由题意,梯子的阶数一定是7的倍数,故可以从0开始,每次循环
把梯子阶数+7进行判断*/
#include<stdio.h>
int main(){
	int step;//记录梯子的阶数 
	int count=0;
	for(step=0;;step += 7){	//每次循环台阶数+7 
		if(step%2==1&&step%3==2&&step%5==4&&step%6==5){
			//由题意进行逻辑判断,因为台阶数已经是7的倍数
			//所以只用取余的条件进行判断 
			printf("step = %d",step);
			return 0;
		}
	}
} 

效果图如下:在这里插入图片描述

  1. 三色球问题:12个球,3红3白6黑。任取8个,有多少种组合
/*12个球,3红3白6黑。任取8个,有多少种组合*/ 
#include<stdio.h>
int main(){
	int red,white,black;
	int count = 0;	//统计组合种数 
	for(black=0;black<6;black++){
		for(red=0;red<3;red++){
			for(white=0;white<3;white++){
				if(black+red+white == 8){
					printf("black=%d\tred=%d\twhite=%d\n",black,red,white);
					count++;
				}
			}
		}
	}
	printf("总共有%d种组合",count);
	return 0;
}

效果图如下:

在这里插入图片描述

  1. 编写程序,将下列数列:
    1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,1,5,10,10,5,1,…,延长到第55个。

算法思想:这个题观察数列,可以查觉出是考察与杨辉三角有关的算法。关于杨辉三角,最经典的解法就是用二维数组。运用二维数组解决杨辉三角问题,最关键的一点就是处理好行列的关系,这种解法留到以后再用代码实现。下面是采用数列的方法,打印出杨辉三角的数列。当然,也可以适当加一点控制语句,最后打印成杨辉三角矩阵。

杨辉三角的构成,是与组合数有关。而组合数又与阶乘有关。因此定义两个函数,分别是求n的阶乘,和C(m,n)的组合数。

杨辉三角的组成规律:
第一行第一个元素,也是这一行唯一的元素,组合数为C(0,0)=1。
第二行的第一个元素为C(1,0)=1;第二个元素为C(1,1)=1。
第三行第一个元素为C(2,0)=1;第二个元素为C(2,1)=2;第三个元素为C(2,2)=1。
以此类推,可以得出一个规律:第n行的第m个元素的组合数为C(n-1,m-1)
例如第5行的第3个元素为C(4,2)=6。

题目是要求打印杨辉三角的前55个元素,可以稍微计算以下能得出,当第十行的元素全部打印完成后,正好总共打印55个元素。因此需要打印杨辉三角的十行元素。

掌握了杨辉三角的规律和题目的要求后,以下是实现的代码。

/*打印杨辉三角数列*/
#include<stdio.h>
float up(int n){	//求阶乘
	int j;
	int p=1;
	for(j=1;j<=n;j++)
		p *= j;		//连乘
	return p;
}

float C(int m,int n){	//求组合数 
	int q;
	q = up(n)/(up(m)*up(n-m));		//求C(m,n)的组合数
	return q;
}

int main(){
	int i,j,n;
	int count=0;
	for(i=0;i<10;i++){	//用i控制行数,j控制每行的元素个数。
						//每行元素的个数不超过行数。
        for(n=0;n<=i;n++){	//记录元素个数,并打印杨辉三角数组 
        	count++;	//统计元素个数
        	printf("%-4.0f",C(n,i));
		}
        if(count==55)
		 	break;  
    }
    printf("\ncount = %d\n",count);
    return 0;
}

效果图如下:

在这里插入图片描述

  1. 100匹马驮100担货:大马一匹驮三担,中马一匹驮两担,小马一匹驮一担。
/*百匹马驮百担货*/
#include<stdio.h>
int main(){
	int big,middle,small;
	int count=0;
	int product=100;
	for(big=0;big<34;big++){
		for(middle=0;middle<51;middle++){
			for(small=0;small<101;small++){
				if(big*3+middle*2+small==product){
					count++;
					printf("方案%-3d:big=%-4d middle=%-4d small=%-4d\n",count,big,middle,small);
				}
			}
		}
	}
	return 0; 
} 

效果图如下(题目的解有很多,截图只展示部分结果):

在这里插入图片描述

到此为止,又解决了5道C语言程序题。希望自己的解法能对各位看官有所帮助,也期待读者大大们的赞和交流评论。我会继续坚持。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White白小纯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值