郑州网站分析,北京网站建设公司艺唯思,关键词优化的作用,网站服务器的搭建这道题目本来是不难想思路的。。。。。。
然而我第一次做的时候改了蛮久才把代码完全改对#xff0c;主要感觉还是不够细心#xff0c;敲的时候也没注意见检查一些小错误#xff0c;那么接下来不说废话#xff0c;请看题干#xff1a; 接下来请看输入输出的样例以及数据范…这道题目本来是不难想思路的。。。。。。
然而我第一次做的时候改了蛮久才把代码完全改对主要感觉还是不够细心敲的时候也没注意见检查一些小错误那么接下来不说废话请看题干 接下来请看输入输出的样例以及数据范围 我提供两个方法去做这个题第一个思路是
首先我们分析容易看出输入的日期其实当作两个八位数处理即可然后直接循环从起始日期到截止日期如果是回文日期直接ans即可只是我们需要思考如何来让日期进行正确的进位所以这时候我考虑使用函数来达到目的的功能接下来请看代码
#includebits/stdc.h
using namespace std;
int d1,d2,ans;
int getday(int y,int m){//y年m月有多少天if(m1 || m3 || m5 || m7 || m8 || m10 || m12)return 31;if(m4 || m6 || m9 || m11)return 30;//判断闰年if(( !(y%4) y%100) || !(y%400))return 29;else return 28;
}
int nextday(int x){//x的下一天 表示为八位整数int yx/10000;int mx/100%100;int dx%100;if(d ! getday(y,m))d;else if(m!12){m;d1;}else {y1;m1;d1;}return 10000*y100*md;
}
int rev(int x){int ans0;while(x){ansans*10x%10;x/10;}return ans;
}
int main(){scanf(%d%d,d1,d2);for(int dd1;dd2;dnextday(d)){if(d rev(d)) ans;}printf(%d\n,ans);return 0;
} 看起来很长其实也并不复杂写了几个函数第一个函数是判断对应的月份有多少天第二个是判断循环中的下一天的日期第三个循环判断翻转数字是否与一开始的一样也就是判断回文数然后就是很简单的输入和枚举相信不必进行解释了。
接下来我就在思考很明显一开始的方法还是进行了很多不必要的循环两个回文日期的间隔一般是比较大的所以有很多不必要的循环也就是我考虑如何降低循环的次数同时也能降低时间复杂度接下来请看代码
#includebits/stdc.h
using namespace std;
int d1,d2,ans;
int getday(int y,int m){//y年m月有多少天if(m1 || m3 || m5 || m7 || m8 || m10 || m12)return 31;if(m4 || m6 || m9 || m11)return 30;//判断闰年if(( !(y%4) y%100) || !(y%400))return 29;else return 28;
}
int nextday(int x){//x的下一天 表示为八位整数int yx/10000;int mx/100%100;int dx%100;if(d ! getday(y,m))d;else if(m!12){m;d1;}else {y1;m1;d1;}return 10000*y100*md;
}
int rev(int x){int ans0;while(x){ansans*10x%10;x/10;}return ans;
}
int main(){scanf(%d%d,d1,d2);for(int y1000;y9999;y){int revyrev(y);int mrevy/100;int drevy%100;if(m1 m12 d1 dgetday(y,m)){int xy*10000revy;if(xd1 xd2) ans;}}printf(%d\n,ans);return 0;
}
这个方法就是将年份进行了循环从1000循环到9999年每次循环先判断出是否是回文年份并且这个回文年份是否在输入的起始日期和截止日期之间如果在那么就可以ans这是因为我们可以发现日期是一个八位数字并且由于年份、月份和日子都不可以为0所以我们其实可以把年份看成特殊进位的数字进而只需要循环一万次不到就可以得到结果。