个人思路仅供参考,如有不足欢迎交流。
【问题描述】
给定一个可以带通配符问号的正整数W,问号可以代表任意一个一位数字。再给定一个正整数X,和W具有同样的长度。问有多少个整数符合W的形式并且比X大?
【输入形式】
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同,在[1…10]之间。
【输出形式】
每行一个整数表示结果。
【样例输入】
36?1?8
236428
8?3
910
?
5
【样例输出】
100
0
4
【提交代码】
(10/10分,C++)
//42.带通配符的数
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
string w, x;
int len, num_wc; //数的长度,通配符Wildcards数量
int res; //结果
while (cin >> w >> x)
{
res = 0;
len = w.length();
num_wc = 0;
for (int i = 0; i < len;i++)
{
if (w[i] == '?')
{
num_wc += 1;//记下通配符数量
}
}
for (int i = 0; i < len;i++)
{
if (w[i] != '?')//当前字符不是通配符
{
if (w[i] > x[i])//w当前位数字>x当前位数字,当前位置之后的所有通配符取任意值都符合条件
{
res += pow(10, num_wc);//结果+10的num_wc次方
break;//结束循环
}
else if (w[i] < x[i])//w当前位数字<x当前位数字,当前位置之后的通配符所有取值都不符合条件
{
break;//直接结束循环
}
}
else//当前字符是通配符
{
num_wc -= 1;//通配符数量-1
res += (9 - (x[i] - '0')) * pow(10, num_wc);
//假设x[i]对应数字s,结果+(9-s)*10^num_wc,此时num_wc已经是当前位置之后通配符的数量
}
}
cout << res << endl;
}
return 0;
}