写在开头:题源来自于凌云、吴海燕、谢满德老师们编著的《C语言程序设计与实践》第五章C语言结构的课后练习题。
编译器:Dev C++
代码是根据自己的逻辑来实现的,部分题目的算法思想写在了程序代码的注释中。有些解法仅仅是能够实现最终结果,但不一定是最优算法,比如有许多两个for循环甚至三个或更多的for循环暴力实现的算法,这些算法是一定可以优化的。希望我的解法能够给大家有所帮助,如果读者大大们有更好的思路和算法,也希望能在评论区留下更宝贵的智慧。
- 输入一个四位数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;
}
效果图如下:
- 爱因斯坦数学题:有一条长梯,若每步跨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;
}
}
}
效果图如下:
- 三色球问题: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,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;
}
效果图如下:
- 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语言程序题。希望自己的解法能对各位看官有所帮助,也期待读者大大们的赞和交流评论。我会继续坚持。