寻找素数对
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
输入描述
输入中是一些偶整数M(5<M<=10000).
输出描述
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
用例输入 1
20 30 40
用例输出 1
7 13 13 17 17 23
据题知,从输入数的二分之一处开始向左向右寻找可以得到所需答案,由于题目中给出了数据范围,通过打素数表的方式可以很便利的解决问题
AC代码:
#include<bits/stdc++.h>
using namespace std;
int Pr[10010]; // 定义一个整型数组,用于存储素数信息
void Cr() // 定义一个函数,用于生成素数表
{
int i,j; // 定义两个整型变量,用于循环计数
for(i=1;i<=10000;i++)Pr[i]=1; // 初始化素数表,将所有元素设为1(假设所有数都是素数)
for(i=2;i<=10000;i++) // 从2开始遍历到10000
{
if(Pr[i]) // 如果当前数是素数
for(j=2;i*j<=10000;j++)Pr[i*j]=0; // 将该数的倍数标记为非素数
}
return ; // 函数结束,返回空
}
int main() // 主函数
{
int N,C,X,i; // 定义四个整型变量
Cr(); // 调用Cr函数,生成素数表
while(scanf("%d",&N)!=EOF) // 当输入不为EOF时,继续循环
{
X=N/2; // 计算N的一半
for(i=0;X-i>=1;i++) // 从0开始遍历到X的一半
{
if(Pr[X-i]&&Pr[X+i]) // 如果X-i和X+i都是素数
{
printf("%d %d",X-i,X+i); // 输出这两个素数
break; // 跳出循环
}
}
}
return 0; // 程序正常结束,返回0
}
抱歉
如果平面上有n个点,并且每个点至少有2条曲线段和它相连,就是说,每条曲线都是封闭的,同时,我们规定:
1)所有的曲线段都不相交;
2)但是任意两点之间可以有多条曲线段。
如果我们知道这些线段把平面分割成了m份,你能知道一共有多少条曲线段吗?
据题知,有n个点与n条曲线段且封闭时,平面被分割成两份,在此基础上每增加一条曲线段,平面多被分割一份,所以答案即为 n+m-2
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
for(;;){
long long n,m;
cin>>n>>m;
if(n==0 && m==0) break;
else{
cout<<n+m-2<<endl;
}
}
return 0;
}
Nuts
题意:小于10的不采,大于10的采到留10个
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n, ans = 0;
cin>>n;
while(n--)
{
int a;
cin>>a;
if(a > 10) ans += a - 10;
}
cout<<ans;
return 0;
}
To 3
定理:每位相加后的数整除3,则该数整除3
此题就统计每位数余3的情况,随后分情况就可得出所需的答案
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
signed main(){
string s;
cin>>s;
int is0 = 0 , is1 = 0 , is2 = 0;
int sum = 0;
for(int i=0;i<s.length();i++){
int x = s[i]-'0';
sum += x;
if(x%3 == 0) is0++;
else if(x%3 == 1) is1++;
else is2++;
}
if(sum%3 == 0) cout<<0;
else{
if(sum<3) cout<<-1;
else if(sum%3 == 1 && is1 != 0 && s.length()>1) cout<<1;
else if(sum%3 == 2 && is2 != 0 && s.length()>1) cout<<1;
else if(sum%3 == 2 && is2 == 0 && s.length()>2) cout<<2;
else if(sum%3 == 1 && is1 == 0 && s.length()>2) cout<<2;
else cout<<-1;
}
return 0;
}