[C++]正整数累加之和中的质数


1.猜想描述

一天夜里,L_S_A灵光乍现想出了如下猜想:

若有x∈N+,则1至x之间的所有整数之和都是非质数吗?

做出猜想后,L_S_A立马开始计算:

若x=5:

计算过程&结果是否为质数
1=10_false
1+2=31_true
1+2+3=60_false
1+2+3+4=100_false
1+2+3+4+5=150_false

一番计算后,L_S_A认为样本量太过渺小,不足以说明什么,于是想到了通过编写程序来扩大样本量

2.构造程序

事先声明:

typedef long long int l;

(1)
首先,应编写一段函数以判断1至x之间的所有整数之和是否为质数,即Prime Number
以下为zs函数:

l zs(l a){//zs函数判断质数 
	if(a==1){
		return 0;//返回值0代表非质数 1代表质数 
	}
	if(a%2==0&&a!=2){
		return 0;//提前过滤偶数(除2外) 
	}
	for(l i=3;i<=sqrt(a);i+=2){//i为a可能拥有的因数 当i>sqrt(a)后便没有继续排查的必要 
		if(!(a%i)){//若a%i!=0 
			return 0;
		}
	}
	z++;
	return 1;
}

其中a表示1至x之间的所有整数之和,i为模拟因数
关于sqrt(a):
sqrt(a)可以理解为一个分界点,当i>sqrt(a)后,a/i的结果便会<sqrt(a),而i已遍历过<sqrt(a)的所有奇数(除1外),便无必要继续排查
(2)
其次便是输入x并逐次输出1至x之间的所有整数之和的主函数部分:

注:程序会输出1的和,1+2的和,1+2+3的和一直到1+2+3+...+x的和
	l x;
	cout<<"正整数累加之和中的质数演算器v1.9.1 Made By L_STUDIO_ACE 2023 8.19 Sat."<<endl;
	cout<<"Please enter a positive integer : "<<endl;//输入一个正整数 代表演算终止值 
	cin>>x;
	l zsjs[x+1]={0};//zsjs指"质数计数" 
	for(l i=1;i<=x;i++){
		cout<<endl;
		l h=(i*i+i)/2;//h表示和
		cout<<i<<"."<<endl<<"1";
		for(l p=2;p<=i;p++){
			cout<<"+"<<p;
		}
		l r=zs(h);
		if(r){
			zsjs[i]++;//若i为质数 则zsjs数组中代表i的位置的值自加一 
		}
		cout<<"="<<h<<endl<<"Result : "<<r<<endl;
	}

关于变量h(和)为什么是(i^2+i)/2:
h = 1 + 2 + 3 + . . . + i h=1+2+3+...+i h=1+2+3+...+i
运用等差数列的求和公式,即:
S n = 1 2 n ( a 1 + a n ) S_n=\frac{1}{2}n(a_1+a_n) Sn=21n(a1+an)
原式可化为:
h = 1 2 i ( i + 1 ) h=\frac{1}{2}i(i+1) h=21i(i+1) h = 1 2 ( i 2 + i ) h=\frac{1}{2}(i^2+i) h=21(i2+i)
(3)
最后是输出部分:

	cout<<endl<<"Final Result :"<<endl<<"There ";//以下为分类输出: 无质数||单个质数||多个质数 
	if(z==0){
		cout<<"is no Prime Number.";
		return 0;
	}else if(z==1){
		cout<<"is only one Prime Number."<<endl;
		cout<<"Its number is :"<<endl;
	}else{
		cout<<"are "<<z<<" Prime Numbers."<<endl;
		cout<<"Their numbers are :"<<endl;
	}
	for(l m=1;m<=x;m++){
		if(zsjs[m]){
			cout<<m<<"."<<" its result is : ";//如果有质数则输出序号
			l o=1;
			for(l n=2;n<=m;n++){
				o+=n;
			}
			cout<<o<<endl;//输出结果 
		}
	}

(4)
整合一下,以下为程序全代码:

#include<iostream>
#include<cmath>
using namespace std;
typedef long long int l;
l z;//z代表质数的个数 
l zs(l a){//zs函数判断质数 
	if(a==1){
		return 0;//返回值0代表非质数 1代表质数 
	}
	if(a%2==0&&a!=2){
		return 0;//提前过滤偶数(除2外) 
	}
	for(l i=3;i<=sqrt(a);i+=2){//i为a可能拥有的因数 当i>sqrt(a)后便没有继续排查的必要 
		if(!(a%i)){//若a%i!=0 
			return 0;
		}
	}
	z++;
	return 1;
}
int main(){
	l x;
	cout<<"正整数累加之和中的质数演算器v1.9.1 Made By L_STUDIO_ACE 2023 8.19 Sat."<<endl;
	cout<<"Please enter a positive integer : "<<endl;//输入一个正整数 代表演算终止值 
	cin>>x;
	l zsjs[x+1]={0};//zsjs指"质数计数" 
	for(l i=1;i<=x;i++){
		cout<<endl;
		l h=(i*i+i)/2;//h表示和
		cout<<i<<"."<<endl<<"1";
		for(l p=2;p<=i;p++){
			cout<<"+"<<p;
		}
		l r=zs(h);
		if(r){
			zsjs[i]++;//若i为质数 则zsjs数组中代表i的位置的值自加一 
		}
		cout<<"="<<h<<endl<<"Result : "<<r<<endl;
	}
	cout<<endl<<"Final Result :"<<endl<<"There ";//以下为分类输出: 无质数||单个质数||多个质数 
	if(z==0){
		cout<<"is no Prime Number.";
		return 0;
	}else if(z==1){
		cout<<"is only one Prime Number."<<endl;
		cout<<"Its number is :"<<endl;
	}else{
		cout<<"are "<<z<<" Prime Numbers."<<endl;
		cout<<"Their numbers are :"<<endl;
	}
	for(l m=1;m<=x;m++){
		if(zsjs[m]){
			cout<<m<<"."<<" its result is : ";//如果有质数则输出序号
			l o=1;
			for(l n=2;n<=m;n++){
				o+=n;
			}
			cout<<o<<endl;//输出结果 
		}
	}
	cin.get();
	cin.get();
	return 0;
}

v1.9.1

3.示例输出

以下为输入数字5时程序输出的全部文本:

正整数累加之和中的质数演算器v1.9.1 Made By L_STUDIO_ACE 2023 8.19 Sat.
Please enter a positive integer :
5

1.
1=1
Result : 0

2.
1+2=3
Result : 1

3.
1+2+3=6
Result : 0
	
4.	
1+2+3+4=10
Result : 0

5.
1+2+3+4+5=15
Result : 0

Final Result :
There is only one Prime Number.
Its number is :
2. its result is : 3

Made By L_STUDIO_ACE 2023/8/18 FRI.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值