题目描述
给定n求有多少个正整数使得n=abc;
样例
12=1*1*12;
算法1
(暴力枚举)
#define n 2021041820210418
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
int main()
{
LL res = 0;
for (LL i = 1;i * i * i <= n;i++)//i<=j<=k;
{
if (n % i == 0)
{
for (LL j = i;i * j * j <= n;j++)
{
if (n / i % j == 0)
{
LL k = n / i / j;
if (i == j && j == k) res++;//三个数字相同
else if (i != j && j != k) res+=6;//三个不同的数字有三种排序
else res += 3;//有两个数字相同,只有三种排序
}
}
}
}
cout << res << endl;
return 0;
}
算法2
(优化一点)
//先求所有公因数
int main()
{
set<LL> s;
for (int i = 1;i <= n / i;i++)
{
if (n % i == 0)
{
s.insert(i);
s.insert(n / i);
}
}
int k = s.size();
int res = 0;
for (auto a : s)//stl容器遍历,vector等也可,作用是用a遍历s中的所有元素
for (auto b : s)
for (auto c : s)
if (a * b * c == n)
res++;
cout << res << endl;
return 0;
}
对于以下求因数代码:
//求因数,为什么这样子求因数是错的
求因数看不出哪错了,感觉挺对的,就是有可能会超时
还有就是,ant这种计数的最好给他赋初值0;
哥,为什么计数最好赋值初值0呀?(上面因数就是对的,只是超时的不是一星半点,没注意)
极小部分编译器会不给默认初值0;
谢谢佬佬