functon1(判断日期是否有效)
bool right()
{
int year = 1000 * (s[0] - '0') + 100 * (s[1] - '0') + 10 * (s[2] - '0') + (s[3] - '0');
int month = 10 * (s[4] - '0') + (s[5] - '0');
int day = 10 * (s[6] - '0') + (s[7] - '0');
if (year < 1 || year > 9999)
return false; // 年份不在合法范围内
if (month < 1 || month > 12)
return false; // 月份无效
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (month == 2)
{
if (isLeapYear && day > 29)
return false;
if (!isLeapYear && day > 28)
return false;
}
else if (month == 4 || month == 6 || month == 9 || month == 11)
{
if (day > 30)
return false;
}
else if (day > 31)
{
return false;
}
return true;
}
判断一个数是否为质数
bool isprime(int n)
{
if (n <= 1)
return false; // 1 及以下的数不是质数
if (n <= 3)
return true; // 2 和 3 是质数
if (n % 2 == 0 || n % 3 == 0)
return false; // 2 和 3 的倍数不是质数
for (int i = 5; i * i <= n; i += 6)
{
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
主体函数(col是即将要访问的下标,从7开始到0访问完成,-1退出)
{
if (col == -1)
{
int dayNum = day();
int monthNum = month();
int yearNum = year();
if (isprime(dayNum) && isprime(monthNum) && isprime(yearNum) && right())
ans++;
return;
}
if (s[col] == '-')
{
for (int i = 0; i <= 9; i++)
{
s[col] = i + '0';
solve(col - 1);
}
s[col] = '-';
}
else
{
solve(col - 1);
}
}
注意上面的代码没有剪枝,所以能拿到70分,剩下的剪枝部分由读者个人完成