做该题大概要注意以下几方面:
①每个自然数都可分解成质因数相乘的形式
②数分为三类:质数是不为1,并且因数只为1和其本身的数。和数是不为1且不为质数的数。1既不是质数也非和数。
③题目虽说输入的是64-bits signed integer,单输入一定没有负数。比如输入-2,其因数为-1,-2,1,2。-1、-2都不能由2、3、5、7的任意组合得到。
大概思路:
把输入数据分解,也就是找到2、3、5、7的个数,分别用a2、a3、a5、a7记录,在AC代码中是用divide()函数实现的。
其次,就是找出由2、3、5、7可以组合出多少个不同的因数,在count()中四重for循环实现。
其中在找组合出的因数时可以肯定的是:该次找的因数一定不同于以前所找到的任何因数。因为该次得到的因数跟以前任何一次得到的因数所用的2、3、5、7
的组合一定不同(2、3、5、7各自个数不同)。
本人在做该题时把count()函数写成了void count(int n),结果WA了两次!!!
AC代码:250MS
#include<iostream>
using namespace std;
int a2,a3,a5,a7; //记录质因数个数
void divide(__int64 n) //搜出每个质因数的个数
{
a2=a3=a5=a7=0;
while(n!=1)
{
if(n%2==0)
{
a2++;
n/=2;
}
if(n%3==0)
{
a3++;
n/=3;
}
if(n%5==0)
{
a5++;
n/=5;
}
if(n%7==0)
{
a7++;
n/=7;
}
}
}
void count() //暴力枚举每种组合
{
int cou=0;
for(int i=0;i<=a2;i++)
{
for(int j=0;j<=a3;j++)
{
for(int k=0;k<=a5;k++)
{
for(int p=0;p<=a7;p++)
{
cou++;
}
}
}
}
cout<<cou<<endl;
}
int main()
{
__int64 n;
while(cin>>n,n)
{
divide(n);
count();
}
return 0;
}