标题:素数的距离问题
只看楼主
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
已结贴  问题点数:20 回复次数:9 
素数的距离问题
素数距离问题
时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
3
6
8
10
样例输出
5 1
7 1
11 1



#include <iostream>
#include <cmath>
using namespace std;

bool is_Primer(int x)
{
    if(x<2)
        return false;
    for(int i=2;i<=sqrt(x);++i)
        if(x%i==0)
            return false;

    return true;
}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        if(x==1)
        {
            cout<<"2"<<" "<<"1"<<endl;
            continue;
        }
        if(x==0)
        {
            cout<<"2"<<" "<<"2"<<endl;
            continue;
        }
        if(is_Primer(x))
        {
            cout<<x<<" "<<"0"<<endl;
            continue;
        }
        
        int left;
        for(int i=x-1;i>1;--i)
            if(is_Primer(i))
            {
                left=i;
                break;
            }
            
        int right;
        for(int i=x+1;i<1000000;++i)
            if(is_Primer(i))
            {
                right=i;
                break;
            }
        
        if(right-x<x-left)
            cout<<right<<" "<<right-x<<endl;
        else if(right-x>=x-left)
            cout<<left<<" "<<x-left<<endl;
    }
    return 0;
}

这一题测试结果都对,答案总是wronganswer、。。
搜索更多相关主题的帖子: 素数 距离 输出 int cout 
2018-04-25 12:48
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:20 
你是在哪里提交的?下述代码我在南阳oj中提交accept
程序代码:
#include <stdio.h>
int ispri(int n)
{
    int i;
    if(n==2)return 1;
    if(n<2||!(n%2))return 0;
    for(i=3;i*i<=n&&n%i;i+=2);
    return i*i>n;
}
int main()
{
    int m,n,i;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(i=0;;i++)
        {
            if(ispri(m-i))
            {
                printf("%d %d\n",m-i,i);
                break;
            }
            if(ispri(m+i))
            {
                printf("%d %d\n",m+i,i);
                break;
            }
        }
    }
    return 0;
}

能编个毛线衣吗?
2018-04-25 17:20
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 2楼 wmf2014
我也是 你能看下我的代码哪里出问题了吗?
2018-04-25 17:25
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
    for(i=3;i*i<=n&&n%i;i+=2);
    return i*i>n;

你这是什么意思?我刚测试了一下,只要是素数返回值都是1,能解释一下吗??没看懂。。return i*i>n;
2018-04-25 17:48
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
对你的代码进行了n次提交后可以accept了,修改如下:
1,for(int i=x-1;i>1;--i)修改为for(int i=x-1;;--i)
2,for(int i=x+1;i<1000000;++i)修改为for(int i=x+1;;++i)

能编个毛线衣吗?
2018-04-25 17:49
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 4楼 花脸
关系运算结果不是1就是0

能编个毛线衣吗?
2018-04-25 17:51
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 6楼 wmf2014
嗯好的谢谢、
2018-04-25 21:08
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 5楼 wmf2014
我刚试了下把for(int i=x+1;i<1000000;++i)改成for(int i=x+1;;++i)就可以啦,for(int i=x-1;i>1;--i)不用动。

[此贴子已经被作者于2018-4-25 21:23编辑过]

2018-04-25 21:09
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 8楼 花脸
嗯,其实只要把for(int i=x+1;i<1000000;++i)改成for(int i=x+1;i<1000010;++i)也可以,你一楼代码只有999994--999999这段数据没覆盖,他们最近的素数时1000003,大于1000000。

能编个毛线衣吗?
2018-04-26 08:24
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 9楼 wmf2014
我怎么感觉是1000001
2018-04-26 09:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486372-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.120005 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved