1 条题解

  • 0
    @ 2025-5-27 17:32:42

    题目大意:2019年5月23日是个“全素日”,即不仅20190523本身是个素数,它的任何以末尾数字3结尾的子串都是素数。本题就请你写个程序判断一个给定日期是否是“全素日”。输入按照yyyymmdd的格式给出一个日期。题目保证日期在0001年1月1日到9999年12月31日之间。从原始日期开始,按照子串长度递减的顺序,每行首先输出一个子串和一个空格,然后输出Yes,如果该子串对应的数字是一个素数,否则输出No。如果这个日期是一个全素日,则在最后一行输出All Prime!。

    分析:使用num储存合数的个数,如果最后num为0,则表示要输出”All Prime!”。使用string s存储输入的数字。可以使用while循环,每次查询当前数值是不是素数,然后使用erase()函数删除第一个数字,如此循环到s长度为0。可以直接使用函数stoi(),将string转化成int类型。每次我们判断当前的数是不是素数,并直接输出。

    # include <iostream>
    # include <cstring>
    # include <algorithm>
    using namespace std;
    # include <string>
    # include <list>
    # include <vector>
    int n,m,k;
    int nowans[10];
    int s[10];
    bool used[100];
    int resnum=-1;
    list<string> res;
    int findnext()
    {
        for(int i=m;i<=m+n*(n-1)+1;i++)
          if(!used[i])
            return i;
        return -1;
    }
    int findmin(int pos)
    {
        for(int i=0;i<n;i++)
          if(s[i]==pos)
            return i;
        return -1;
    }
    void search1(int pos,int last)
    {
        if(pos==-1)
        {
           int maxnum=findnext()-1;
           if(maxnum>=resnum)
           {
              char tmp[10];
              for(int i=0;i<n;i++)
                tmp[i]=nowans[i];
              tmp[n]='\0';
              if(maxnum>resnum)
              {
                 resnum=maxnum;
                 res.clear();
              }
              res.push_back(string(tmp));
           }
        }
        else
        {
           int nextneed=findnext();  
           for(int i=last;i<=m+n*(n-1)+1;i++)
           {
              if(i>nextneed) break;
              vector<int> tmp;
              nowans[pos]=i;
              for(int j=0;j<n;j++)
                for(int step=0;step<n;step++)
                {
                  int total=0;
                  for(int l=j;l<=j+step;l++)
                  {
                       if(nowans[l%n]==-1) 
                         {
                            total=-1;
                            break;
                         }
                       else total+=nowans[l%n];   
                  }
                  if(total==-1) break;
                  else
                  {
                      if(!used[total])
                      {
                         used[total]=1;
                         tmp.push_back(total);
                        
                      }
                  }
                }
               search1(findmin(s[pos]+1),i);      
               for(int i=0;i<tmp.size();i++)
                  used[tmp[i]]=0;
           }
           nowans[pos]=-1;
           
        }
    }
    int main()
    {
        memset(used,0,sizeof(used));
        cin>>n>>m>>k;
        for(int i=0;i<n;i++)
          s[i]=i,nowans[i]=-1;  
        do
        {     
            search1(findmin(0),k);
        }while(next_permutation(s+1,s+n));
        res.sort();
        res.unique();
        cout<<resnum<<endl;
       for(list<string>::iterator it=res.begin(); it!=res.end();it++)
        {
          for(int j=0;j<(it->length());j++)
            cout<<(int)(it->at(j))<<" ";
          cout<<endl;
        }
      //  system("pause");
        return 0; 
            
    }
    • 1

    信息

    ID
    169
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者