蓝桥杯算法训练 素因子去重C++
思路:
最开始自己还是只会暴力求解…只能对20% 多亏老师悉心指点
- 先看如何将正整数分解成质因数(素因子)
如下是循环的起止点:
for(k=2;k<=n; )
{
if(k==n)
}
- 将求出的质因子放到一个数组中保存,数组的下标表示该因子,数组的值为0或1,为1表示有该质因子,最后读取该数组的值,将为1的元素下标相乘。
代码:
#include<iostream>
using namespace std;
bool num[4000000]={0};
int main()
{
long long n,ans=1;
cin>>n;
if(n==2){cout<<n;return 0;}
for(int k=2;k<=n;)
{
if(k==n)
{
num[k]=1;break;
}
else if(n%k==0)
{
num[k]=1;
n=n/k;
}else k++;
}
for(int i=2;i<=n;i++)
{
if(num[i]==1)ans*=i;
}
cout<<ans;
return 0;
}
心得:
比赛时不能直接看到测试结果的,所以要善于自己设计数据来测试,感觉在这一点上我还没经验。
小学时背过100以内的素数感觉还是挺有用的。if(k==n)时说明分解质因数的过程已经结束,最初没有写这个判断,用716539=83* 89* 97 数据debug时发现了错误
代码能通过但是感觉还需要完善,暂时先这样 咩~
数组定义放在main函数中运行出错的原因:
main()内的数组是局部数组,空间开辟时放在栈区,而栈区空间有限,是不会扩展的,因此大数组不在函数内定义,定义为全局数组则可以