1. 程式人生 > >HDU2012 素數判定【入門】

HDU2012 素數判定【入門】

素數判定

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 156040    Accepted Submission(s): 54969


Problem Description 對於表示式n^2+n+41,當n在(x,y)範圍內取整數值時(包括x,y)(-39<=x<y<=50),判定該表示式的值是否都為素數。
Input 輸入資料有多組,每組佔一行,由兩個整數x,y組成,當x=0,y=0時,表示輸入結束,該行不做處理。
Output 對於每個給定範圍內的取值,如果表示式的值都為素數,則輸出"OK",否則請輸出“Sorry”,每組輸出佔一行。

Sample Input 0 1 0 0
Sample Output OK
Author lcy
Source

問題簡述

:參見上文。

問題分析

判定一個數是否為素數有各種各樣的方法。參見:素性測試演算法。這裡採用比較簡單的試除法來實現,並且將判斷一個數是否為素數的功能封裝到一個函式中。

程式說明

  本程式採用自頂向下逐步細化的程式設計方法,程式讀起來邏輯清晰十分易懂。

題記

  使用帶引數的巨集定義,也是值得推薦的好方法。

AC的C語言程式如下:

/* HDU2012 素數判定 */

#include <stdio.h>
#include <math.h>

#define fun(n) n*n + n + 41

// 試除法判斷一個整數是否為素數
int isnotprime(int n)
{
    if(n % 2 == 0)
        return 1;

    int end = sqrt(n), i;
    for(i=3; i<=end; i+=2) {
        if(n % i == 0)
            break;
    }

    return i > end ? 0 : 1;
}

int main(void)
{
    int x, y, i;

    while(scanf("%d%d", &x, &y) != EOF) {
        // 判定結束條件
        if(x == 0 && y == 0)
            break;

        // 素數判定:對於x和y之間的所以數都進行判定
        for(i=x; i<=y; i++) {
            if(isnotprime(fun(i)))
                break;
        }

        //輸出結果
        if(i > y)
            printf("OK\n");
        else
            printf("Sorry\n");
    }

    return 0;
}