一个求质数的程序,数据溢出了。
在判断一个数字是否为质数时,如果数字N是固定的,则最好事先算出它的平方根,并且放入一个变量中,这样是最简单方便的。
这样循环的次数就固定了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,j;
cin>>n;
j=0;
int t=sqrt(n);
for ( int i=2;i<=t;i++)
//如果写在i<=sqrt(n),则每次进行循环的时候,还要算一下sqrt(n),浪费时间了
if (n%i==0)
{
cout<<"Not a prime"<<endl;
return 0;
}
cout<<"It is a prime "<<endl;
}
但如果是下面这个写法,则对于n=2147483647时,是会出错的。
原因是循环中i*i<=N时,爆类型了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,j;
cin>>n;
j=0;
int t=sqrt(n);
for ( int i=2;i*i<=n;i++)
{
if(1ll*i*i>n)
{
cout<<"find wrong "<<i<<" "<<i*i<<" "<<1ll*i*i<<endl;
system("pause");
}
if (n%i==0)
{
cout<<"Not a prime"<<endl;
return 0;
}
}
cout<<"It is a prime "<<endl;
}
为了防止爆类型,可将乘法改成除法。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,j;
cin>>n;
j=0;
int t=sqrt(n);
for ( int i=2;i<=n/i;i++)
{
if(1ll*i*i>n)
{
cout<<"find wrong "<<i<<" "<<i*i<<" "<<1ll*i*i<<endl;
system("pause");
}
if (n%i==0)
{
cout<<"Not a prime"<<endl;
return 0;
}
}
cout<<"It is a prime "<<endl;
}

浙公网安备 33010602011771号