zoukankan      html  css  js  c++  java
  • 奇迹

    题目描述:

    相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》
    我们称一个日期为一个八位数,第1~4位构成年,第5~6位构成月,第7~8位构成日,不足位数用0补足。同时,要求日期所代表的这一天真实存在,且年的范围为1~9999。
    出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。但并不是所有存在这样特点的日期都一定会出现奇迹。
    现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。

    输入

    本题有多组数据。
    第一行一个正整数T,表示数据组数。
    接下来的T行,每行一个八位字符串。其中第i位如果为 -,则表示日期的第i位无法确定,否则表示日期的第i位为字符串中第i位上的数字。

    输出

    对每组数据,一行一个整数,表示答案。

    样例输入

    2
    53-7-3-7
    20190629

    样例输出

    6
    0
    

    提示

    53-7-3-7 的  种可能的日期如下:
    53070307
    53070317
    53170307
    53370307
    53570317
    53770307
    一共10个测试点,记c为八位字符串中 - 的个数。
    对前9个测试点,在第i个测试点中保证c=i-1。
    对100%的数据保证1≤T≤10。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int a[] = {0,3,5,7,11,13,17,19,23,29,31,37};
     5 const int b[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
     6 int c[200],d[607000],k,kk,t,ans;
     7 char s[10];
     8 inline bool prime(int x) {
     9     int k=sqrt(x);
    10     for (int i = 2;i <= k; i++) {
    11         if (x % i == 0) {
    12             return 0;
    13         }
    14     }
    15     return 1;
    16 }
    17 int main() {
    18     for (int i = 1; i <=12; i++) {
    19         for (int j = 1; a[j] <= b[i]; j++) {
    20             if (prime(i * 100 + a[j])){
    21                 c[k++] = i * 100 + a[j];
    22             }
    23         }
    24     }
    25     for (int i = 4; i <= 9999; i +=4) {
    26         if ((i % 100 || !(i%400)) && prime(i * 10000 + 229)) {
    27             d[kk++] = i * 10000 + 229;
    28         }
    29     }
    30     for (int i = 1; i <= 9999; i++) {
    31         for (int j = 0; j < k; j++) {
    32             if (prime(i * 10000 + c[j])) {
    33                 d[kk++] = i * 10000 + c[j];
    34             }
    35         }
    36     }
    37     scanf("%d", &t);
    38     while (t--) {
    39         ans=0;
    40         scanf("%s", s);
    41         for (int i = 0; i < kk; i++) {
    42             int k1 = d[i], f = 1;
    43             for (int j = 7; j>=0; j--) {
    44                 if (s[j] != '-' && s[j] - '0' != k1 % 10) {
    45                     f = 0;
    46                     break;
    47                 }
    48                 k1 = k1 / 10;
    49             }
    50             if (f) {
    51                 ans++;
    52             }
    53         }
    54         printf("%d
    ", ans);
    55     }
    56 }
    View Code
  • 相关阅读:
    实践:VIM深入研究(20135301 && 20135337)
    信息安全系统设计基础第十二周学习总结
    信息安全系统设计基础第五次实验报告 20135201&&20135306&&20135307
    信息安全系统设计基础第四次实验报告 20135201&&20135306&&20135307
    信息安全系统设计基础第三次实验报告 20135201&&20135306&&20135307
    信息安全系统设计基础第二次实验报告 20135201&&20135306&&20135307
    深入理解计算机系统家庭作业汇总 20135301&&20135328
    java 基本理论知识点
    使用DAO模式开发宠物管理系统
    java编程常用的快捷键
  • 原文地址:https://www.cnblogs.com/Accpted/p/11203384.html
Copyright © 2011-2022 走看看