zoukankan      html  css  js  c++  java
  • 难度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
    -----------------------------------------标准分界线----------------------------------------------
    第一次写这个题目的程序,我忘了什么是素数了,然后百度了下。。。。所谓素数就是大于1的数,且该数只能被1和其本身整除。
    -----------------------------------------------------------------------------------------------------
    以下是我自己写的几次程序,前几次的程序在上传OJ时出现了超时运行的错误导致无法上传成功。。。。。。。。。。。(这个OJ是在为难我胖虎。。。。。。。。。。。)
    1)
     1 #include<iostream>
     2 #include<cmath>
     3 
     4 using namespace std;
     5 
     6 int isPrime(int n)
     7 {
     8     if (n < 2)
     9         return 0;
    10     else
    11     {
    12         for (int i = 2; i <= sqrt(n); i++)
    13         {
    14             if (n%i == 0)
    15                 return 0;
    16         }
    17         return 1;
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     int M, N;
    24     cin>>N;
    25     while (N--)
    26     {
    27         for (int i = 0; i < N; i++)
    28         {
    29             int A, B;
    30             cin >> M;
    31 
    32             for (int i = 1; i < 1000000; i++)
    33             {
    34                 if (isPrime(M))
    35                 {
    36                     cout << M << " " << 0 << endl;
    37                     break;
    38                 }
    39                 A = M - i;
    40                 if (isPrime(A))
    41                 {
    42                     cout << A << " " << i << endl;
    43                     break;
    44                 }
    45                 B = M + i;
    46                 if (isPrime(B))
    47                 {
    48                     cout << B << " " << i << endl;
    49                     break;
    50                 }
    51             }
    52         }
    53     }
    54     return 0;
    55 }

    2)

     1 #include<iostream>
     2 #include<cmath>
     3 
     4 using namespace std;
     5 
     6 int isPrime(int n)
     7 {
     8     if (n < 2)
     9         return 0;
    10     else
    11     {
    12         for (int i = 2; i <= sqrt(n); i++)
    13         {
    14             if (n%i == 0)
    15                 return 0;
    16         }
    17         return 1;
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     int M, N;
    24     cin>>N;
    25       if(N>0&&N<=10000) 
    26        {
    27            while (N--)
    28      {
    29         for (int i = 0; i < N; i++)
    30         {
    31             int A, B;
    32             cin >> M;
    33 
    34             for (int i = 1; i < 1000000; i++)
    35             {
    36                 if (isPrime(M))
    37                 {
    38                     cout << M << " " << 0 << endl;
    39                     break;
    40                 }
    41                 A = M - i;
    42                 if (isPrime(A))
    43                 {
    44                     cout << A << " " << i << endl;
    45                     break;
    46                 }
    47                 B = M + i;
    48                 if (isPrime(B))
    49                 {
    50                     cout << B << " " << i << endl;
    51                     break;
    52                 }
    53             }
    54         }
    55       }
    56       }
    57       else
    58       {
    59             cout<<"Input Error!"<<endl;
    60       }
    61     return 0;
    62 }
    以上的程序都是超时但是能进行运行的,就是运行速度太慢。(我也很绝望啊。。。。。。。。。。。。。)
    这是改进后的程序:
     1#include<iostream>
     2 #include<cmath>
     3 
     4 using namespace std;
     5 
     6 int isPrime(int n)
     7 {
     8     if (n < 2)
     9         return 0;
    10     else
    11     {
    12         for (int i = 2; i <= sqrt(n); i++)
    13         {
    14             if (n%i == 0)
    15                 return 0;
    16         }
    17         return 1;
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     int M, N;
    24
    25     while (cin>>N)
    26     {
    27         for (int i = 0; i < N; i++)
    28         {
    29             int A, B;
    30             cin >> M;
    31 
    32             for (int i = 1; i < 1000000; i++)
    33             {
    34                 if (isPrime(M))
    35                 {
    36                     cout << M << " " << 0 << endl;
    37                     break;
    38                 }
    39                 A = M - i;
    40                 if (isPrime(A))
    41                 {
    42                     cout << A << " " << i << endl;
    43                     break;
    44                 }
    45                 B = M + i;
    46                 if (isPrime(B))
    47                 {
    48                     cout << B << " " << i << endl;
    49                     break;
    50                 }
    51             }
    52         }
    53     }
    54     return 0;
    55 }
    
    

    时间稍微缩短一些,勉强通过测试。。。。。。。。。。。

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    这个是待解决的程序:(我想缩短更多的时间)

    #include<iostream>
    #include<cmath>
    
    using namespace std;
    
    int isPrime(int n)
    {
        if (n < 2)
            return 0;
        else
        {
            for (int i = 2; i <= sqrt(n); i++)
            {
                if (n%i == 0)
                    return 0;
            }
            return 1;
        }
    }
    
    int main()
    {
        int M, N;
        cin >> N;
        while (N--)
        {
                cin >> M;
                int dis = 0;
                for(int i=1;i<1000000;i++)
                {
                    if ( isPrime(M - dis))
                    {
                        cout << M - dis << " " << dis << endl;
                        break;
                    }
                    else if (isPrime(M + dis))
                    {
                        cout << M - dis << " " << dis << endl;
                        break;
                    }
                    dis++;
                }
            }
        return 0;
    }
    
    

    这个程序的运行测试的几组都不行,比如1,10.。。。。。

     
  • 相关阅读:
    elasticsearch数据迁移
    Leetcode <剑指 Offer 64. 求1+2+…+n>
    Leetcode <27.移除元素>
    Leetcode <7.整数反转>
    Leetcode <1. 两数之和>
    python实现对于告警规则的判断思路
    Python实现密码生成器
    Autojs 打包APP+签名
    Docker 文档整理
    Pycharm 连接Linux远程开发
  • 原文地址:https://www.cnblogs.com/Dark-King/p/8011897.html
Copyright © 2011-2022 走看看