Как найти високосный год программно в C - PullRequest
7 голосов
/ 10 июля 2010

Я создал программу на C, чтобы определить, является ли введенный год високосным или нет. Но, к сожалению, это не работает хорошо. В нем говорится, что год является високосным, а предыдущий год не является високосным.

#include<stdio.h>
#include<conio.h>
int yearr(int year);
void main(void)
{
    int year;
    printf("Enter a year:");
    scanf("%d",&year);
    if(!yearr(year))
    {
        printf("It is a leap year.");
    }
    else
    {
    printf("It is not a leap year");
    }


getch();
}
int yearr(int year)
{
    if((year%4==0)&&(year/4!=0))
    return 1;
    else
    return 0;
}

После прочтения комментариев я отредактировал кодировку следующим образом:

#include<stdio.h>
#include<conio.h>
int yearr(int year);
void main(void)
{
    int year;
    printf("Enter a year:");
    scanf("%d",&year);
    if(!yearr(year))
    {
        printf("It is a leap year.");
    }
    else
    {
    printf("It is not a leap year");
    }


getch();
}
int yearr(int year)
{
    if((year%4==0)
    {
    if(year%400==0)
    return 1;
    if(year%100==0)
    return 0; 
    }
    else
    return 0;
}

Ответы [ 15 ]

1 голос
/ 10 июля 2010

http://www.wwu.edu/depts/skywise/leapyear.html

Правила високосного года

Каждый год существует високосный год, число которого делится на четыре - за исключением лет, которые делятся на 100 и неделится на 400. Вторая часть правила действует на века.Например;1600 и 2000 годы являются високосными, а 1700, 1800 и 1900 годы - нет.Это означает, что три раза из каждых четырехсот лет существует восемь лет между високосными годами.

0 голосов
/ 07 декабря 2016

Ответ Кевина обеспечивает оптимальный тест 8 операций (с использованием XOR с использованием констант), но если вы ищете что-то более читабельное, попробуйте этот тест 9 операций.

year % 4 == 0 && !((year % 100 == 0) ^ (year % 400 == 0))

Таблица правды для (year % 100 == 0) ^ (year % 400 == 0)

                              (year % 100 == 0) ^ (year % 400 == 0)
100 doesnt divide year     .    F
only 100 divides year      .    T
100 and 400 divides year   .    F

Теперь !(year % 100 == 0) ^ (year % 400 == 0) дает то, что вы хотите.

0 голосов
/ 28 сентября 2016

Рассчитать максимальный / последний день месяца: 1..12, год: 1..3999

maxDays = month == 2 ?
  28 + ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) :
  30 + ((month & 1) ^ (month > 7));
0 голосов
/ 20 февраля 2016

#define is_leap(A) !((A) & 3)

Просто убедитесь, что вы не вводите отрицательный год :) 1004 *

0 голосов
/ 24 мая 2015

Как и другие уже упоминали условие для високосного года не является правильным. Стоит:

int yearr(int year)  
{  
    if(((year%4 == 0) && (year%100 !=0)) || (year%400==0))  
        return 1;    
    else    
        return 0;    
}  

Прочтите здесь Как проверить високосный год в C .

...