zoj3326 An Awful Problem

題目大意:求規定時間範圍內,月和日(例如:2月3號)都爲素數的日期一共有多少, 考慮邊界。
這就一模擬,考慮的細一點應該就可以。 只要一出大意了就會無限wrong!! 也沒什麼算法,直接上代碼吧.

#include<iostream>
#include<cstdio>
using namespace std;

int isprime(int x)
{
    if(x < 2) return 0;
    for(int i = 2; i <= sqrt(x); i++)
        if(x % i == 0)
        return 0;
    return 1;
}
int main()
{
    int t, a[40], m[20];
    memset(a, 0, sizeof(a));
    memset(m, 0, sizeof(m));
    //這個a[i]存儲的是1到i天中,  共有幾個天時素數。
    for(int i = 1; i <= 31; i++)
    {
        if(isprime(i) == 1)
            a[i] = a[i-1] + 1;
        else
            a[i] = a[i-1];
    }
    //m[i]存儲的是:前i個月(包含i月)非閏年時, 共有多少個日期是月、號都爲素數。
    for(int i = 1; i <= 12; i++)
    {
        if(i == 3 || i == 5 || i == 7)
            m[i] = m[i-1] + 11;
        else if(i == 11)
            m[i] = m[i-1] + 10;
        else if(i == 2)
            m[i] = m[i-1] + 9;
        else
            m[i] = m[i-1];
    }
    cin >> t;
    while(t--)
    {
        int y1, m1, d1, y2, m2, d2;
        cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
        int sum = 0;
        for(int i = y1; i < y2; i++)//此處把y1到y2-1年所有符合的日期計算出來
        {
            sum += m[12];
            if(i % 400 == 0 || (i % 4 == 0 && i % 100 != 0))
                sum += 1;
        }
        //下面這部分是減去y1年多算的
        sum = sum - m[m1-1];
        if(y1 % 400 == 0 || (y1 % 4 == 0 && y1 % 100 != 0))
        {
            if(m1 > 2)
                sum--;
        }
        if(isprime(m1))
            sum = sum - a[d1-1];
        //下面這部分是加上y2年沒算的
        sum = sum + m[m2-1];
        if(y2 % 400 == 0 || (y2 % 4 == 0 && y2 % 100 != 0))
        {
            if(m2 > 2)
                sum++;
        }
        if(isprime(m2))
            sum = sum + a[d2];
        printf("%d\n", sum);
    }
    return 0;
}
發佈了32 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章