题目内容

  1. 写两个函数
  2. 函数narcissistic,传入一个值,用于判断输入的数是不是水仙花数,是水仙花数返回1,否则返回0
  3. 函数PrintN,传入两个值,求开区间范围内所有水仙花数

注1:题目中保证100≤m≤n≤10000
注2: 水仙花数:一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身
eg: 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3

测试程序样例

#include <stdio.h>int narcissistic( int number );
void PrintN( int m, int n );int main()
{int m, n;scanf("%d %d", &m, &n);if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);PrintN(m, n);if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);return 0;
}

在程序后面完成自己的函数

输入样例

153 400

输出样例

153 is a narcissistic number
370
371

注 题目来源:浙大版《C语言程序设计(第3版)》题目集

解题思路

观察题目,输入和输出样例,可知printN函数的两端是开区间,会帮我们判断两端是否是水仙花数,且数字后有"is a narcissistic number",我们的函数只需输出数字
再观察程序头部和主函数,printN函数的类型是void,主函数中也没有关于printN的输出语句,因此我们的printN函数不需要return,而是在函数中直接输出
我们可以通过在printN函数中调用narcissistic函数,将所有结果是1的数进行输出来完成寻找水仙花数
而narcissistic函数需要我们把一个三位数或者四位数的每一位拆开进行,进行幂运算,判断这个数是不是水仙花数,而要把每一个数拆开,我们要先判断这个数是几位数

柿子挑软的捏(doge),所以咱可以先写printN函数

void PrintN( int m, int n )
{int i;for(i=m+1;i<n;i++){if ( narcissistic( i ) ) {printf("%d\n", i);}}
}

只需要一个for循环和一个嵌套着narcissistic函数的if语句就可以搞定
因为调用了narcissistic函数,所以我们的narcissistic函数要放在printN函数的上面,按照刚才的思路,我们先判断数字是几位数,然后按照不同的位数分类讨论取出每一位数,之后进行判断输出。好在题目中给了我们m和n的范围,最大是10000,用脚趾算一下就可以知道这不是水仙花数,所以我们只需要判断这个数是三位数或者四位数就可以了
需要注意的是在头文件中我们没有调用math.h库,所以函数里不能使用pow()函数

int narcissistic( int number)
{int i = 1,result = 0;int number1 = number;//这里用到number1的原因是下面while循环做位数判断的时候//要一个number进行自除,之后还需要一个number进行判断int a = 0, b = 0, c = 0, d = 0;while (number1 >= 10 ) {number1 /= 10;i += 1;}//上面用于判断一个数字有几位数if (i == 3) {a = number % 10;b = number / 10 % 10;c = number / 100;if (number == a*a*a+b*b*b+c*c*c) {result = 1;}}if (i == 4) {a = number % 10;b = number / 10 % 10;c = number / 100 % 10;d = number / 1000;if (number == a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d) {result = 1;}
}
return result;
}

看一下结果

输入:

153 400

输出:

153 is a narcissistic number
370
371

没有问题!!!

方法优化

今天早上起来又看到这道题,仔细一想,这段代码(特别是narcissistic函数)有很多可以优化的地方,比如虽然头文件中没有给出<math.h>库,但我i们可以尝试在函数的上面自己加入<math.h>库

#include <math.h>int narcissistic( int number)

像这样
还有就是在判断一个数字是几位数的时候,完全没必要像我一开始那样小题大做,用一个while循环来判断这个数字是几位数,极大的提升了这道题的时间复杂度,因为题目保证了最大数字是10000,最小的水仙花数也是三位数,所以我们只要用两个if语句就可以把三位数和四位数分别处理,修改后代码如下:

#include <stdio.h>int narcissistic( int number );
void PrintN( int m, int n );int main()
{int m, n;scanf("%d %d", &m, &n);if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);PrintN(m, n);if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);return 0;
}#include <math.h>int narcissistic( int number)
{int i = 1,result = 0;int a = 0, b = 0, c = 0, d = 0;if (number>=100 && number < 1000) {a = number % 10;b = number / 10 % 10;c = number / 100;if (number==pow(a,3)+pow(b,3)+pow(c,3)) {result = 1;}}if (number>=1000 && number < 10000) {a = number % 10;b = number / 10 % 10;c = number / 100 % 10;d = number / 1000;if (number==pow(a,4)+pow(b,4)+pow(c,4)) {result = 1;}}
return result;
}void PrintN( int m, int n )
{int i;for(i=m+1;i<n;i++){if ( narcissistic( i ) ) {printf("%d\n", i);}}
}

narcissistic函数比之前少了近10行代码!!

总结

收获的知识:
调用的库不一定要卸写在文件的最上面,写在函数的最上面也能正常运行
在数字范围差别不大的情况下,用if语句代替while循环效率会更高
希望能帮到大家!!

