【问题描述】给定一个可以带通配符问号的正整数W,问号可以代表任意一个一位数字。再给定一个正整数X,和W具有同样的长度。问有多少个整数符合W的形式并且比X大?
【输入形式】多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同,在[1..10]之间。
【输出形式】每行一个整数表示结果。
【样例输入】
36?1?8
236428
8?3
910
?
5
【样例输出】
100
0
4
分析如下:
先用穷举法来分析几种可能情况
1.
36?1?8
236428
如果W第一个通配符之前的数字大于X,则通通配符可以是任意数字,因此W比X大的个数就是10的n次方(通配符个数n)
2.
8?3
910
如果W第一个通配符之前的数字小于x,则W不可能比X大,结果为0
3.
2?
25
如果W第一个通配符之前的数字等于x,这时,只有W的通配符比X相应位置的数字大的情况,才有可能使w比X大,因此通配符前面的数字不起任何作用,
我们可以把它简化为
?
5
此时可以得到结果为4
分析完了第一个通配符我们来分析第二个通配符,这时我们发现,只有第一个通配符前面没有数字或数字和x相等的情况下,我们才需要考虑第二个通配符。
并且情况很相似,只有第一个通配符和x相同位置中的数字相等的情况,我们才需要对第二个通配符进行分析,
否则,跟上面的情况类似,
如果第一个通配符大于x中的数字,则W比X大的个数就是10的n-1次方(通配符个数n)
如果第一个通配符小于x中的数字,则W比X大的个数就是0
以此类推,就可以得出W比X大总个数
char a; char b; //a b之间可以进行大小比较,但是不能加减(原因:ASCLL可以进行比较) |
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
string w, x;
int len, num;
int res;
while (cin >> w >> x)
{
res = 0;
len = w.length();
num = 0;
for (int i = 0; i < len;i++)
{
if (w[i] == '?')
{
num ++;
}
}
for (int i = 0; i < len;i++)
{
if (w[i] != '?')//当前字符不是通配符
{
if (w[i] > x[i])
{
res += pow(10, num);
break;
}
else if (w[i] < x[i])
{
break;
}
}
else
{
num --;
res += (9 - (x[i] - '0')) * pow(10, num);
//假设x[i]==w[i]
}
}
cout << res << endl;
}
return 0;
}