人生我靠演戏 2023-03-08 13:54 采纳率: 91.2%
浏览 19
已结题

各位帮我看看,这两个有什么区别,为什么造成结果不一样


```c
 #include <stdio.h> 
int check(int n);
void check_year(int year);
long long count = 0;
int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int main()
{
     
    int year, month, day;

    for (year = 1900; year <= 9999; year++)
    {
     
        if (check(year))
            count++;
        for (month = 1; month <= 12; month++)
        {
            if (check(month))
                count++;
        }
        for (day = 1; day <= months[month]; day++)
        {
            if (check(day))
                count++;
        }
    }
    printf("总共有%llu个2", count);
    return 0;
}
void check_year(int year)
{
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            months[2] = 29;
        else
            months[2] = 28;
}
int check(int n)
{
    while (n)
    {
        if (n % 10 == 2)
        {
            return 1;
            break;
        }
        n /= 10;
    }
    return 0;
}



//上下两程序明明都是求数字2有多少为什么第一个程序不行,明明逻辑都一样。






#include <iostream>
using namespace std;

int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

bool is_leap(int year)
{
    return year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
}

bool check1(int x)
{
    int year = x / 10000;
    int month = x / 100 % 100;
    int day = x % 100;

    if (month < 1 || month > 12) return false;
    if (month != 2)
    {
        if (day < 1 || day > days[month]) return false;
    }
    else
    {
        if (day < 1 || day > days[month] + is_leap(year)) return false;
    }
    return true;
}

bool check2(int x)
{
    while (x)
    {
        if (x % 10 == 2) return true;
        x /= 10;
    }
    return false;
}

int main()
{
    int ans = 0;
    for (int i = 19000101; i <= 99991231; i++)
        if (check1(i) && check2(i))
            ans++;

    cout << ans << endl;
    return 0;
}
  • 写回答

3条回答 默认 最新

  • CQ.abc 2023-03-08 14:00
    关注

    这两个程序的确都是求数字2有多少个,但是两个程序的实现方式有很大的区别,因此得出的结果不同。

    首先,第一个程序中在遍历每个月份和日期的时候,month 和 day 都是从1开始遍历的,而不是根据实际的年份和月份确定的。因此,这个程序的实现方式是有问题的。
    望采纳🥰🥰🥰
    其次,第一个程序在计算闰年的时候,只修改了全局变量 months 数组中的2月份的天数,但没有在每一年开始时重新计算该年是否为闰年,也没有更新其他月份的天数。因此,在计算日期时会出现错误。

    第二个程序中,check1函数是用来检查日期是否合法的,而check2函数是用来检查数字2是否在日期中出现。它们的实现方式是比较简单直接的,没有明显的问题。

    因此,第二个程序的结果更可靠。如果你想要实现一个类似的程序,可以参考第二个程序的实现方式。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多