IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 求一个数的所有因子(约数) -> 正文阅读

[数据结构与算法]求一个数的所有因子(约数)

约数是指若整数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类型就好了

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:38:43  更:2022-04-01 23:41:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:40:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码