回顾完顺序结构、分支结构和循环结构后,开始课本习题的实践练习。
题源来自于凌云、吴海燕、谢满德老师们编著的《C语言程序设计与实践》第五章C语言结构的课后练习题。
代码是根据自己的逻辑来实现的,有些解法仅仅是能够实现最终结果,但不一定是最优算法,比如有许多两个for循环甚至三个for循环暴力实现的算法,这些算法是一定可以优化的。希望我的解法能够给大家有所帮助,如果读者大大们有更好的思路和算法,也希望能在评论区留下更宝贵的智慧。
以下是要解决的六道C语言编程题,后面会通过代码一一实现。本猿使用的编译器是Dev c++(关于这个编译器的安装方法和资源,在上一篇文章中有详细阐述,大家也可以去翻翻看)。
- 打印一个平行四边形
#include<stdio.h>
int main(){
int i,j,k;
for(i=0;i<4;i++){ //打印四行
for(j=0;j<10+(6-2*i);j++){ //每行打印16-行数的2倍
printf(" "); //打印空格
}
for(k=0;k<(i+1)*2-1;k++) //每行打印2倍的行数-1 个*
printf("*"); //打印*
printf("\n"); //每行打印结束换行
}
for(i=0;i<3;i++){ //打印3行
for(j=0;j<10;j++) //每行打印10个空格
printf(" ");
for(k=0;k<(3-i)*2-1;k++) //每行打印(4-行数)的2倍-1个 *
printf("*");
printf("\n");
}
return 0;
}
效果图如下:
- 输入一个五位数,使之逆序,例如输入:54321,逆序后:12345
/*输入一个5位数,将它反向输出。such as: input:12345 output:54321*/
#include<stdio.h>
int main(){
int x,y=0;
int i;
int mod=10;
int dev=10;
printf("请输入一个五位数:");
scanf("%d",&x);
if(x/10000<=0||x/10000>=10){ //判断输入是否非法
printf("输入非法,不是一个五位数\n");
return -1;
}
for(i=0;i<5;i++){ //数字反向算法
y=y*10+x%mod;
x=x/dev;
}
printf("反向后输出:%d",y);
return 0;
}
效果图如下:
- 三位数的Armstrong(水仙花)数。如:1×1×1+3×3×3+5×5×5=135
/*所有的三位 Armstrong数*/
#include<stdio.h>
int main(){
int i;
int a,b,c,x;
int y=0;
int count=0;
for(i=100;i<1000;i++){ //从100到999循环
x=i;
a=x/100; //a取百位数
b=x/10%10; //B取十位数
c=x%10; //C取个位数
y = a*a*a+b*b*b+c*c*c;
if(x==y){
printf("%d is a Armstrong.\n",x);
count++; //统计Armstrong数的个数
}
}
if(!count){ //若没有Armstrong数,输出提示信息。
printf("没有Armstrong数\n");
}
return 0;
}
效果图如下:
- 找出6~5000内的所有亲密数对
/*找出6~5000内的所有亲密数*/
#include<stdio.h>
int main(){
int n,i;
int sumA=0;
int sumB=0;
int count=0;
for(n=6;n<=5000;n++){
for(i=1;i<n;i++){ //找出数n的所有因子(不包括本身),并相加
if(n%i==0){
sumA += i; //因子数之和B
}
}
for(i=1;i<sumA;i++){ //找出sumA的所有因子(不包括本身),并相加
if(sumA%i==0){
sumB += i; //因子数之和B
}
}
if(n==sumB&&n!=sumA){ //因子数之和相等且不为本身,则为一对亲密数
printf("%d 与 %d 是一对亲密数\n",n,sumA);
count++; //计数:亲密数的对数
}
sumA=0;
sumB=0;
}
if(!count){
printf("\n不存在亲密数\n");
return -1;
}
else
printf("有%d对亲密数",count);
return 0;
}
效果图如下:
- sin(x)的泰勒级数和项数
/*sin(x)的泰勒级数*/
#include<stdio.h>
#include<math.h>
int main(){
double x,num; //分子、每一项的分数
double y=0; //sinx的结果
int down=1; //分母
int count=1; //计数:项数
int flag=0; //控制加减法 0:- 1:+
printf("请输入x的值:\n");
scanf("%lf",&x);
y=x; //第一项
while(1){
if(x/down<=0.00001){
break;
}
x = x*x*x; //分子
down += 2; //分母
num = x/down; //每一项的分数
if(flag=0){
y -= x/down;
flag = 1;
count++;
}
if(flag=1){
y += x/down;
flag = 0;
count++;
}
}
printf("累加了%d项\n",count);
printf("sin(x) = %lf\n",y);
return 0;
效果图如下:
- 连续整数的固定和。例如输入27,发现2—7,8—10,13与14,这三组都是27的连续和。
/*连续整数的固定和*/
#include<stdio.h>
int main() {
int i,j,n;
int sum=0;
printf("请输入一个整数:\n");
scanf("%d",&n);
printf("%d的连续和为:\n",n);
for(i=1; i<=n/2; i++) { //从1开始;两个连续数的和若等于固定和,则最小的数不会超过固定和的一半
for(j=i+1; j<=(n/2)+1; j++) {
sum = sum+j; //除去连续整数中最小的数,其余整数求和
if((sum+i)==n) { // 加上最小的数与固定和相等,查找成功,输出连续数
printf("%d~%d\n",i,j);
break;
}
if(sum+i>n) {
sum=0;
break;
}
}
}
return 0;
}
效果图如下:
到此为止,六道编程题解决完毕。在解题的过程中非常明显地感觉出,语法好学,逻辑难写,但编程的核心恰恰是在于算法和逻辑。本猿作为一个编程入门级选手,急需要不断提升,在此也立下个flag,坚持每天刷题,从简到到困难一步步来。同时我也会坚持在这里分享自己的解题代码和经验心得,希望有越来越多的同道者能够指出代码中的错误和优化代码方面给出建议。