注册 登录
编程论坛 C++教室

素数的问题

非己莫属 发布于 2012-05-29 20:26, 286 次点击
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出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 回复
#2
有容就大2012-05-30 11:47
我写个看看 就当练手了 有不对的地方请大家指正

貌似你想过ACM 你可以改成ACM的输入输出格式。

代码如下:
程序代码:
#include <iostream>
using namespace std;

/////////////////////////////
// construct the class
class number
{
public:
    void set_num();
    int is_prime(unsigned int);
    void prime_len();

private:
    unsigned int  num;
    unsigned int  len;
};

// give the private variable 'num' a value
void number::set_num()
{
    unsigned int a;
    cout << "Please input a unsigned number:" ;
    cin >> a;
    num = a;
}

//  is prime number or not ?
int number::is_prime(unsigned int sub_num)
{
  int flag, i;

  for (i = 2; i < sub_num; i++)
  {
      if (sub_num % i == 0)
          break;
  }
  if (i == sub_num)
  {
      flag = 1;
  }
  else
      flag = 0;

  return flag;
}

// output the shortest position of the prime number
void number::prime_len()
{
    int i = 0;
    int len1, len2;

    for (i = 0; ; i++)
    {
        if (!is_prime(num + i))
           continue;
        else
        {
            len1 = i;
            break;
        }
    }
   
    for (i = 0; ; i++)
    {
        if (!is_prime(num - i))
           continue;
        else
        {
            len2 = i;
            break;
        }
    }

    if (len1 > len2)
        cout << num - len2 << " " << len2 << endl;
    else if (len1 == len2)
        cout << num - len1 << " " << len1 << endl;
    else
        cout << num + len1 << " " << len1 << endl;
}

////////////////////////////////////
// the main entry point
////////////////////////////////////
int main(int argc, char *argv[])
{
    number n;
    int N;
  
    cout << "Please input N:" ;
    cin >> N;

    while (N--)
    {
        n.set_num();
        n.prime_len();
    }

    return 0;
}

1