看着实在不顺眼
查看原帖
看着实在不顺眼
1638140
chang20140130楼主2025/1/24 07:35

各位大佬麻烦看一下,我why看着不对?(我这个电脑老死机)

感谢!!!

#include<iostream>
#include<cmath>//要用sqrt函数
using namespace std;
int l,ans=0,count=1,sum=0,a[100010];//l是和的范围,ans是最多能装多少个质数,count是辅助a数组存入质数的计数器,a数组就是用来存质数的一个质数表。
int isZhishu(int n){//判断是否是质数的函数。
	if(n==2||n==3||n==5||n==7||n==11||n==13){//判断,如果没有那么下面的优化就是错的,因为它会把上面的数全部算成合数。(实在看不懂可以自己举几个例子)
		return true;
	}    if(n%2==0||n%3==0||n%5==0||n%7==0||n%11==0||n%13==0||n==1){//优化,n=1也要return false。
		return false;
	}
	for(int i=2;i<=sqrt(n);i++){//判断,判断一个数是否是质数只要判断到它的开方就可以了。
		if(n%i==0){
			return false;
		}
	}
	return true;
}
int main(){
	cin>>l;
	for(int i=1;;i++){//不用写i<=多少,到时候直接break就可以了。
		if(isZhishu(i)==1){
			a[count]=i;//用count辅助存储质数
			sum+=i;//用和帮助判断是否越界
			ans++;//总质数数量++
			count++;//计数器++;
		}
		if(sum>l){//如果越界
			sum-=i;//减掉使它越界的质数
			a[count]=0;//在质数表里删掉它
			count-=2;//这里一定要减2,因为count初始=1,当1加完了count就变成了2,2加完了count就变成了3,以此类推。实在没看懂的可以举几个例子。
			ans--;//总质数数量--
			break;//跳出
		}
	}
	for(int i=1;i<=count;i++){//打印质数表
		cout<<a[i]<<endl;
	}
	cout<<ans<<endl;//输出总质数数量
	return 0;//好习惯
}

//感谢审核!!!
2025/1/24 07:35
加载中...