计算本题前先了解一下约数
约数,又称因数。整数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,但是会超时…