算法15---数论1---完全数

算法15---数论1---完全数

完全数是一些特殊的自然整数。完全数等于其所有因子之和。所谓因子是所有的可以整除这个数的数,而不包括这个数本身。

一些完全数的概念

(1)亏数:当一个自然数的所有因子之和小于该自然数,那么该自然数便是亏数;

(2)盈数:当一个自然数的所有因子之和大于该自然数,那么该自然数便是盈数;

(3)完全数:当一个自然数的所有因子之和等于该自然数,那么该自然数便是完全数;

相关的结论

1 每一个完全数都可以表示成连续自然数之和

2 每个完全数都是调和数;

若一个正整数n的所有因子的调和平均是整数,n便称为调和数(Harmonic number)。它又称欧尔数(Ore number)。

3 每一个完全数都可以表示为2的一些连续正整数次幂之和。

如:6=2+2²

4 已知的完全数都是以6或者8结尾。

5 除6以外的完全数都可以表示成连续奇立方之和。

如:28=1³+3³;

完全数的实现如下

 1 /*
 2     题目:完全数
 3     author taoliu——alex  2016.10
 4
 5 */
 6
 7
 8 #include <stdio.h>
 9
10
11 void perfectnum(int n)
12 {
13
14     int perfect[100]={0};
15     int sum=0;
16     for (int i = 1; i < n; i++)
17     {
18         if (n%i==0)
19         {
20             perfect[i]=i;
21             sum=sum+i;
22         }
23     }
24     if (sum==n)
25     {
26         printf("the number %d is perfect number!\n",n);
27         printf("the number %d is made up as follow!\n",n);
28         for (int i = 0; i < 100; i++)
29         {
30             if (perfect[i]!=0)
31             {
32                 printf("%d ", perfect[i]);
33             }
34         }
35
36     }
37     //else
38     //    printf("%d is not perfect number!\n",n );
39
40
41 }
42
43 int main()
44 {
45
46
47     //可以输入你想要判断的数字
48     /*
49     int n;
50     printf("please input the number you want to judge! \n");
51     scanf("%d",&n);
52     perfectnum(n);
53     */
54     //也可以输出在某一范围内的所有完全数
55     printf("please input the scope you want to find! \n");
56     int scope;
57     scanf("%d",&scope);
58
59     for (int i = 1; i < scope; ++i)
60     {
61         perfectnum(i);
62     }
63     return 0;
64
65 }
时间: 2024-10-24 11:10:22

算法15---数论1---完全数的相关文章

1108: 零起点学算法15——交换变量

1108: 零起点学算法15--交换变量 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3266  Accepted: 1706[Submit][Status][Web Board] Description 水题 Input 输入2个整数(题目包含多组测试数据) Output 输出交换后的2个整数(每组测试数据一行,中间用空格隔开) Sample Input 825 23 Sample Outpu

普林斯顿公开课 算法1-5:算法理论

本节主要讲解的是算法的复杂度. 算法性能 算法的性能分为三种: 最佳情况:计算时间最短的情况 最差情况:计算时间最长的情况 平均情况:随机输入的期望开销 以二分查找为例 最佳情况是1,因为第一次就有可能找到需要找的整数. 最差情况是logN 平均情况是logN 算法复杂度 算法复杂度用于定义问题的难度,另外也有助于开发最优化的算法,算法复杂度可以通过分析最坏情况来减少输入数据对算法性能的影响. 为了简化问题难度的表示方法,算法复杂度减少了算法分析的细节,忽略常数系数. 最优算法 所谓的最佳算法就

你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是Hash算法,RSA算法等密码学的入门基础. 二维码生成算法最为核心的就是编码规则和纠错码字的生成.本篇专门讲解纠错涉及到的伽罗瓦域(Galois Field).本文内容大部分是阅读<密码编码学与网络安全>后参考相关PPT编写,如有遗漏或不严谨地方请参考专业书籍. 数论基础 整除,因数,素数 设 a , b(b≠0)

初级算法15.有效的字母异位词

题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母 分析:此题就是判断两个字符串是否由相同的字符组成(每个字符出现的次数相同,顺序不管) 由于只包含小写字母,则可以用

算法笔记--数论模板小集(待增)

仓鼠大神博客:http://www.cnblogs.com/linyujun/p/5194184.html http://www.cnblogs.com/linyujun/p/5194170.html ①gcd 一行版: unsigned int gcd(unsigned int a,unsigned int b) { return b>0?gcd(b,a%b):a; } 位运算版: ll gcd(ll a,ll b) { while(b^=a^=b^=a%=b); return a; } ②快

卡特兰数(Catalan Number) 算法、数论 组合~

Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为(OEIS中的数列A000108):1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190

Problem T: 零起点学算法15——交换变量

#include<stdio.h> int main() { int a,b,c; scanf("%d %d",&a,&b); c=a; a=b; b=c; printf("%d %d",a,b); return 0; } 原文地址:https://www.cnblogs.com/chenlong991223/p/9720399.html

数据结构(DataStructure)与算法(Algorithm)、STL应用

catalogue 0. 引论 1. 数据结构的概念 2. 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 2.3.1 二叉树 3. 物理结构实例 3.1 链表 3.1.1 单向线性链表 3.1.2 单向循环链表 3.1.3 双向线性链表 3.1.4 双向循环链表 3.1.5 数组链表 3.1.6 链表数组 3.1.7 二维链表 3.2 顺序存储 4. 算法 4.1 查找算法 4.2 排序算法 0. 引论 0x1: 为什么要学习数据结构 N.沃思(Niklaus  Wirth)教授提

数论随记(二)

HDU1573 /*中国剩余定理*/ 10. 公式 1. ab(mod m) (a mod m) b (mod m) (化简); HDU1395 (2^x 1(mod n) 2^x%n 1(mod n) ) 2. xa(mod m) x*ka*k(mod m); 3. xn-a(mod m) x+an(mod m); HDU1788 4. gcd(a,b)=k gcd(a/k,b/k)=1; 5. a%k= (变型: %k= ) HDU1852 如果m与k互素,则(a/m)%k=a*m^(phi

字符串匹配算法的C语言实现-算法导论第三版(1)

因为最近准备开始学习做一些小的Android项目练手,看上了系统级的三个应用,拨号盘,通讯录和短信,准备从最简单的拨号做起,但是因为这些应用中都不可避免的会有自动提示,我觉得设计到的就是字符串匹配问题,这里准备使用C语言来实现,将来通过JNI集成到应用当中. 1.首先是朴素匹配,实际上就是穷举: 用C语言实现的函数我放到这里: 1 void naive_string_match(char *t,char *p){ 2 int n = strlen(t); 3 int m = strlen(p);