0x31 数学知识-质数-A Prime Distance

链接:https://ac.nowcoder.com/acm/contest/1021/A
来源:牛客网

The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of years is the question of primality. A prime number is a number that is has no proper factors (it is only evenly divisible by 1 and itself). The first prime numbers are 2,3,5,7 but they quickly become less frequent. One of the interesting questions is how dense they are in various ranges. Adjacent primes are two numbers that are both primes, but there are no other prime numbers between the adjacent primes. For example, 2,3 are the only adjacent primes that are also adjacent numbers.
Your program is given 2 numbers: L and U (1≤L<U≤2,147,483,647), and you are to find the two adjacent primes C1 and C2(L≤C1<C2≤U)that are closest (i.e. C2-C1 is the minimum). If there are other pairs that are the same distance apart, use the first pair. You are also to find the two adjacent primes D1 and D2(L≤D1<D2≤U)where D1 and D2 are as distant from each other as possible (again choosing the first pair if there is a tie).

数论是数学的一个分支,它是关于数的性质的。几千年来吸引了数理论家兴趣的领域之一是原始性问题。素数是指没有适当因子的数(它只能被1和它本身整除)。第一个素数是2,3,5,7,但它们很快就变得不那么频繁了。其中一个有趣的问题是,它们在不同范围内的密度有多大。相邻素数是两个都是素数的数,但相邻素数之间没有其他素数。例如,2,3是唯一相邻的素数,也是相邻的数。
你的程序有两个号码:l和U(1≤L<U≤2,147,483,647),您将找到两个相邻的素数c1和c2。(L≤C1<C2≤U)是最近的(即C2-C1是最小值)。如果有其他对的距离是相同的,使用第一对。您还将找到两个相邻的素数d1和d2。(L≤D1<D2≤U)其中d1和d2尽可能地彼此相距(如果有领带的话,同样选择第一对)。

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define db printf("where!\n");
#define pb push_back
using namespace std;
#define ll long long
#define MP std::make_pair
ll gcd(ll x,ll y){return y ? gcd(y,x%y) : x;}
template<class T>inline void read(T &res){
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
const int maxn=1e6;
int prime[maxn+10];
 
void getPrime()//使用欧拉筛法
{
    for(int i=2;i<=maxn;i++)
    {
        if(!prime[i])
            prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}
 
bool isprime[maxn+10];
int prime2[maxn+10];
 
void getPrime2(int L,int R)
{
    memset(isprime,1,sizeof(isprime));
    if(L<2) L=2;
    for(int i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++)
    {
        int s=L/prime[i]+(L%prime[i]>0);//计算第一个比L大且能被prime[i]整除的数是prime[i]的几倍,从此处開始筛
        if(s==1)//非常特殊,假设从1開始筛的话,那么2会被筛成非素数
            s=2;
        for(int j=s;(long long)j*prime[i]<=R;j++)
            if((long long)j*prime[i]>=L)
            isprime[j*prime[i]-L]=false; //区间映射 ,比方区间长度为4的区间[4,7],映射到[0,3]中,由于题目范围2,147,483,647数组开不出来
    }
    prime2[0]=0;
    for(int i=0;i<=R-L;i++)
        if(isprime[i])
        prime2[++prime2[0]]=i+L;
}
 
int main()
{
    getPrime();
    int L,R;
    while(scanf("%d%d",&L,&R)!=EOF)
    {
        getPrime2(L,R);
        if(prime2[0]<2)
            printf("There are no adjacent primes.\n");
        else
        {
            int x1=0,x2=1000000,y1=0,y2=0;
            for(int i=1;i<prime2[0];i++)
            {
                if(prime2[i+1]-prime2[i]<x2-x1)
                {
                    x1=prime2[i];
                    x2=prime2[i+1];
                }
                if(prime2[i+1]-prime2[i]>y2-y1)
                {
                    y1=prime2[i];
                    y2=prime2[i+1];
                }
            }
            printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
收到数据后,可以先将数据进行转义,然后再将转义后的数据保存为 jpg 格式的图片,可以参考以下示例代码实现: ```java import java.io.*; public class DataHandler { public static void main(String[] args) { // 接收到的数据 byte[] receivedData = new byte[]{0x7D, 0x01, 0x7D, 0x02, 0x7D, 0x03, 0x7D, 0x04, 0x7D, 0x05}; // 转义数据 byte[] escapedData = escapeData(receivedData); // 保存为 jpg 格式的图片 saveJpgFile(escapedData); } // 转义数据 private static byte[] escapeData(byte[] data) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); for (byte b : data) { switch (b) { case 0x7D: outputStream.write(0x7D); outputStream.write(0x01); break; case 0x02: outputStream.write(0x5B); break; case 0x03: outputStream.write(0x5D); break; case 0x04: outputStream.write(0x2C); break; case 0x05: outputStream.write(0x2A); break; default: outputStream.write(b); break; } } return outputStream.toByteArray(); } // 保存为 jpg 格式的图片 private static void saveJpgFile(byte[] data) { FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("image.jpg"); fileOutputStream.write(data); } catch (IOException e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在这个示例代码中,我们使用了 ByteArrayOutputStream 和 FileOutputStream 类分别进行数据转义和保存图片。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值