20111020

ACM 406 Prime Cuts

先找到1到1000的所有質數,存起來。
再根據input做相對應output。
1記得也要存,雖然他不是質數 -_-

/* ACM 406
 * mythnc
 * 2011/10/20 15:50:21   
 * run time: 0.064
 */
#include <stdio.h>
 
#define MAXARY 200
#define N      1000
#define NOT_P  0
#define PRIME  1
 
int prime(int *);
int maxnumber(int *, int, int);
void output(int *, int, int);
 
int main(void)
{
    int n, c, pnumber, ptotal;
    int ary[MAXARY];
 
    ptotal = prime(ary);
    while (scanf("%d %d", &n, &c) == 2) {
        pnumber = maxnumber(ary, n, ptotal);
        printf("%d %d:", n, c);
        output(ary, pnumber, c);
        printf("\n\n");
    }
    return 0;
}
 
/* prime: find prime from 1 to 1000, save in s
 * return the numbers */
int prime(int *s)
{
    int i, j, count, rec;
 
    count = 0;
    s[count++] = 1;
    s[count++] = 2;
    for (i = 3; i < N + 1; i += 2) {
        rec = PRIME;
        for (j = 3; j * j <= i; j += 2)
            if (i % j == 0) {
                rec = NOT_P;
                break;
            }
        if (rec == PRIME)
            s[count++] = i;
    }
    return count;
}
 
/* maxnumber: return the prime number from 1 to n */
int maxnumber(int *s, int n, int max)
{
    int i;
 
    for (i = 0; s[i] <= n && i < max; i++)
        ;
    return i;
}
 
 
/* output: output result */
void output(int *s, int pnum, int c)
{
    int i, mid;
 
    mid = pnum / 2;
    /* print all */
    if (mid < c)
        for (i = 0; i < pnum; i++)
            printf(" %d", s[i]);
    /* pnum is odd */
    else if (pnum % 2 == 1)
        for (i = mid - c + 1; i < mid + c; i++)
            printf(" %d", s[i]);
    /* pnum is even */
    else
        for (i = mid - c; i < mid + c; i++)
            printf(" %d", s[i]);
}

沒有留言: