1.求因子和
例题:
Description
求一个数的因子和很简单,所以小明很懒就想让你帮忙算一下区间a到b中哪个数的因子和最大,并输出这个数和他的每个因子。
Input
输入a和b,(0<a<=b<10^6).
Output
输出这个数和他的每个因子(相同情况输出最小的),因子从小到大输出。
Sample Input
1 10
Sample Output
10 = 1 + 2 + 5
代码
#include<bits/stdc++.h>
#define MAX 1000005
using namespace std;
int num[MAX];
int main()
{
int i,j,a,b,up;
up=MAX+5;
//求因子和核心算法
for(i=1;i<=up;i++)
{
num[i]-=i;
for(j=i;j<=up;j+=i)
{
num[j]+=i;
}
}
while(~scanf("%d%d",&a,&b))
{
int maxl=a;
for(i=a+1;i<=b;i++)
{
if(num[maxl]<num[i])
maxl=i;
}
printf("%d = 1",maxl);
for(i=2;i<=maxl/2;i++)
{
if(maxl%i==0)
printf(" + %d",i);
}
printf("\n");
}
return 0;
}
2.求因子个数
方法:判断数,如果数不为1,则其因子数起码有两个(自身和1)
然后从i=2开始到sqrt(num)做循环,如果num%i==0,则因子数+2
当然如果两个因子数相同,是必须要去重的
#include<stdio.h>
#include<math.h>
int solve(int x) //返回因子总数
{
if(x==1) return 1;
int up=sqrt(x),count=2;
for(int i=2;i<=up;i++)
{
if(x%i==0)
{
if(i==up&&x/i==i) //如果两因子相同,则+1
count+=1;
else
count+=2;
}
}
return count;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int temp=solve(n);
printf("%d\n",temp);
}
return 0;
}