算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。
例如
90=2 * 3^2 * 5;

1

我们要做的就是找到90的所有质因子,然后统计个数;
模板:

#include <iostream>
#include<map>
#include<cstdio>
using namespace std;
int a[1000];//用来存放一个数的质因子
map<int,int> mp;//统计每个质因子出现的次数
int main()
{int n;int id=0;//作为数组的下标scanf("%d",&n);for(int i=2;i*i<=n;i++) //一个数的质因子不会超过这个数的算术平方根{if(n%i==0) a[id++]=i;//把满足条件的质数(素数)记录下来while(n%i==0)//并且统计含有多少个这样的质因子{mp[i]++;n/=i;//时刻更新n的值}}if(n>1) a[id++]=n,mp[n]++;//如果n到最后没有被除尽,那么剩下的数也是一个质因子for(int i=0;i<id;i++)printf("%d %d\n",a[i],mp[a[i]]);return 0;
}

结果:

上午写了统计一个数的质因子,下午应用的时候,Runtime error整整一下午;刚开始用上面的方法一直time limit;后来在网上查阅资料,发现可以先对素数打表,然后把是素数的放在一个数组里,依次从小到大判断这个素数是不是当前数的因子;

具体代码如下:

const int maxx=1e6+7;
ll pr[maxx];//标记素数
ll pp[maxx];//存放素数
void prime()
{for(int i = 2; i <= sqrt(maxx); i++)if(!pr[i])for(int j = i * i; j <= maxx; j += i)pr[j] = true;for(int i = 2; i <= maxx; i++)if(!pr[i])pp[cot ++] = i;
}void get_prime(ll n)
{for(int i = 0; i < cot && pp[i] <= sqrt(n); i++)//以此判断数组里面的素数是否为当前数的因子;并且因子要小于当前数的算术平方根{int cc = 0;while(n % pp[i] == 0){cc ++;n /= pp[i];}sum *= (cc + 1);}if(n > 1)sum *= 2;
}

这样写没问题吧,当然;可是就是Runtime error;我数组也没有开特别大或者特别小啊,检查了一下午 交了四十多次;我真的好难啊~~~…
后来发现,题中的内存限制为32Mb,我开了两个1e6的int型数组,用的时候数组太大,造成爆栈,所以runtime error;
改用bool类型的数组好多了,一下子就ac了(bool型只占一个字节)
同时对素数的筛选和记录也换了种方式;

const int maxx = 1e6 + 10;
bool pr[maxx];
ll pp[maxx];
ll sum, cot;
ll a,b;void prime()
{for(int i = 2; i <= sqrt(maxx); i++)if(!pr[i])for(int j = i * i; j <= maxx; j += i)pr[j] = true;for(int i = 2; i <= maxx; i++)if(!pr[i])pp[cot ++] = i;
}void get_prime(ll n)
{for(int i = 0; i < cot && pp[i] <= sqrt(n); i++){int cc = 0;while(n % pp[i] == 0){cc ++;n /= pp[i];}sum *= (cc + 1);}if(n > 1)sum *= 2;
}

写着写着就想吐,太难受了 ,,,,,,一下午四十多发,我好难…

上面代码用到了素数筛和统计因子个数的公式;




到这里就ojbk了。。。。

