计算本题前先了解一下约数
约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数
然后首先要求出n的所有因数,因为题目需要满足的条件是n=L×W×H,因此求出所有的因数后,进行三重暴力循环,找出满足三个因数相乘为n的每一种方式。
#include <iostream>
using namespace std;
/*
*题目分析:
*已知条件:
* n=L×W×H
* n=2021041820210418
*隐藏条件:
* L/W/H为n的因数,n % L(W/H) == 0
*问题:
* 有多少种排列方式
*/
int main()
{
// 请在此输入您的代码
long n = 2021041820210418;
// 存放因数的数组
long arr[128] = {0};
int num = 0;
// 存放结果
int result = 0;
// 求出n的因数
for(long i=1; i<=n/i; i++) //其中n/i,为了减少复杂度折半处理,因数对称
{
//判断i是否为因数,是因数则存入arr数组
if(n % i == 0)
{
arr[num++] = i;
// 再次判断,如果i是n的因数,那么n/i也是n的因数,判断因数是否重复
// 例如2是10的因数,则5也是10的因数
if(i != n/i)
arr[num++] = n/i;
}
}
// 求出n的所有因数后,则进行三重循环,遍历进行条件判断
for(int i=0; i<num; i++)
{
for(int j=0; j<num; j++)
{
for(int k=0; k<num; k++)
{
if(arr[i]*arr[j]*arr[k] == n)
{
result++;
}
}
}
}
cout << result;
return 0;
}
运行结果2430,但是会超时…