一个求质数的程序,数据溢出了。

在判断一个数字是否为质数时,如果数字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;
}
 

 

  

 

posted @ 2025-05-04 17:55  我微笑不代表我快乐  阅读(13)  评论(0)    收藏  举报