文章目录

  • 一、题目
  • 二、分析思路
  • 三、C语言代码
  • 四、相关链接

回复此贴:https://bbs.csdn.net/topics/394896625

一、题目

奇怪数为这样一个整数 @wowpH
①:除了自身以外所有因子之和大于这个数本身(首先必须是盈数)
②:除了自身以外所有因子的集合,没有任何一个子集中所有数的和等于这个数本身

例如:70就是一个奇怪数,求1000以内的第二个奇怪数
70的除自身外的因子有:1,2,5,7,10,14,35。
它们的和为:74 > 70,所以70是盈数。
不存在一个子集的和为70(或4),所以它是奇怪数。


二、分析思路

核心部分分两个函数:一个用于判断是否是盈数,一个用于判断是否存在子集和为自身。@pfdvnah

1、用数组保存所有除自身外的因子
2、for 循环查找所有因子。循环到平方根即可。一趟循环可以找出两个因子。
3、注意,如果数自身是平方数,那么循环里面就多加了一次。循环后面要减掉。
4、是盈数返回 1,不是返回 0

子集和通过回溯计算。更好的是 DP 实现,怕新手看不懂,所以直接用回溯解决。实际上思路差不多。
每个数有两种状态,加到子集中,不加到子集中。@wowpH
不断地这样选择,直到所有数都选择完后,看看还剩余多少,剩的刚好为 0 的话,说明有子集的和为 num,即不是奇怪数。


三、C语言代码

