首页 > 其他分享 >1B:

1B:

时间:2023-01-15 23:11:19浏览次数:53  
标签:case return int 31 month 1B day

链接:https://ac.nowcoder.com/acm/contest/19859/B
来源:牛客网

题目描述

ElemenT马上就要毕业了,他打开日历看了看时间。发现日历上的日期都是2017-04-04这样的格式的,月和日如果不足2位数,前面都会补充0。 给定一个年份和月份,ElemenT把那个月的日期都按上述格式写到纸上,他现在想知道某种数字出现了多少次。

输入描述:

多组输入
每组输入一行,有3个数字y,m,x(1000<=y<=3000,1<=m<=12,0<=x<=9),分别代表年份,月份,和他想知道哪个数字出现的次数。

输出描述:

每组输出一个整数,表示数字x在这个月的日期里出现了多少次。
示例1

输入

复制
2017 4 4
2000 1 0

输出

复制
33
136

说明

第一组样例中,日中有数字4的为2017-04-04,2017-04-14,2017-04-24,4月一共有30天,因为月份中有4,所以数字4一共出现了30 + 3 = 33次   

 

初试
 #include<bits/stdc++.h>
using namespace std;

int FigN(int pre,int N){

int a,ans=0;

while(pre){

    if( pre%10==N)
    {ans++;}
    pre=pre/10;


}
return ans;
}

int fig_day(int year,int month){
    switch(month){
        case 1: return 31;
        case 3: return 31;
        case 4: return 30;
        case 5: return 31;
        case 6: return 30;
        case 7: return 31;
        case 8: return 31;
        case 9: return 30;
        case 10: return 31;
        case 11:return 30;
        case 12: return 31;
        break;
    }
    if(month==2){
        if(year%400!=0||year%4==0&&year%100!=0)
            return 28;
        else return 29;
    }
  
    return 0;
}





int main(){
    int year,month,N;
    int count,day;
    while(scanf("%d %d %d",&year,&month,&N)){
        count=0;
        day=fig_day(year,month);
        count=(FigN(year,N)+FigN(month,N))*day;
        for(int i=1;i<=day;i++){
            count+=FigN(i,N);
        }
        cout<<count<<endl;

    }

    return 0;

}

 

 

 尝试解决2000 1 0输出错误原因:忽视0的特殊性:

再试
 #include<bits/stdc++.h>

using namespace std;


int FigN(int pre,int N){

int a,ans=0;

while(pre){

    if( pre%10==N)
    {ans++;}
    pre=pre/10;


}
return ans;
}

int fig_day(int year,int month){
    switch(month){
        case 1: return 31;
        case 3: return 31;
        case 4: return 30;
        case 5: return 31;
        case 6: return 30;
        case 7: return 31;
        case 8: return 31;
        case 9: return 30;
        case 10: return 31;
        case 11:return 30;
        case 12: return 31;
        break;
    }

    if(month==2){
        if(year%400!=0||year%4==0&&year%100!=0)
            return 28;
        else return 29;


    }

}





int main(){
    int year,month,N;
    int count,day;
    while(scanf("%d %d %d",&year,&month,&N)){
        count=0;
        day=fig_day(year,month);
        count=(FigN(year,N)+FigN(month,N))*day;
        for(int i=1;i<=day;i++){
            count+=FigN(i,N);
        }


        if(N==0){
            if(month<10){
                count+=day+9;
            }
            else{
                count+=9;
            }
        }
        
        cout<<count<<endl;

    }

    return 0;
}

 

问题1:有报错原因在于,忽略了函数figure_day可能出现无法返回的情况导致编译失败。

问题2:再有为什么之前的输出会出现第二次通过scanf输入之后会一直输出第二次输入的结果?

这里牵扯到一个我比较薄弱的知识点,那就是scanf的详细用法和性质(这里欠下一篇文章,专门写C语言的输入输出),在此暂时略去,而且已找到替代方法,是否有解决方法我们将在文章中探寻。

 

终版
 #include<bits/stdc++.h>

using namespace std;


int FigN(int pre,int N){

int a,ans=0;

while(pre){

    if( pre%10==N)
    {ans++;}
    pre=pre/10;


}
return ans;


}

