HAPPY DAY-C++
今日は4月22日であり、kamipeipaa君の誕生日です。kamipeipaa君はこの日が4=2+2と表せることに気づきました。
kamipeipaa君はX月Y日についてYの数字和がXと等しいとき、この日を"HAPPY DAY"であると呼ぶことにしました。ここで数字和とは与えられた整数の各桁の数字が表す数の総和です。
例えば、4月4日や10月19日は4=0+4、10=1+9となり、HAPPY DAYですが、12月3日や11月28日は12≠0+3、11≠2+8となりHAPPY DAYではありません。
グレゴリオ暦の2015年においてHAPPY DAYがどれだけあるかkamipeipaa君に教えてあげてください。
ヒント:グレゴリオ暦とは通常のカレンダーのことである。2015年のカレンダーを参照しても良い。
365日それぞれの日が成り立つか確認してカウントしても十分速い。
code:C++
using namespace::std;
int main(){
int m=1,d=0,arr12={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (m==1; m<13; ++m){
for (d=1; d<=9; ++d) {
if (m==d) {
cout << m << "/" << d << endl;
}
}
for (d=0; d<=9; ++d) {
if (m==1+d) {
cout << m << "/1" << d << endl;
}
}
for (d=0; d<=8; ++d) {
if (m==2+d) {
cout << m << "/2" << d << endl;
}
}
}
for (d=1; d<=9; ++d) {
if (m==d) {
cout << m << "/" << d << endl;
}
}
for (d=0; d<=9; ++d) {
if (m==1+d) {
cout << m << "/1" << d << endl;
}
}
for (d=0; d<=9; ++d) {
if (m==2+d) {
cout << m << "/2" << d << endl;
}
}
for (d=0; d<=0; ++d) {
if (m==3+d) {
cout << m << "/3" << d << endl;
}
}
}
else {
for (d=1; d<=9; ++d) {
if (m==d) {
cout << m << "/" << d << endl;
}
}
for (d=0; d<=9; ++d) {
if (m==1+d) {
cout << m << "/1" << d << endl;
}
}
for (d=0; d<=9; ++d) {
if (m==2+d) {
cout << m << "/2" << d << endl;
}
}
for (d=0; d<=1; ++d) {
if (m==3+d) {
cout << m << "/3" << d << endl;
}
}
}
}
return 0;
}
一番最初に書いたコード、間違えていると言われたので改良したのが下のコード
code:C++
using namespace::std;
int main(){
int m=1,d=0,arr12={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int m=1; m<=12; ++m) {
for (int d=1; d<=arrm-1; ++d) { if (m == d/10 + d%10) {
if (d/10!=0) {
cout << m << "/" << d/10 << d%10 << endl;
}
else {
cout << m << "/" << d%10 << endl;
}
}
}
}
return 0;
}
結果として出力されるのは上のコードと同じだが、かなりコンパクトにした。
ただこれでも間違えと言われ悩んだいたら、この問題は日付全てを出せという問題ではなく日付の数を出せというものであることに気が付いた
そこで修正したのが下
code:C++
using namespace::std;
int main(){
int m=1,d=0,c=0,arr12={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int m=1; m<=12; ++m) {
for (int d=1; d<=arrm-1; ++d) { if (m == d/10 + d%10) {
++c;
}
}
}
cout << c << endl;
return 0;
}
cという受け皿を用意して、条件を満たしたらその数字に1ずつ足していくというようにした。
結構簡単に行けると思ったものの、問題のとらえ間違えがあり、かなり時間がかかった。