首先要读懂题目,质因子就是质因数。
接下来再看这道题,这道题看似要分解质因数,实际上只要求出这个数的质数因子就可以了。
简化问题:首先这道题是对n\!做分解质因数,实际上就是对n*(n-1)*…*2*1做分解质因数。(废话)我们可以用9*8分解质因数来举例,9*8=(3*3)*(2*2*2),所以对n\!分解质因子就是对<=n的所有数分解质因数,再将各个质因数的数量进行加和。(再进一步简化:(本蒟蒻没做)一些较大的数可以分解成两个较小的数再进行质因数分解,例:144=6*6*4)
解决思路:打表万岁本来想做打表,又怕打表太慢,于是加了亿点优化,做完习惯提交先骗一点分,结果就AC了。
解题方法:外层循环遍历每一个小于等于n的数
for(; n>1; n--)
然后进行一段我也不知道有什么用的代码
if(!a[n]){
for(int i=2; i*n<=10000; i++){
a[i*n]=1;
}
}
没错,我也不知道有什么用,但我第一次编的时候就是加上了。不过对最外层循环改成从2-n可以优化程序。
然后进行质因数分解
int ans=0,cnt=n;
for(int i=2; cnt>1&&i<=cnt; i++){
if(!a[i]){//没什么大用
while(cnt%i==0){
cnt=cnt/i;
ans++;
}
}
if(ans>0){
b[i]+=ans;
ans=0;
}
}
最后输出
for(int i=0; i<=10000; i++){
if(b[i]>0){
cout << i << " " << b[i] << endl;
}
}
有一句话叫做题解仅供抄袭和复制使用,但这是不对的。不能学习。下面是优化过但不多的代码。
#include<bits/stdc++.h>
using namespace std;
long long n,a[20000];
long long b[20000];
int main(){
cin >> n;
for(int j=2; j<=n; j++){
if(!a[j]){
for(int i=2; i*j<=n; i++){
a[i*j]=1;
}
}
int ans=0,cnt=j;
for(int i=2; cnt>1&&i<=cnt; i++){
if(!a[i]){
while(cnt%i==0){
cnt=cnt/i;
ans++;
}
}
if(ans>0){
b[i]+=ans;
ans=0;
}
}
}
for(int i=0; i<=10000; i++){
if(b[i]>0){
cout << i << " " << b[i] << endl;
}
}
return 0;
}
后记
在我用打表程序直接提交的时候大数据测试点RE了,我便查找了10分钟,发现是数组开小了10倍(悲)
Q:为什么题目有小黑子?
A:因为质因数分解标题名称被抢了=<