数学:求一个数的真约数(因数)的个数及所有约数之和

一.

我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身。非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数。
  1、怎样求一个数有多少个因数?
  对于一个已知的自然数,要求出它有多少个因数,可用下列方法:
  首先将这个已知数分解质因数,将此数化成几个质数幂的连乘形式,然后把这些质数的指数分别加一,再相乘,求出来的积就是我们要的结果。
  例如:求360有多少个因数。
  因为360分解质因数可表示为:360=2^3×3^2×5,2、3、5的指数分别是3、2、1,这样360的因数个数可这样计算出:
  (3+1)(2+1)(1+1)=24个。
  我们知道,360的因数有 1,2,3,4,5,6,8,9,10,12,15,18,20,24,30,36,40,45,60,72,90,120,180,360正好24个,可见上述计算正确。
  2、怎样求出有n个因数的最小自然数?
同样拥有n个(n为确定的数)因数的自然数可以有多个不同的数,如何求出这些数中的最小数?
  这是与上一个问题相反的要求,是上一题的逆运算。
  比如求有24个因数的最小数是多少?
  根据上一问题解决过程的启示,可以这样做,先将24分解因式,把24表示成几个数连乘积的形式,再把这几个数各减去1,作为质数2、3、5、7......的指数,求出这些带指数的数连乘积,试算出最小数即可。具体做法是:
  因为:24=4×6,  24=3×8, 24=4×3×2,
  现在分别以这三种表示法试求出目标数x:
  (1)、24=4×6,4-1=3,6-1=5
    X=2^5×3^3=864
     (2)、24=3×8,3-1=2,8-1=7
   X=2^7×3^2=1152
  (3)24=4×3×2,4-1=3, 3-1=2, 2-1=1
   X=2^3×3^2×5=360
  综合(1)、(2)、(3)可知360是有24个因数的最小数。

二。

6=2·3=(2^1)·(3^1), 
所以6的约数的个数:1,2,3,6共4个, 也可如此算:(1+1)(1+1)=4 
所有约数的和1+3+2+6 ,也可如此算:(2^0+2^1)(3^0+3^1)

原理:因为6是由一个2个一个3组成,2可以出现0次、1次,3可以出现0次、1次,所以所有约数之和=(2^0+2^1)(3^0+3^1)

时间: 2024-10-07 23:11:06

数学:求一个数的真约数(因数)的个数及所有约数之和的相关文章

UVa 294 (因数的个数) Divisors

题意: 求区间[L, U]的正因数的个数. 分析: 有这样一条公式,将n分解为,则n的正因数的个数为 事先打好素数表,按照上面的公式统计出最大值即可. 1 #include <cstdio> 2 #include <cmath> 3 4 const int maxn = 31700; 5 bool vis[maxn + 10]; 6 int prime[3450], cnt = 0; 7 8 void Init() 9 { 10 int m = sqrt(maxn + 0.5);

杭电ACM 二 数学求模

Font Size: ← → Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Ea

c语言经典算法—求0—7 所能组成的奇数个数

题目:求0—7 所能组成的奇数个数. 算法思想:这个问题其实是一个排列组合的问题,设这个数为sun=a1a2a3a4a5a6a7a8,a1-a8表示这个数的某位的数值,当一个数的最后一位为奇数时,那么这个数一定为奇数,不管前面几位是什么数字.如果最后一位数为偶数,则这个数一定为偶数.a1-a8可以取0-7这个八个数字,首位数字不为0.从该数为一位数到该数为8位数开始统计奇数的个数:1.当只有一位数时也就是该数的最后一位,奇数个数为42.当该数为两位数时,奇数个数为4*7=283.当该数为三位数时

【c语言】求两个数中不同的位的个数

// 求两个数中不同的位的个数 #include <stdio.h> int dcount(int a,int b) { int count = 0; int num = a ^ b; while (num) { count++; num = num & (num - 1); } return count; } int main() { printf("%d\n", dcount(3, 5)); return 0; } 版权声明:本文为博主原创文章,未经博主允许不得

poj 1611 求0号结点所在集合的元素个数

求0号结点所在集合的元素个数 Sample Input 100 42 1 25 10 13 11 12 142 0 12 99 2200 21 55 1 2 3 4 51 00 0Sample Output 411 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # inc

求一个数二进制中1的个数(优化)。判断一个数是不是2的n次方

求一个数二进制中1的个数: 一般方法: #include<stdio.h> #include<stdlib.h> int   count_one_bits(unsigned int value) { int count = 0; for (int i = 0; i < 32; i++) { if (value & 1 == 1)      (%2相当于&1) { count++; } value = value >> 1;      (右移一位相当

(hdu step 2.3.7)下沙的沙子有几粒?(简单DP:求有m个H,n和D,且任意索引上H的个数都要比D的个数多的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 894 Accepted Submission(s): 505   Problem Descri

因数的个数 线段树维护

Let D(x) be the number of positive divisors of a positive integer x. For example, D(2)?=?2 (2 is divisible by 1 and 2), D(6)?=?4 (6 is divisible by 1, 2, 3 and 6). You are given an array a of n integers. You have to process two types of queries: REPL

c/c++ 求一个整数转换为二进制数时中‘1’的个数

求一个正整数转换为二进制数时中'1'的个数 分析:这道题目就是很简单的位运算,我们可以把这个整数和1进行&操作(就是二进制数中的最低位与1进行&),然后将这个整数进行右移处理,将下个位置的数字移到最低位:反复如此操作直到该数变为0. 1 int NumOf_one(int k) 2 { 3 int count_1 = 0; 4 while(k) 5 { 6 if(k & 1) 7 count_1++; 8 k >>= 1; 9 } 10 return count_1;

【c语言】统计一个数二进制中的1的个数

// 统计一个数二进制中的1的个数 #include <stdio.h> int count(int a) { int count = 0; while (a) { count++; a = a & (a - 1); } return count; } int main() { printf("%d\n", count(10)); printf("%d\n", count(0)); printf("%d\n", count(-