【问题描述】给定一个可以带通配符问号的正整数W,问号可以代表任意一个一位数字。再给定一个正整数X,和W具有同样的长度。问有多少个整数符合W的形式并且比X大?
【输入形式】多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同,在[1..10]之间。
【输出形式】每行一个整数表示结果。
【样例输入】
36?1?8
236428
8?3
910
?
5
【样例输出】
100
0
4
【思路】
递归题目~
把每个问号的位置记录下来,把每个【问号和它前面的数】作为一段处理;
这样子递归的时候,只要每一段都进行判断就可以;
当然,不要忘记处理最后一个问号后面的数字(如果有的话)(作为边界处理)
【AC代码】
#include<iostream>
#include<vector>
#include<string>
#include<stack>
#include<cmath>
#include<algorithm>
#include<set>
#include<cstring>
#include<iomanip>
#include<sstream>
#include<map>
using namespace std;
string s1,s2;
int p[100]; //储存问号位置 (逆序储存)
int dp(int st,int pos,int n){ //每段开始位置, ?位置, 剩余?数
//边界条件(最后一个问号之后还有)
if(n==0){
int flag=0;
for(int i=st;i<s1.size() ;i++){
if(s1[i]!=s2[i]){
flag=1;
if(s1[i]<s2[i]){
return 0;
}else {
return 1;
}
}
}
if(flag==0) return 0;
}
for(int i=st;i<pos;i++){
if(s1[i]>s2[i]){ //问号前有大于的
return pow(10,n);
}
if(s1[i]<s2[i]){ //问号前有小于的
return 0;
}
}
//前面都相等
return (9-(s2[pos]-'0'))*(pow(10,n-1)) + dp(pos+1,p[n-1],n-1);
}
int main(){
while(cin>>s1>>s2){
memset(p,0,sizeof(p));
int n=0;
int num=0;
for(int i=0;i<s1.size() ;i++){
if(s1[i]=='?') {
num++;
}
}
if(num!=0){
n=num;
for(int i=0;i<s1.size();i++){
if(s1[i]=='?') {
p[n]=i;
n--;
}
}
n=num;
int res=dp(0,p[n],n);
cout<<res<<'\n';
}else if(num==0){
int flag=0;
for(int i=0;i<s1.size() ;i++){
if(s1[i]<s2[i]) {
cout<<0<<'\n';
flag=1;
break;
}
if(s1[i]>s2[i]){
cout<<1<<'\n';
flag=1;
break;
}
}
if(flag==0) cout<<0<<'\n'; //如果相等 ,也输出0
}
}
}
【写在后面】
觉得对你有帮助的话记得一键三连哦~(误
相关题目放在了【HNU CJ】专栏
如果有啥问题可以评论留言或者私我哦~