题目内容:
解决办法:
L W H必然是n的因数,先确定三个数的可能值(即求2021041820210418的因数,为了减少暴力试数的次数和时间),然后暴力试数即可。
C语言写法如下:
#include <stdio.h>
int main()
{
const long long int n = 2021041820210418;//货物数 常量
long long int i,p;//p用于法二
long long int m[1000];
int cnt = 0,a,b,c,k = 0;//cnt就代表2021041820210418的因数数
//k是最终要求的方法数
//第一种因数求法:
#if 0 //可自行选择用法一/法二 修改此处0/1即可
for(i = 1;i * i <= n;i++)
{
if(n % i == 0)
{
m[cnt++] = i;
m[cnt++] = n/i;
}
}//原理:一组因数必然一个比根号n小,一个比根号n大(平方数平方时例外)
//第二种因数求法:
#else
p = n;
for(i = 1;i < p;i++)
{
if(n % i == 0)
{
m[cnt++] = i;
m[cnt++] = n/i;
p = n/i;
}
}//原理:找因数时是两端(0、n端)向根号n靠近
#endif
//开始遍历法暴力试数
for(a = 0;a < cnt;a++)
for(b = 0;b < cnt;b++)
for(c = 0;c < cnt;c++)
if(m[a] * m[b] * m[c] == n)
k++;
printf("%d",k);
return 0;
}
注意:
这里给出的两种求因数的方法实际上区别就是在减少循环次数的思路上不同,且都有一个缺陷:对于平方数(1、4、9…)会重复计算他的开方作为因数!
这里的2021041820210418不是平方数 。
思维点:
减少循环次数(求因数和试数时皆有体现)、暴力试数(蓝桥杯常考点)