想必搜这个问题的同学都知道Smith数的概念,这里就不再赘述了,如果不清楚可以百度查一下。
然后就是源代码将在文章最后给出,注释很详细,这里就不解释了,直接看代码就可以了。
最后的最后博主想说的是,我在搜索有关Smith数资料的时候,发现了很多“错误的代码”,为什么要加双引号呢,因为这个问题通常是课本上或者别的什么地方的题,这些错误的代码都是面向测试样例编程,在课本上给的测试样例中,代码能够通过,但是换一个测试样例,就很可能会出错。如果你在别的地方看到Smith数问题的源代码,并且你是真的想学会这个算法

请测试它!!

最简单的测试,输入18(随便给的测试例子),如果给出的最小Smith数是22,那就说明这个代码是对的
22 = 2 * 11, 2 + 2 = 4, 2 + 1 + 1 = 4
可能你在别的地方看到的测试样例都是4937774,所以测试别的数据很重要。

源代码

#include <stdio.h> //一个简单的求和函数,可以将数字分隔开然后进行求和
int add(int n){int sum = 0;while(n){sum += n%10;n /= 10;}return sum;
}//判断是否为Smith数
//在这个函数中也同时添加了判断质数的代码,将其整合在了一起
bool smith(int n) {//设置一个数组来存放质因数int a[10000] = {0};int i = 2;int temp = n;int index = 0; int sum1 = 0;//sum1存放质因数分解的和 //注意这里有等号,也就是说,至少会有一个数字,也就是它本身会存入a数组中,为后续判断做了铺垫while (i <= temp) {//从小到大开始算质因数//不断的除以2,直到不能整除,然后i++开始除以3...以此类推 if (temp%i == 0) {a[index] = i;index++;temp /= i;i = 2;}else i++;}//也就是说,该数为质数,不满足Smith数必须是合数的条件,直接返回false进行下一个数的判断 if(a[1] == 0) return false; //该数不为质数,也就是合数,满足了Smith数最基本的条件,然后看质因数和与各个位数之和是否相等 else{//这里很巧妙的解决了测试样例中4937775 = 3*5*5*65837中65837的分解//如果a数组(存放质因数的数组)中有非一位数的数,则须对数字继续分解 for (int i = 0; a[i]!=0; i++){a[i] = add(a[i]);sum1 += a[i];}//sum2中存放数字各个位数的和 int sum2 = add(n);//如果和相等,则说明该数就为Smith数,返回true,最后在主函数中打印 if (sum1 == sum2)return true;else return false;}
}int main(){int n;int i = 0;scanf("%d", &n);//输入一个数 //从n+1开始判断是否为Smith数 for (i = n+1; ; i++){//当smith函数返回值为true时打印i if(smith(i)){printf("%d\n", i);//打印完后break退出循环即可 break;}}return 0;
}

这里smith函数是返回bool类型的,准确的说C语言是没有bool类型的,所以这里是cpp文件,如果要用C语言来完成,则将返回值改成int类型返回一个标记即可。
当然,如果你要是应付作业的话,该程序可帮不了你,因为题目要求输入0作为结束符。这个代码只能帮你找出Smith数,如果要完成题目就还需要动动你聪明的脑袋瓜小小的改进一下该程序。
最后的最后:博主发现一个问题,在学习算法时,简单的算法老师随便一讲就学会了,稍微难一点的学校的老师又很难给学生讲明白,需要自己下去学习,找资料的同时会遇到形形色色的代码,作为一名coder,需要抱着求真的心态去检验代码,而不是简简单单的crtl c+crtl v。正所谓实践是检验真理的唯一标准


如有不足,欢迎各位大佬指正。

算法问题:Smith数问题相关推荐

  1. 算法:Smith数问题

    Smith数问题: 若一个合数的质因数分解式逐位相加之和等于其本身逐位相加之和,则称这个数为 Smith 数.如 4937775=355*65837,而3+5+5+6+5+8+3+7=42,4+9+3 ...

  2. Algorithm:C++语言实现之队列相关算法(最短路径条数问题、拓扑排序)

    Algorithm:C++语言实现之队列相关算法(最短路径条数问题.拓扑排序) 目录 队列 1.最短路径条数问题 2.拓扑排序 队列 1.最短路径条数问题

  3. 数据结构与算法之前缀数

    数据结构与算法之前缀数 目录 前缀数 1. 前缀数 (一)前缀数描述 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字 ...

  4. java蓝桥杯算法训练完数

    试题 算法训练 完数 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 一个数如果恰好等于它的因子之和,这个数就称为"完数".例如,6的因子为1.2.3,而6=1+ ...

  5. C语言经典回溯算法之解决数的组合问题(详解)

    文章目录 一.回溯算法 二.数的组合问题 一.回溯算法 1.回溯法 也叫试探法,实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯&q ...

  6. C++试题 算法训练 相邻数对、画图

    试题 算法训练 相邻数对 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示 ...

  7. Java实现 蓝桥杯 算法训练 相邻数对(暴力)

    试题 算法训练 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 ...

  8. Java实现算法提高十进制数转八进制数

    算法提高 十进制数转八进制数 时间限制:1.0s 内存限制:512.0MB 编写函数,其功能为把一个十进制数转换为其对应的八进制数.程序读入一个十进制数,调用该函数实现数制转换后,输出对应的八进制数. ...

  9. 【每日一算法】两数之和 IV - 输入 BST

    微信改版,加星标不迷路! 每日一算法-两数之和IV-输入BST 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目 ...

最新文章

  1. fragment生命周期
  2. python实现简单的api接口-python中接口的实现实例
  3. SVN更新提示内容被锁定
  4. jQuery 遍历 - slice() 方法
  5. 新手应该如何Javascript,JDom,JQuery,DWZ。。
  6. 微信自动回复如何实现?用 Python 就可以!
  7. Mysql —— 索引的使用顺序
  8. 实战:node-react项目部署到服务器
  9. 基于目标检测的电车充电插孔检测实践
  10. java.lang.UnsatifiedLinkError错误一例:在eclipse中启动应用报错
  11. 海思3516D + IMX291图像闪烁问题定位
  12. WPS/Word参考文献格式规范及引用的方法
  13. 【游戏开发指路】Unity学习路线,三万字大纲(面试题大纲 | 知识图谱 | Unity游戏开发工程师)
  14. ASP.NET MVC后台判断是否是手机登录以及是否是微信公众号登陆
  15. Kinect使用系列
  16. JPA Spring Data JPA详解
  17. RV1126笔记二:rkmedia测试
  18. 福禄克LinkIQ™智能链路通线缆网络测试仪功能介绍
  19. 拟真机器人拯救者奖励_《X战警:黑队》万磁王大战哨兵机器人,他就是变种人的拯救者!...
  20. 网络营销实战课-微博实操

热门文章

  1. 软件测试 - 测试基础知识
  2. Java文件路径问题
  3. 抖音微商引流之抖音实战引流技巧,,抖音/快手/火山热门技术---
  4. linux下开启rpcbind服务
  5. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统
  6. nlp-生成任务-摘要生成
  7. javascript 方法 一直提示 对象不支持此属性或方法
  8. 如何高效编写测试用例?【带模板、思维导图】
  9. js打开服务器缓存文件夹路径,浅谈微信页面入口文件被缓存解决方案
  10. ftp文件上传和下载