给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间.
输出格式
每行一个整数表示结果。
答题说明
输入样例
36?1?8
236428
8?3
910
?
5
输出样例
100
0
4
思路:
从左往右依次判断各个数字,分别判断数字的情况和通配符的情况。通配符的情况可转换为更小规模的子问题。
此题重点考察分类讨论的能力,可以拿笔出来写下各种情况的分解。
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> #include<cmath> using namespace std; const int N=101; char a[N]; char b[N]; //return greater int findge(char* a, char *b) { int r=0; int count=0; int len=strlen(a); for(int i=0;i<len;i++) { if(a[i]=='?') count++; } for(int i=0;i<len;i++) { //?情况下 if(a[i]=='?') { //计算大于的情况,等于情况相当于当前问题的子问题(即计算后面数字大于的情况,在后续的循环中继续计算) count--; r += ('9'-b[i])*pow(10, count); } else//数字情况下 { //大于,剩下的数字都可以随便取 if(a[i]>b[i]) { return r+pow(10, count); } //小于,后面取什么都不行 else if(a[i]<b[i]) { return r; } //等于,继续比较后面的数字 else if(a[i]==b[i]) { continue; } } } return r; } int main() { freopen("./num.in", "r", stdin); while(scanf("%s %s", a, b)==2) { printf("%d ", findge(a, b)); } return 0; }