题目地址:https://nanti.jisuanke.com/t/T1495
思路:借用列表list,将一位数情况替换成输入的n位数情况下的所有数,注意递推过程
AC代码:
#include <iostream>
using namespace std;
#include <list>
list<int> li;
list<int>::iterator iter;//注意迭代器的定义
int main(){
int n,p;
cin>>n>>p;
int tmp,cnt=0;//cnt记录列表中数的个数
for(int i=1;i<=p;i++)//给列表初始化
li.push_back(i);
for(int i=1;i<n;i++){//从n=1开始扩展到n
cnt=li.size();
iter=li.begin();//从第一个数开始
while(cnt!=0){
tmp=(*iter)*10;
iter++;//取完数后,指针指向下一个待处理的数
li.pop_front();//删除已经记录在tmp的列表在第一个数
cnt--;
for(int j=1;j<=p;j++)//循环添加新的数进去
li.push_back(tmp+j);
}
}
//输出列表中的数
for(iter=li.begin();iter!=li.end();iter++)
cout<<*iter<<endl;
return 0;
}
相同的方法也可以用于解这道题 [蓝桥杯][算法提高VIP]特殊的质数肋骨
AC代码:
#include <iostream>
using namespace std;
#include <list>
list<int> li;
list<int>::iterator iter;//注意迭代器的定义
bool Is(int n){//判断素数
if(n<=3) return n>1;//注意这条,容易误判某些数
for(int i=2;i*i<=n;i++)
if(n%i==0) return false;
return true;
}
int main(){
int n;
cin>>n;
int tmp,cnt=0;//cnt记录列表中数的个数
li.push_back(2);
li.push_back(3);
li.push_back(5);
li.push_back(7);
for(int i=1;i<n;i++){//从n=1开始扩展到n
cnt=li.size();
iter=li.begin();//从第一个数开始
while(cnt!=0){
tmp=(*iter)*10;
iter++;//取完数后,指针指向下一个待处理的数
li.pop_front();//删除已经记录在tmp的列表在第一个数
cnt--;
if(Is(tmp+1))
li.push_back(tmp+1);
if(Is(tmp+3))
li.push_back(tmp+3);
if(Is(tmp+7))
li.push_back(tmp+7);
if(Is(tmp+9))
li.push_back(tmp+9);
}
}
//输出列表中的数
for(iter=li.begin();iter!=li.end();iter++)
cout<<*iter<<endl;
return 0;
}