原题
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如:20212021 年 66 月 55 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 162+0+2+1+6+5=16,而 1616 是一个完全平方数,它是 44 的平方。所以 20212021 年 66 月 55 日是一个完全日期。
例如:20212021 年 66 月 2323 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 162+0+2+1+6+2+3=16,是一个完全平方数。所以 20212021 年 66 月 2323 日也是一个完全日期。
请问,从 20012001 年 11 月 11 日到 20212021 年 1212 月 3131 日中,一共有多少个完全日期?
我的代码
#include <stdio.h>
#include <stdlib.h>
int sum(int n)
{
int sum = 0;
while (n != 0)
{
sum += n % 10;
n /= 10;
}
return sum;
}
int yes(int n)
{
int a;
a = sqrt(n);
if (a * a == n)
return 1;
else
return 0;
}
int main(int argc, char* argv[])
{
int a[15] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int year, month, day;
int b,e, f, g, h=0;
for (year = 2001; year <= 2021; year++)
{
if (year % 400 == 0 || year % 4==0 && year % 100 != 0)
a[2] = 29;
else
a[2] = 28;
for (month = 1; month <= 12; month++)
{
for (day = 1; day <=a[month] ;day++)
{
b = sum(year);
e = sum(month);
f = sum(day);
g =b+ e + f;
if (yes(g) == 1)
h++;
}
}
}
printf("%d", h);
return 0;
}
新接触了一种代码表达方式:之前我表示每个月的天数都是用switch语句实现(需要区分闰年),这里我用了一个数组来表示天数,感觉这样挺方便的;