| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1320 人关注过本帖
标题:素数怎么出错?后添加了ACM题目
只看楼主 加入收藏
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
一直是compile error
2013-05-13 16:10
努力的学习
Rank: 2
等 级:论坛游民
帖 子:26
专家分:48
注 册:2013-3-28
收藏
得分:0 
你写的prime(int n)函数里的i值貌似没有初始值,而且拿它直接与形参n进行了(i%n)的运算,没有理由啊。。所以i在这个函数中没有任何作用。5楼的可以通过编译运行处结果。。
2013-05-13 16:35
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
额....看来你还比较新手...这是ACM
2013-05-13 16:57
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:20 
程序代码:
分2段找,从n往前找到最接近的素数,从后找到最接近的素数,注意1不是素数的情况,还要注意n本身是不是素数
代码如下:测试了2次都AC了
#include<stdio.h>
#include<math.h>
int main() {
    int i, j, k, m, n, a, b, d, t;
    scanf("%d", &m);
    while(m--) {
        scanf("%d", &n);
        if(n == 1) printf("2 1\n");
        else {
            for(i = n - 1; i >= 2; i--) {
                t = 1;
                for(j = 2; j <= sqrt(i); j++) {
                    if(i % j == 0) {
                        t = 0;
                        break;
                    }
                }
                if(t)break;
            }
            a = i;
            for(i = n + 1; i; i++) {
                t = 1;
                for(j = 2; j <= sqrt(i); j++) {
                    if(i % j == 0) {
                        t = 0;
                        break;
                    }
                }
                if(t) break;
            }
            b = i; t = 1;
            k = (n - a) <= (b - n) ? a : b;
            d = (n - a) <= (b - n) ? (n - a) : (b - n);
            for(i = 2; i <= sqrt(n); i++)
                if(n % i == 0) {
                    t = 0;
                    break;
                }
            printf("%d %d\n", t > 0 ? n : k, t > 0 ? 0 : d);
        }
    }
    return 0;
}

仰望星空...........不忘初心!
2013-05-13 17:36
ddtet
Rank: 4
等 级:业余侠客
帖 子:32
专家分:211
注 册:2013-5-4
收藏
得分:0 
我的代码,测几了几次可以运作,不过有没有 AC 就不清楚了......
程序代码:
#include <stdio.h>
#include <math.h>

int larger_prime(int num)
{
   int i, j;
   i = num + 1;
   
   while(i<num*2) {
      for(j=2; j<i; j++) {
         if(i%j==0)
            break;
      }
      if(j==i)
         return i;
      i++;
   }
   return i;
}

int smaller_prime(int num)
{
   int i, j;
   for(i=num; i>1; i--) {
      for(j=2; j<i; j++) {
         if(i%j==0)
            break;
      }
      if(j==i)
         return i;
   }
}

void output_prime(int num) {
   int smaller, larger;
   if(num < 2) {
      printf("illagal num:%d\n", num);
      return ;
   }

   smaller = smaller_prime(num);   
   if(smaller == num) {
      printf("%d %d\n", num, 0);
   } else {
      larger = larger_prime(num);
      if(larger-num < num-smaller)
         printf("%d %d\n", larger, larger-num);
      else
         printf("%d %d\n", smaller, num-smaller);
   }
}

int main()
{
   int count;
   printf("Please input the count of numbers:");
   scanf("%d", &count);
   int num[count];
   
   int i;
   for(i=0; i<count; i++) {
      printf("Please input the No.%d number(>1):", i+1);
      scanf("%d", &num[i]);
   }
   
   printf("Output...\n");
   
   for(i=0; i<count; i++)
      output_prime(num[i]);
   printf("\n");
   return 0;
}
2013-05-13 18:08
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
回复 15楼 ddtet
呵呵...ACM的题目是不能出现友好提示的信息!

仰望星空...........不忘初心!
2013-05-13 18:13
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
#include <math.h>
#include <stdio.h>

#define ALL 78499

void Init(int ss[])
{
    int i, j, k = 8, temp;
    for (i = 23;k != ALL;i += 2)
    {
        temp = (int)sqrt(i);
        for (j = 0;ss[j] <= temp;++j)
        {
            if (i % ss[j])    continue;
            break;
        }
        if (ss[j] <= temp)    continue;
        ss[k++] = i;
    }
}

int find(int s[], int key, int beg, int end)
{
    int ip = (beg + end) / 2;

    if (s[ip] == key)    return ip;
    if (ip == beg)
        return (s[ip]+s[ip+1]-key-key) < 0 ? ip+1 : ip;
    if (s[ip] > key)    return find(s, key, beg, ip);
    else                return find(s, key, ip, end);
}

int main()
{
    int tmp, ip, m, n, s[ALL] = {2, 3, 5, 7, 11, 13, 17, 19};
    Init(s);

    scanf("%d", &m);
    while (m--)
    {
        scanf("%d", &n);
        ip = find(s, n, 0, ALL-1);
        if ((tmp = n - s[ip]) < 0)    tmp = -tmp;
        printf("%d %d\n", s[ip], tmp);
    }
    return 0;
}


[fly]存在即是合理[/fly]
2013-05-13 20:12
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
有个abs函数不识别,有点疑惑


[fly]存在即是合理[/fly]
2013-05-13 20:13
神奈创
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:67
专家分:191
注 册:2013-3-31
收藏
得分:0 
楼主你的代码就算可以输出正确答案,想必也AC不了的,效率太低了,假如我要求100000跟100001 ,100002这几个数的话,你是不是要每次都重复int prime(int n)这个函数啊,时间肯定超时啊
2013-05-13 21:03
神奈创
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:67
专家分:191
注 册:2013-3-31
收藏
得分:0 
最好的方法是将0~1000000直接的素数放到一个数组中,然后用m来跟数组里面的内容比较,找到符合要求的素数跟距离
2013-05-13 21:40
快速回复:素数怎么出错?后添加了ACM题目
数据加载中...
 
   



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

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