一个简单的数字搜索题。
给定二个数字,A,B. A中有一些数字是?(表示缺失),
问,把A中的? 补上数字,使得 A>B, 问一共有多少种组合。
AB长度还是相等的。
思路:
从最高位遍历,到第k位, 每一步,我们都保证,前面遍历的都有 a[k] >= b[k]
如果a[k] == '?' 那么组合分二种:
1. a[k]取任意比b[k]大的数,每取一个数,后面的?随意填。
2.a[k]取与b[k]相等。再继续下一位。
如果a[k] 有数字。组合分三种:
1.a[k] < b[k] .那下面不用看了。都不符合,直接返回
2.a[k] == b[k]. 继续下一位。
3.a[k] > b[k] .下面也不用看了,随意填。
#include <stdio.h>
#define MAX 11
char a[MAX], b[MAX];
int pos[MAX];
int findResult(int k, int len)
{
if(k == len)
{
return 0;
}
if(a[k] != '?')
{
if(a[k] < b[k])
{
return 0;
}
else if(a[k] == b[k])
{
return findResult(k + 1, len);
}
else
{
int sum = 1;
for(int i = 1; i <=pos[k]; i ++)
{
sum = sum * 10;
}
return sum;
}
}
else
{
int sum = 9 - (b[k] - '0');
for(int i = 1; i <= pos[k]; i ++)
{
sum = sum * 10;
}
sum = sum + findResult(k + 1, len);
return sum;
}
}
int main()
{
while(scanf("%s", a) != EOF)
{
if(a[0] == '#')
break;
scanf("%s", b);
int len = 0;
for(; a[len] != 0; len++);
int sum = 0;
for(int i = len - 1; i >= 0; i --)
{
pos[i] = sum;
if(a[i] == '?')
{
sum ++;
}
}
printf("%d\n", findResult(0, len));
}
return 0;
}