练习作业4: 和8有关的数字 , 不当老大 , 幂字符串

练习作业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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值