![](https://img-blog.csdnimg.cn/57117166813441069adf4327e6f9e152.jpeg#pic_center)
1.猜想描述
一天夜里,L_S_A灵光乍现想出了如下猜想:
若有x∈N+,则1至x之间的所有整数之和都是非质数吗?
做出猜想后,L_S_A立马开始计算:
若x=5:
计算过程&结果 | 是否为质数 |
---|---|
1=1 | 0_false |
1+2=3 | 1_true |
1+2+3=6 | 0_false |
1+2+3+4=10 | 0_false |
1+2+3+4+5=15 | 0_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.