int fig_day(int year,int month){
    switch(month){
        case 1: return 31;
        case 3: return 31;
        case 4: return 30;
        case 5: return 31;
        case 6: return 30;
        case 7: return 31;
        case 8: return 31;
        case 9: return 30;
        case 10: return 31;
        case 11:return 30;
        case 12: return 31;
        break;
    }

    if(month==2){
        if(year%400==0||(year%4==0&&year%100!=0))
            return 29;
        else return 28;


    }

    return 0;
}





int main(){
    int year,month,N;
    int count,day;
    while(cin>>year>>month>>N){
        count=0;
        day=fig_day(year,month);
        count=(FigN(year,N)+FigN(month,N))*day;
        for(int i=1;i<=day;i++){
            count+=FigN(i,N);
        }

        if(N==0){
            if(month<10){
                count+=day+9;
            }
            else{
                count+=9;
            }
        }

        cout<<count<<endl;

    }

    return 0;
}

 

 

总结错误:

代码整体思路没错,但是在之前的版本中将闰年和平年的区别弄反,导致陷入谬误,闰年02月应该是29天而平年02月是28天;

在尝试一些测试案例之后,倘若与自己的人工思路测算结果一致,那么应该是代码和你的思路是一致的,因此还无法通过最终提交则应该是在自己的思路哪一环出现了逻辑上不符合事实的地方或者漏洞。漏洞还好一些,对测试集是敏感的,但是前者更加难以检查,一般情况下可以通过参考别人代码思路快速检查。

参考:https://blog.csdn.net/qq_43811879/article/details/104202117

 

 

 

标签:case,return,int,31,month,1B,day
From: https://www.cnblogs.com/walter-mitty/p/17054438.html

相关文章

  • CF 1581B Diameter of Graph 题解
    题面:给定n个顶点,m条边,任意两点并且最大距离小于k,两个顶点只能连一条边,询问是否能构造出这样的图型思路:1.n=1时进行特判,只有k>1时成立2.m=n(n-1)/2时,是完全图,只有k......
  • 解决pipline找不到docker命令:/Users/beck/.jenkins/workspace/locust_test@tmp/durabl
    问题一:/Users/beck/.jenkins/workspace/locust_test@tmp/durable-884e1b18/script.sh:line1:docker:commandnotfound完整的pipeline如下,在dockerhub上我打包了locu......
  • 将1bpp的bmp图像存储为1bpp或者2bpp的tiff格式
    //将1bpp的位图转换为1bit/2bittiff/**参数:BYTE*src二值图像的像素数据,不包含头部信息,1bpp,intsrc_width原图的宽度,inpixles,intsrc_height原图的高......
  • CF1361B
    [[greedy]]link:JohnnyandGrandmaster题面给定\(n,p\)和\(n\)个整数形如\(p^{k_i}\),要求将这\(n\)个数分为两个集合,最小化两个集合的各自的和的差的绝对值,答......
  • [3B1B] 微积分的本质
    一、微积分入门首先从计算半径为\(r\)的面积开始。我们默认知道半径为\(r\)的圆的周长为\(2\pir\)。我们可以将这个圆形分成若干宽度为\(\text{d}r\)的环形。......
  • 直观数学-3blue1brown动画的制作
    相信很多人都知道3Blue1Brown,这是一个由斯坦福大学的数学系学生GrantSanderson 创建的YouTube 频道。该频道从独特的视觉角度解说高等数学,内容包括线性代数、微积分、神......
  • 局域网无法连接打印机报错0x000011b解决办法
    局域网无法连接打印机报错0x000011b解决方法网上大部分都是说把KB50055XX的更新卸载掉,但是对于我来说好像没什么用(因为找不到这些更新补丁,所以没法卸载),经过实际操作解决方......
  • 题解 CF1711B
    题解CF1711B这个题说明了,蛋糕的个数只跟好友的对数有关,跟去的人或者是单个的人的个数是无关的(是不是单个的人去没有蛋糕吃)所以我们就要考虑,怎样才能满足吃掉的蛋糕正好......
  • 路由器模式“11b only”是什么意思
    路由器模式“11bonly”是什么意思“路由器11b后面带“only”的就是只使用这一种速率;对比来说还一种带“MIXED”的是向下兼容的混合模式(兼容11g和11n)。” 更多>......
  • win10 WSL2问题解决WslRegisterDistribution failed with error: 0x800701bc
    在win102004系统中,WSL1安装Mongodb永远无法启动,于是按照网上的教程,升级到了WSL2。在升级了WSL2以后重新安装Ubuntu20.04时遇到问题,安装完成后无法正常启动,报错信息如下:......