/*****************************************************************功能:计算并输出区间[LFET,RIGHT]中所有的奇怪数作者:wowpH pfdvnah日期:2019年10月31日10:10:03链接:https://blog.csdn.net/pfdvnah/article/details/102832648
*****************************************************************/
#include <stdio.h>
#include <math.h>
#include <string.h>#define TRUE 1
#define FALSE 0
#define MAX_FACTOR_NUM 1000
#define LEFT 71
#define RIGHT 1000int strangeNumber(int);// 判断是否是奇怪数int sum;// 因子的和
int factor[MAX_FACTOR_NUM];// 保存因子
int factorNum;// 因子个数。@wowpH
int abundantNumber(int);// 判断是否是盈数int back(int, int);// 回溯判断是否有子集的和是numint main(void) {for (int i = LEFT; i <= RIGHT; ++i) {if (TRUE == strangeNumber(i)) {printf("%d\n", i);}}return 0;
}int strangeNumber(int num) {if (FALSE == abundantNumber(num)) {return FALSE;// 不是盈数,即不是奇怪数}if (FALSE == back(0, num)) {return FALSE;// 存在子集的和为num,即不是奇怪数}return TRUE;
}int abundantNumber(int num) {// 初始化。@pfdvnahmemset(factor, 0, sizeof(factor));factorNum = 0;factor[factorNum++] = 1;// 1肯定是因子sum = 1;int max = (int)sqrt(num);// 循环找到num的所有因子for (int i = 2; i <= max; ++i) {if (0 == num % i) {factor[factorNum++] = i;factor[factorNum++] = num / i;sum += i + num / i;}}// num是开方数,那么循环里面max加了两遍,要减掉多余的if (max * max == num) {--factorNum;sum -= max;}return sum <= num ? FALSE : TRUE;
}int back(int index, int left) {if (index >= factorNum) {return 0 == left ? FALSE : TRUE;}if (FALSE == back(index + 1, left)) {// 不选择第index个数return FALSE;}// 选择第index个数,剩余的减去当前数if (FALSE == back(index + 1, left - factor[index])) {return FALSE;}return TRUE;
}

四、相关链接

题目来源:https://bbs.csdn.net/topics/394896625
原文链接:https://blog.csdn.net/pfdvnah/article/details/102832648
盈数_百度百科:https://baike.baidu.com/item/%E7%9B%88%E6%95%B0/2567294?fr=aladdin


- End - wowpH - pfdvnah -

(烧脑)奇怪数 - C语言 - 回溯相关推荐

  1. 奇怪的方式c语言,C语言中奇怪的C语言特性

    3)Duff's Device http://en.wikipedia.org/wiki/Duff%27s_device 特点是switch与while交错出现.代码类似 4)同名同姓现象 在< ...

  2. 进制转换c语言代码_奇怪的C语言代码,有些函数在变量前加上(void)是什么类型转换?...

    C语言的语法极其简洁,即使是初次接触编程语言的初学者也能很快学完它的语法.不过,C语言也是一门"灵活得过了头"的编程语言,对于很多初学者来说,编写C语言程序就好像拿着一堆最基本的砖 ...

  3. 第5关:C循环-寻找完数-------C语言程序设计技术(循环结构程序设计2)

    第5关:C循环-寻找完数-------C语言程序设计技术(循环结构程序设计2) #include<stdio.h>int main(void){ /*********Begin****** ...

  4. PTA 黑洞数 C语言

    PTA 黑洞数 C语言 问题描述: 黑洞数也称为陷阱数,又称"Kaprekar问题",是一类具有奇特转换特性的数. 任何一个各位数字不全相同的三位数,经有限次"重排求差& ...

  5. 计算斐波那契数-c语言

    计算斐波那契数-c语言 斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入, ...

  6. c语言8进制数与16进制数,C语言中的二进制数、八进制数和十六进制数

    C语言中的整数除了可以使用十进制,还可以使用二进制.八进制和十六进制. 二进制数.八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一个二进制.八 ...

  7. 寻找阿姆斯特朗数c语言程序,C程序检查阿姆斯特朗数

    C程序检查阿姆斯特朗数 在此示例中,您将学习检查用户输入的整数是否是Armstrong数字. 要理解此示例,您应该了解以下C语言编程主题: 如果满足以下条件,则一个正整数称为阿姆斯特朗数(n阶),如果 ...

  8. 解决 VSCode 配置 tab 空格数 Dart 语言无效的问题

    2021.11.2 更新,发现自己的配置有点多余,添加后记. 问题描述 我发现自己新建的 .dart 文件,按 tab 键缩进只有 2 个空格(如下图所示),非常不符合我的编程习惯,于是想把 tab ...

  9. 完数c++语言程序_C语言经典100题(19)

    1 上期答案揭晓 首先给大家看看上一篇文章C语言经典100题(18)中第三部分编程题的答案: #includeint main(){ int s=0,a,n,t; printf("请输入 a ...

最新文章

  1. 使用elementui实现表单上传功能_elementUI实现自定义上传文件并携带参数
  2. 驾驭白夜场景、刷新多个SOTA,高效提升多目标追踪与分割
  3. 2016.5.57—— Remove Duplicates from Sorted List
  4. 键盘压缩背景,ios滚动不流畅,禁止遮罩层下面内容滚动
  5. 全国计算机等级考试三级历年真题,历年全国计算机等级考试三级(数据库技术)笔试选择真题...
  6. 在本地机房享受专属公共云服务,详解阿里云本地化部署服务云盒
  7. t-sql导出EXCEL语句
  8. DNN、CNN、RNN、LSTM的区别
  9. C#使用Objects Comparer进行对象比较
  10. MathCAD求解方程组
  11. 搜狗2020年测试工程师笔试题
  12. text展示html,textview完美展示html格式代码
  13. 利用matlab导入数据+命令行 快速选取excel部分内容
  14. UE4 后期材质节点学习
  15. 前端CSS核心部分盒子模型
  16. OPPO R7s线刷和恢复出厂设置的比较
  17. 微信自定义菜单使用特殊字符出现的问题
  18. 【技术点】数据结构--B树系列之B+树(五)
  19. 宽带拨号上网时,Win10代理设置无效
  20. 医学统计学 第八章( t 检验)

热门文章

  1. Unity 多物体联动动画
  2. java8 joda_Joda Time项目和java8时间api
  3. javaweb大学生消费状况调查系统
  4. dp交换机命令_思科路由器、交换机命令集
  5. wpf datagrid自动生成列时特殊字符转换
  6. 零基础学Qt 4编程实例之三:勾三股四弦必五—文件包含语句与标准库的使用
  7. 对3维向量及3维张量关系的思考
  8. 解决Microsoft Office 2010无法打开.doc文件的问题
  9. Java进阶——如何查看Java字节码
  10. 调试MAG3110地磁传感器心得体会