1 条题解
-
0
题目大意: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
- 上传者