Найдите следующий високосный год в C

У меня проблемы с домашним заданием. Я должен сделать функцию, которая сообщает мне, когда следующий високосный год получает n (или n, если это високосный год).

Я уже занимался последней частью, но у меня проблемы с частью «следующий високосный год». Я полагаю, я должен сделать цикл?

Вот что у меня есть до сих пор

int next_leapyear(int n) 
{

    if(((n%4==0)&&(n%100!=0))||(n%400==0)) return n;

    else
    while(?){
      n++;
     }

     return n;
}

Я только начинаю изучать этот язык, так что если бы вы, ребята, не усложняли его, я был бы вам признателен.


person Tiago Araújo    schedule 14.10.2017    source источник
comment
Спасибо за помощь   -  person Tiago Araújo    schedule 14.10.2017
comment
... и нет необходимости в первом if ... else.   -  person Weather Vane    schedule 14.10.2017
comment
да, в любом случае это имеет смысл, мне просто нужно отрицать первую часть в моем while(), верно? Я не уверен, как это сделать, но я попытаюсь найти ответ, ура   -  person Tiago Araújo    schedule 14.10.2017


Ответы (3)


Увеличивайте n до тех пор, пока ваше условие оператора if не станет истинным, поэтому есть 2 способа, которыми вы можете поместить условие в фигурные скобки, что является прямым.

Во-вторых, запускать цикл бесконечное количество раз и помещать условие прерывания внутри цикла.

while(1){
      n++;
if(((n%4==0)&&(n%100!=0))||(n%400==0)) break;

     }
person Mohit Yadav    schedule 14.10.2017
comment
Я еще не выучил 1 в цикле в классе, но я предполагаю, что его логическое значение истинно, поэтому цикл продолжается до тех пор, пока не будет удовлетворено if? (и, очевидно, break останавливает цикл) В любом случае, это решило мою проблему, большое спасибо! - person Tiago Araújo; 14.10.2017
comment
Да, вы правильно поняли. Продолжай учиться! - person Mohit Yadav; 14.10.2017
comment
Зачем вам делать цикл while с всегда истинным условным выражением, а затем иметь оператор if, чтобы выйти из него, когда вы можете просто использовать этот оператор if в качестве условного оператора? - person Christian Gibbons; 14.10.2017
comment
Для расчета следующего високосного года (если текущий не високосный) мы должны достичь этого года для выполнения условия if, каждый раз увеличивая n на 1. - person Mohit Yadav; 14.10.2017
comment
ваш отступ не годится, и нам на самом деле не нужно каждый раз увеличивать n на 1, чтобы достичь следующего високосного года - person phuclv; 15.10.2017

Задание можно разделить на две части. Во-первых, можно проверить, является ли данный n високосным годом, что можно сделать с помощью следующей функции.

int IsLeapYear(int n)
{
    return (((n%4==0)&&(n%100!=0))||(n%400==0));
}

Затем можно использовать цикл, основанный на приведенной выше функции, для увеличения n, пока год не станет високосным. Это можно сделать следующим образом.

int GetNextLeapYear(int n)
{
    int CurrentYear = n;
    while(!IsLeapYear(CurrentYear))
    {
        CurrentYear++;
    }
    return CurrentYear;
}
person Codor    schedule 14.10.2017
comment
Понятно! Но мое упражнение требовало одной функции для обеих частей. Я многому научился из того, что вы сказали, спасибо - person Tiago Araújo; 14.10.2017
comment
@Tiago Araújo ваше неизвестное упражнение могло запросить одну функцию для обеих частей, но post этого не сделал. Этот ответ описывает четкое решение, это лучший подход к кодированию. - person chux - Reinstate Monica; 14.10.2017

Ваша идея увеличить год, пока он не станет високосным, будет работать, но она не очень эффективна, потому что вам нужно выполнять много операций по модулю, что является очень дорогим.

Фактически, чтобы найти следующий нормальный високосный год, вам просто нужно округлить год до следующего числа, кратного 4< /strong>, что может быть достигнуто с помощью любого из этих

year = (year + 3) & ~0x03;
year = (year | 0x03) + 1;

В случае, если после округления оно кратно 100, просто добавьте 4, чтобы получить правильный год. Так что реализация может быть такой

int next_leapyear(int n)
{
    n = (n + 3) & ~3;
    if (n % 100 == 0) n += 4;
    return n;
}
person phuclv    schedule 14.10.2017
comment
Это должен быть принятый ответ. - person Huy; 06.09.2019