「题目讲解」C语言 使用函数判断水仙花数 求范围内的所有水仙花数相关推荐

  1. go list指针_「GCTT 出品」Go 语言机制之内存剖析

    前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针.栈.堆.逃逸分析和值/指针传递.这是第三篇,主要介绍堆和逃逸分析.(译者注:这一篇可 ...

  2. R语言sign函数判断数值为正数或者负数实战

    R语言sign函数判断数值为正数或者负数实战 目录 R语言sign函数判断数值为正数或者负数实战 #基本语法 #正负数判断 #基本语法 sign(5) # Basic R syntax of sign ...

  3. C语言 定义函数妇女 判定整数n,C语言 定义函数判断奇偶性

    问题描述: C语言 定义函数判断奇偶性 这学期新开C语言,自己对这门课比较感兴趣,所以预习了一些没学的东西. 然后看到这道题: 编程c语言输入一批正整数以0或负数为结束标志求奇数的和要求定义和调用函数 ...

  4. 本周AI热点回顾:「时空版」Transformer训练速度远超3D CNN;拒绝内卷的AI狼火了!不想抓羊只想躺!...

    ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍点击左上方蓝字关注我们 01 「时空版」Transformer训练速度远超3D CNN,提速3倍! Facebook AI推出了全新的视频理解架构TimeSform ...

  5. c语言用while实现输出加法口诀表,「加法口诀」C语言编写一个加法口诀表 - 金橙教程网...

    加法口诀 C语言编写一个加法口诀表 #include void main(){ int i,j; for(i=1;i<10;i++){ for(j=1;j<=i;j++){ printf( ...

  6. 题目 1057: 二级C语言-分段函数

    题目描述 有一个函数如下,写一程序,输入x,输出y值. 保留两位小数 #include<stdio.h> int main() {double x;scanf("%lf" ...

  7. excel多列多行堆叠成多列一行_「Excel技巧」如何利用indirect函数快速将一列转为多行多列排版...

    HI,大家好哈. 前几天我们有聊了如何将多行多列转一列的话题,今天就顺势来聊聊如何将一列转多行多列. 因为,一份表格,如果里面只有一列,不过有一百多行,甚至几百行, 这样子排版, 一方面,不够一目了然 ...

  8. python量化投资视频_【邢不行|量化小讲堂系列21-Python量化入门】「视频讲解」浅谈机器学习与量化投资...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总]请点击此处 [必读文章]: 个人微 ...

  9. matlab 等高线数值显示_「matlab等高线」matlab中contour 函数的用法(绘制等高线) - seo实验室...

    matlab等高线 原文 contour 矩阵的等高线图 全页折叠 语法 contour(Z) contour(Z,n) contour(Z,v) contour(X,Y,Z) contour(X,Y ...

最新文章

  1. linux执行class文件_「大数据干货」Windows系统和Linux系统中打jar包与导入语句剖析...
  2. datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
  3. 三维重建:闭环检测-相机闭环
  4. 听说面试很少有人答出:距离最近点对问题
  5. Linux 环境下安装 MySQL,各种踩坑、疑难杂症 | 原力计划
  6. python自动化框架学习-pyautogui
  7. usionCharts 技术文档-Jsp画图
  8. python用wordcloud简单词云_用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)...
  9. 一步一步学习PHP(4)——函数
  10. java list t 类_Java ListT 、List?、ListObject、ListE、ListU的区别
  11. 较为详细的MUSIC算法原理及MATLAB实现
  12. 计算机操作系统的基本概念
  13. unity下载与安装
  14. 生物信息学笔记03 -- 基因组序列分析 方法
  15. 解决Ubuntu 20.04 虚拟机克隆出多台造成的IP地址冲突的问题
  16. 做360度评估引发员工不满?
  17. 汉语词典快速查询算法研究
  18. linux程序卸载失败怎么办,在Deepin下卸载LibreOffice等软件的方法,附卸载失败的原因...
  19. windows用python读取文件open()函数
  20. APISIX-Datadog 插件发布,助力用户提高系统的可观测性

热门文章

  1. ERROR: [Synth 8-439] module ‘design_system_new_v_mix_0_0‘ not found 错误解决办法【2022是个越不过去的砍】
  2. 阿里巴巴服务端高并发分布式架构演进之路
  3. 一加手机2预装Android那个软件,一加手机2:配置主流
  4. anaconda注册账号以及实现虚拟环境的复制
  5. 2021年值得关注的五个云原生安全问题
  6. 308-置换策略FIFO算法的实现
  7. 人脸识别产品设计,AI产品经理需要了解的实战干货都在这里了_团员分享_@阳春柏樰...
  8. RocketMq怎么保证消息不丢失
  9. python easygui模块_Python 模块EasyGui
  10. 果品冷库远程监控系统