英雄会第四届在线编程大赛·线上初赛:带通配符的数
给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间.
输出格式
每行一个整数表示结果。
答题说明
输入样例
36?1?8
236428
8?3
910
?
5
输出样例
100
0
4
解题思路:
基本处理是这样的,依次判断输入字符串s1和s2的每个字符的情况。
有以下情况:
1、s1[i] = s2[i],判断下一个字符。
2、s1[i] > s2[i],假设为i+1到len的?个数为qNum,那么总数为10的qNum次。
3、s1[i] < s2[i],返回0。
4、s1[i]为?号,?的取值有两种情况
1)、s1[i]取大于s2[i]的数,方法有假设为i+1到len的?个数为qNum,那么总数allNum为(10 - (int) (s2[start] - '0') - 1) * qNum。
2)、s1[i]取等于s2[i]的数,递归求解。
最后返回1)和2)的和即可。
给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间.
输出格式
每行一个整数表示结果。
答题说明
输入样例
36?1?8
236428
8?3
910
?
5
输出样例
100
0
4
解题思路:
基本处理是这样的,依次判断输入字符串s1和s2的每个字符的情况。
有以下情况:
1、s1[i] = s2[i],判断下一个字符。
2、s1[i] > s2[i],假设为i+1到len的?个数为qNum,那么总数为10的qNum次。
3、s1[i] < s2[i],返回0。
4、s1[i]为?号,?的取值有两种情况
1)、s1[i]取大于s2[i]的数,方法有假设为i+1到len的?个数为qNum,那么总数allNum为(10 - (int) (s2[start] - '0') - 1) * qNum。
2)、s1[i]取等于s2[i]的数,递归求解。
最后返回1)和2)的和即可。
C++ AC
#include <stdio.h>
#include <string>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn = 12;
char s1[maxn];
char s2[maxn];
int array[maxn];
int len;
double getQuestionNum(int start) {
long qNum = 0;
while (start < len) {
if (s1[start] == '?') {
qNum++;
}
start++;
}
return pow((double)10, (double)qNum);
}
double dfs(int start) {
while (start < len && s1[start] == s2[start]) {
start++;
}
if (start == len) {
return 0;
}
// 假设?改为arrayB[start]
if (s1[start] == '?') {
double qNum = getQuestionNum(start+1);
double allNum = (10 - (int) (s2[start] - '0') - 1) * qNum;
double tempNum = dfs(start + 1);
allNum += tempNum;
return allNum;
} else if (s1[start] > s2[start]) {
double qNum = getQuestionNum(start+1);
return qNum;
} else {
return 0;
}
}
double finalGetNum(){
len = strlen(s1);
double num = dfs(0);
return num;
}
int main(){
while(scanf("%s",s1) != EOF){
scanf("%s",s2);
double num = finalGetNum();
printf("%.0lf\n",num);
}
return 0;
}