SMU Summer 2024 Contest Round 3

寻找素数对

哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.

输入描述

输入中是一些偶整数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值