练习作业4: 和8有关的数字 , 不当老大 , 幂字符串
前排提示,本次作业的基础讲解很细致,弄清楚这个卡口会对C语言学习有极大帮助!
问题 A: 和8有关的数字
序号:1099
题目描述
把1到n之间(包含n),符合以下条件之一的数字,依次打印出来。
①含有数字8
②各个数位上的数字和是8
③是8的倍数
输入
整数n,n>1
输出
符合条件的所有整数清单,一行
样例输入
30
样例输出
8 16 17 18 24 26 28
思路过程:
本题考验函数的使用和输出格式要求。首先读题,要求输入n(n>1),输出满足三个条件任意一条的数字,这里第二条注意是各个位,不是个位!
我们看输出,每两个数之间有空格,头尾都没有,这就意味着我们不能使用%d(空格)
或者 (空格)%d
一路输出到底,先选第一种,输出%d(空格)
,那么,当输出最后一个数时,我们只输出%d
即可,问题变成了如何确定输出的最后一个数?我们知道,我们输入的n是控制结束的,我们无法知道最后一个符合条件的数是多少,所以这条路不行!我们换第二条,输出(空格)%d
,只有第一个数是仅%d
,所以,问题又变成了怎样判断输出的是第一个数,这个简单,设置一个flag,flag为初值,即为第一个数,往后flag变化,输出(空格)%d
就好啦。
void put(int i,int flag)//flag的变化在主函数中体现
{
if(flag==0)
printf("%d",i);
else printf(" %d",i);
}
本题有一个,算是漏洞的地方,因为8一定是第一个输出的数,所以输出加一条if(i==8) printf("%d");
然后后面输出就是printf(" %d");
了,这样确实判断机给过的,但是希望同学能真正懂这块输出该怎么判断与如何掌握输出规则。
接下来是函数问题,为了增加函数的可读性,我们需要将函数拆分,有三个判断函数,我们就定义三个函数,加上主函数和输出函数共五个。三个判断函数不是很难,主要是主函数的调用,这里我们写一个判断语句,既然是三个条件之一满足,那我们不妨让每个判断函数都返回一个值,再用if判断,这里精髓的判断条件用或语句(||
)完成,如果其一成立,即可调用输出函数。
if(judgement1(i)||judgement2(i)||judgement3(i))//三个函数都返回0或1,成立其一即可输出
put(i,flag++);//这里体现了flag的变化!
这样,本题的难点就解决了。
附:
由于有部分同学不理解函数形式,对于这三个函数,我们稍微来回顾一下吧
第一个:判断数字为8倍数
最简单的
if(i%8==0) return 1;
else return 0;
第二个:判断数字中含有数字8
首先有定义int i=*判定数* , p
,我们采用标准最简的方法,逐个对i的最后一位进行判断,放入while循环,先不看循环条件,我们看循环体,取出i的最后一位放到p中,判断p是不是8,是就表明是8,不是就不是(那当然233),如果不是那就i去掉最后一位,由于整数的整除性,我们只要让i/10即可,然后判断条件就是i不为0就继续。如果i被除到0了还没有符合条件的,那就是i不符合了。
while(i!=0)
{
p=i%10;
if(p==8) return 1;//表示是
i/=10;
}
return 0;//表示不是
第三个:判断数字各个位和为8
首先有定义int i=*判定数*,s=0
,还是用类似上面的方法,逐个取i的最后一位,由于要判断数字各个位和是否为8,我们就要把各个数字相加存到s里
while(i!=0)//直到i被除尽
{
s+=i%10;//取i最后一位加到s里,s有初值0
i/=10;
}
if(s==8) return 1;//判断是
else return 0;//判断否
最后再次提醒!函数是灵活的!不要一条主函数写到底,不管是函数的可读性还是结构性都会大受打击!而且以后工作中这样的代码不利于维护,更会体现出个人的水平的高低。
Example Answer:
#include<stdio.h>
void put(int i,int flag)//输出函数
{
if(flag==0)//判断flag,即是否为第一个输出数
printf("%d",i);//由于flag初值为0,即如果flag为0就是第一个数
else printf(" %d",i);
}
int judgement1(int i)//判断是否各个位上含有8
{
int p;
while(i!=0)
{
p=i