约数是指若整数a除以整数b(b≠0)除得的商正好是整数而没有余数,比如10的约数分别为1,2,5,10,这些数都能被10整除而没有余数,所以他们都是10的约数。

下面我们来看看约数如何求解

1.传统方法思路:1-a遍历

思路:从1-a遍历,只要这个数能被a整除,那么就把这个数记录起来

int fac[100],t=0;
void get_fac(int a){for(int i=1; i<=a; i++){if(a%i==0){            //如果i能被a整除,那么这个数就是a的因数 fac[t++]=i;    //将所有的因数存储起来,其中fac[t++]相当于fac[t]=i;t++; }}
} 

完整代码

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
int n;
int fac[100],t=0;          //将所有因数存储起来
/*求一个数的所有因数*/
void get_fac(int a){for(int i=1; i<=a; i++){if(a%i==0){            //如果i能被a整除,那么这个数就是a的因数 fac[t++]=i;    //将所有的因数存储起来,其中fac[t++]相当于fac[t]=i;t++; }}
}
int main(){cin>>n;get_fac(n);for(int i=0; i<t; i++){cout<<fac[i]<<" ";}return 0;
}

输出结果

2.1-根号n遍历

如果我们用上面这种方法,数据量一大就承受不了,我们必须找到更快的方法。例如下面这种,它将问题规模缩减至\sqrt{n}

思路:如果一个整数能被\sqrt{n}前整除,那么根号后面一定存在大于\sqrt{n}的一个数能被n整除,这个数是b=n/i。比如45,开根后范围大概是1-3\sqrt{5}(1-5)。遍历1-5,能被45整除的有1,那么就45也能被整除,有3,那么就15也能被整除,有5,那么就9也能被整除

int n;
int fac[100],t=0;
void get_fac(int n){for(int i=1; i<=sqrt(n); i++){//根号前 if(n%i==0){            fac[t++]=i;      //根号后if(n/i != i){      fac[t++]=n/i;    }}}
}

完整代码

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;/*求一个数的所有因数*/
int n;
int fac[100],t=0;
void get_fac(int n){for(int i=1; i<=sqrt(n); i++){//根号前 if(n%i==0){            fac[t++]=i;      //i能被n除尽,所以i是n的因子 //根号后----在满足能被根号前整除才能根号后的判断                if(n/i != i){      //如果有一个数能被i整除,那么大于根号的一定有一个数也能被整除,这个数是b=n/i fac[t++]=n/i;  //但是这个数可能会相同,比如9=3*3,那么我们加一个限制条件,如果n/i不等于i才添加因数,因为如果n/i==i时在根号前已经被添加过一次因数了,不信自己试试9的推导? }}}
}
int main(){cin>>n;get_fac(n);/*输出*/ for(int i=0; i<t; i++){cout<<fac[i]<<" ";}return 0;
} 

输出结果

3.进阶写法:set集合存储不相同元素

当然,如果你学过c++的set集合,你还可以这样写

void get_fac(int x){for(int i=1; i<=sqrt(n); i++){if(n%i==0){fac.insert(i);fac.insert(n/i);}}
}

set集合是一个内部有序且不含重复元素的容器,它可以通过引入头文件#include<set>使用,

它只能通过迭代器iterator访问,通过*it进行访问

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
#include <set>
using namespace std;int n;
set<int> fac;void get_fac(int x){for(int i=1; i<=sqrt(n); i++){if(n%i==0){fac.insert(i);        //set集合插入根号前一个元素fac.insert(n/i);      //set集合插入根号后一个元素}}
}
int main(){cin>>n;get_fac(n);//输出/**  set<int>::iterator it 获取迭代器it*/for(set<int>::iterator it = fac.begin(); it!=fac.end(); it++){//printf("%d ",*it);cout<<*it<<" ";}return 0;
} 

输出结果

各位挑选喜欢的学习就好了。注意:如果是求大数,int换成long long类型就好了

求一个数的所有因子(约数)相关推荐

  1. c语言编程因子和,用c语言求一个数的所有因子

    #include # include #define N 100 long factor(int m,int fac[],int *cp){ int c1,c2,i,k; long s; fac[0] ...

  2. 数学算法:求一个数的质因子

    两种方法,第一种是将所有的素数筛选出来,第二种直接循环就行了(第二种更加的高效). 第一种方法其实就是先将素数筛选出来然后再计算,第二种是直接计算. 第一种的代码 #include<bits/s ...

  3. 求一个数的因子个数/因子和/质因子 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== ...

  4. 暴力 gcd __gcd (详解)C语言求两个数的最大公约数

    首先我们要先知道gcd是什么东西? GCD作为缩写意义有多种.它通常表示最大公约数(greatest common divisor,简写为gcd:或highest common factor,简写为h ...

  5. python求合数的所有因子,0是素数吗(python求一个数的因子)

    相信很多人对于0是素数吗(python求一个数的因子)并不是非常的了解,因此小编在这里为您详解的讲解一下相关信息! 0和1不是质数,因为质数的定义是:在大于1的自然数中,除了1和它本身以外不再有其他因 ...

  6. 质因数 求约数 c语言,【初等数论】 求一个数有多少约数及所有约数之和、分解质因数...

    今天做题遇见,于是就搜了一下,于是就有了这篇文章.(其实我不知道原理....Orz)我觉得分解质因数的最优算法应该不是我这篇文章中的这个.....谁有好的算法可以给我说一下,谢谢. 1.有多少个约数: ...

  7. 求n!中含有某个因子个数的方法

    求n的阶乘某个因子a的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通.其实n!可以表示成统一的方式. n!=(k^m)*(m!)*a   ...

  8. 【面试题视频讲解】求一个数的所有质因子

    P2求一个数的所有质因子 https://www.bilibili.com/video/av91892983?p=2

  9. C++:求整数num中包含因子k的个数

    编写函数factors(num,k),函数功能是:求整数num中包含因子k的个数,如果没有该因子则返回0,例如:32=22222,则factors(32,2)=5.要求输入输出均在主函数中完成. #i ...

最新文章

  1. mysql 大量数据 更改索引_Mysql索引数据结构详解与索引优化
  2. optee应用程序中malloc函数的原理介绍
  3. Python-Numpy的tile函数
  4. Application.DoEvents()的使用
  5. 微信小程序如何发送 http 请求
  6. 迷你型MINI光纤收发器的优势有哪些?
  7. 信息学奥赛一本通(1169:大整数减法)
  8. elementui带输入建议查询_2020年度初级会计成绩查询指南!查询入口+查询流程+常见问题答疑...
  9. Android学习笔记06---电话拨号器的制作:项目结构深化
  10. Innoreader + Rsshub
  11. c语言中char类型的存储形式是,在c语言中char型数据在内存中是怎样的存储形式?...
  12. tomcat升级版本升级
  13. 如何去除Matlab里面的ans?
  14. c语言最大乘积问题,利用C语言来求最大连续子序列乘积的方法
  15. java 实现 word 文档的在线编辑以及流转
  16. Android新手爬坑之路——Failed to find provider info for com.example.databasetest.provider
  17. 论如何通过真值表来求逻辑函数
  18. [转]老师几乎气绝身亡,搞笑....
  19. 让IE6,IE7,IE8共存
  20. 向国外发送邮件用什么邮箱?

热门文章

  1. 帆软设计器安装自定义字体
  2. 2019暑假慈溪中学游记
  3. 全国软件工程专业大学
  4. 用友系统服务器坏了怎么恢复数据,如何恢复用友账套数据?
  5. [CPU+目标检测] openvino实现Robomaster自瞄
  6. 通过J-Flash回读取芯片的固件程序
  7. 囚徒困境(双人博弈)
  8. 【Flink】The parallelism of non parallel operator must be 1
  9. 利用背景图片生成词云
  10. 游戏专属驱动增多,对玩家来说是好事吗?