算术基本定理之统计质因子个数———以及因子的个数相关推荐

  1. 求一个数的因子个数/因子和/质因子 C/C++实现

    求一个数的因子个数时间复杂度O√n ll get_number(ll x){ll num=0;for(ll i=1;i*i<=x;i++){if(x%i==0) num+=2; if(i*i== ...

  2. 数论:求一个数的因子专题(因子数,因子和,质因子)

    问题1-求n的因子数.因子和 输入一个正整数N,求出这个数字存在多少个因子,以及因子之和. 分析 既要求因子数,又要求因子和,因此我们要从1开始遍历一直到根号n,如果n%i==0,因子数+2,因子和要 ...

  3. 聊一聊数学中的基本定理(一)——算术基本定理的证明

    早点关注我,精彩不错过! 系列开篇辞 在每一个独立出来的学科中,无论文科还是理科,总会有几个标志性的成果和结论,一定程度上代表了这个学科的特点,光荣和本质.比如物理学的牛顿定律和相对论,信息科学中的熵 ...

  4. 算术基本定理(维基百科)

    算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数,若不是本身就是质数,就是可写为2个以上的质数的积,而且这些质因子按大小排列之后,写法仅有一种方式.例如:{\displaystyle ...

  5. 算术基本定理“质数分解唯一性的证明”:古典方法与现代方法

    算术基本定理的最早证明是由欧几里得给出的. 每一个比1大的自然数N只能有一种方式分解成质数的乘积. 推论:若一个质数p是乘积ab的因子,则p不是a的因子就是b的因子. 大于1的自然数必可写成质数之积 ...

  6. 对 算术基本定理 的研究

    写在前面: 数论被誉为数学皇后,是研究整数性质的理论(好多人对数论的范围不清楚额) 而算术基本定理是数论中的重要定理 这篇文章是我对于算术基本定理的一些研究,研究的资料源自博客,百科,问答,持续更新 ...

  7. 因式分解,算术基本定理,积性函数(POJ 1452 Happy2004)

    积性函数:是指对于所有互质的整数a和b有性质f(ab) = f(a) * f(b) 算术基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积,即N = p1^x1 * p2^x2 * p3^ ...

  8. 最大公约数、最小公倍数与算术基本定理

    最大公约数.最小公倍数与算术基本定理 最大公因数和最小公倍数与素数分解式有什么联系呢? 举个例子:我们尝试分解样例中的提到的一组数12,15(最大公约数和最小公倍数分别是3和60): 12 = 2 2 ...

  9. 统计阶乘结果的末尾0的个数

    统计结成结果的末尾0的个数 今天看到一道题目,是让求解 1024! 末尾的0的个数.对于这个问题,作者首先想到了蛮力法..先将阶乘的结果计算出来放入数组然后统计末尾0的个数.这样做的话首先得先进行较大 ...

最新文章

  1. Spring Boot 面试杀手锏:自动配置原理
  2. RAR压缩包审计工具unrar-nofree
  3. NTU 课程笔记 :NLP - language model
  4. 理解OAuth 2.0--转
  5. 数据类型介绍和表的创建
  6. Hadoop MapReduce编程 API入门系列之wordcount版本2(六)
  7. 如何确认虚拟机被哪台主机锁定以及如何解锁
  8. [Java] 获取当前Project所在的路径
  9. python SQLite 初识
  10. kafka集群安装配置
  11. python绘制贝塞尔曲线_贝塞尔曲线数学原理及Python实现
  12. ndows 内存诊断工具,Windows自带内存诊断工具来帮你检测电脑内存的稳定
  13. java手机牧场物语,Minecraft Java版 19w09a 发布
  14. HelloWorld
  15. 飞行控制系统中高度的表示
  16. 求一个数的平方c语言函数实现,C++中数的平方是什么函数?
  17. 头条小程序登录40014 bad params
  18. python声纹识别_声纹识别算法、资源与应用(二)
  19. 程序员技术面试与HR谈薪资技巧的一些经验心得
  20. AWS 亚马逊云良好架构框架

热门文章

  1. 【在线研讨】《敏捷开发用户故事分类与组织结构(三期-4)》
  2. 微软的重点服务器负载均衡,微软 NLB 负载均衡技术对网络的影响
  3. SpringMVC jsp
  4. 使用 Kotlin 协程创建动态代理
  5. 【金融量化】如何判断一个基金是不是主动型基金还是被动型基金?
  6. ORACLE创建用户,授权指定表权限
  7. MySQL知识(十九)——用户管理之权限表
  8. Web端用到的Excel插件
  9. epel源的搭建方式
  10. 用OleDbParameter参数类要注意参数顺序必须和SQL文中参数顺序一致