有时我们可能会遇到需要求解正数的因子的情况
核心思想
假设此时有正数m,以及t(t<m),需要求解t是否为m的因子;
如果是则 t 满足条件:t*n==m(n为某一正整数)。
否则t不是m的因子
基于以上想法,我们来看这样一道题:
题目描述
找出大于1且在10000以内的所有完数,结果保存到out.txt(每个完数占一行)。一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6的因子为1,2,3,而6=1+2+3,因此6是"完数"。
分析
其实质就是求某数的所有因子之和是否等于该数
转化为代码
核心函数
//求得正整数m的所以因子之和(不包括m本身)
int fun(int m)//m为需要求其因子的数
{
int sum=0;//sum即为所有因子之和
for(int t=1;t<m;t++)
{
if(m%t==0)
{
sum=sum+t;//此时的t为m的因子
}
}
return sum;
}
加上文件流部分,以及对1-10000的历遍处理
全部代码
#include<fstream>
using namespace std;
//求得正整数m的所以因子之和(不包括m本身)
int fun(int m)//m为需要求其因子的数
{
int sum=0;//sum即为所有因子之和
for(int t=1;t<m;t++)
{
if(m%t==0)
{
sum=sum+t;//此时的t为m的因子
}
}
return sum;
}
int main()
{
ofstream outfile("out.txt");
for(int i=2;i<=10000;i++)
{
if(fun(i)==i)
outfile<<i<<endl;
}
outfile.close();
return 0;
}
这样这道题目就解决了
最大公因数
谈到因子就不得不说最大公约数了
假设有两数a,b,而他们的公因数r满足a%r==0和b%r==0。
并且r一定大于0,小于a,b其中较小的数
则根据这个想法得到代码
int fun(int a,int b)//求解a,b的最大公约数
{
int s;//s为a,b之间的较小值
if(a>b) s=b;
else s=a;
for(int r=s;r>0;r--)//从s开始向小遍历,
{
if(a%r==0&&a%b==0)
return r;//此时的r为最大公约数
}
}
以上就是关于因子的思考,如果有误还请大佬评论区指正,感谢感谢