对于我们来说求两个数的LCM(最小公倍数)是很容易的事,现在我遇到了一个问题需要大家帮助我来解决这问题,问题是:给你一个数n,然后统计有多少对(a<=b) LCM(a,b)=n;例如LCM(a,b)=12; 即(1,12),(2,12),(3,12),(4,12),(6,12),(12,12),(3,4),(4,6);
Input
输入数组有多组,每组数据包含一个整数n(n<=10^9);
Output
输出每组数据的对数。
Sample Input
2 3 4 6
Sample Output
2 2 3 5
该题用打表的方法做,把输入的n 的因数放到一个数组,然后 sort排序,判断最小公倍数的值是不是等于n 若是则加一
重点:可以用 该公式求最大公约数:ans=__gcd(x,y)两个下划线!
#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
int n,a[100000],b,i,j,ge=0,k,t=0;
while(~scanf("%d",&n))
{
t=0;
ge=1;
k=sqrt(n);
for(i=1; i<=k; i++)
if(n%i==0)
{
a[t++]=i;
a[t++]=n/i;
}
sort(a,a+t);
for(i=0; i<=t-2; i++)
for(j=i+1; j<=t-1; j++)
{
b=__gcd(a[i],a[j]);
if(a[i]/b*a[j]==n)
ge++;
}
if(k*k==n)
ge-=1;
printf("%d\n",ge);
}
}
5713

被折叠的 条评论
为什么被折叠?



