【问题描述】给定一个可以带通配符问号的正整数W,问号可以代表任意一个一位数字。再给定一个正整数X,和W具有同样的长度。问有多少个整数符合W的形式并且比X大?
【输入形式】多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同,在[1..10]之间。
【输出形式】每行一个整数表示结果。
【样例输入】
36?1?8
236428
8?3
910
?
5
【样例输出】
100
0
4
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
void fun(string a, string b, int& result)
{
int n = a.length();
int flag = a.find('?');
int asum = 0, bsum = 0;
if (flag != 0)
{
string astr(a, 0, flag), bstr(b, 0, flag);
asum = stoi(astr);
bsum = stoi(bstr);
}
int sum = 1;//通配符总数
int temp = flag;
while (temp = a.find('?', temp + 1), temp != -1)
{
sum++;
if (temp == n) break;
}
if (asum < bsum)//必然为0
return;
else if (asum > bsum)//?可随意取值
{
result += pow(10, sum);
return;
}
//asum==bsum 前置位相同
int tmp = 9 - (b[flag] - '0');//当前通配符大于b[flag]的数
result += tmp * pow(10, sum - 1);//之后的sum-1个?可随意取值
if (flag != n - 1)//当前通配符不在最后
{
string aa(a, flag + 1);
string bb(b, flag + 1);
if (sum != 1)//未到达最后一个通配符
fun(aa, bb, result);//当前通配符取与b对应位相同的数,之后的还需判断
else//到达最后一个通配符时,判断是否能取?=b[flag]
{
int A = stoi(aa), B = stoi(bb);
if (A > B)
result++;
}
}
}
int main()
{
string a, b;
while (cin >> a >> b)
{
int result = 0;
fun(a, b,result);
cout << result << endl;
}
return 0;
}