题目详情
给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间.
输出格式
每行一个整数表示结果。
答题说明
输入样例
36?1?8
236428
8?3
910
?
5
输出样例
100
0
4
思路
主要是用了归纳法,归纳几种情况
1.起始是通配符?
2.起始数字较大
3.起始数字较小
4.起始部分两个数相等的,这个情况看做第1种的特例
#include<stdio.h>
#include<string.h>
char s1[11],s2[11];
long long pow(int sum)
{
int i;
long long res=1;
if(sum<0)
return res;
for(i=0;i<sum;i++)
res*=10;
return res;
}
int pan(int begin,int end)
{
int i=begin;
for(;i<end;i++)
{
if(s1[i]>s2[i])
return 2;
else if(s1[i]<s2[i])
return 0;
}
return 1;
}
long long Count(char *s1,char *s2)
{
int len1,i,j,tmp,l;
int sum=0,sum1=0;
long long count=0,count1=1;
len1=strlen(s1);
j=0;
while(s1[j]!='\0')
{
if(s1[j]=='?')
sum++;
j++;
}
i=0; sum1=sum;
j=0; l=0;
while(s1[i]!='\0')
{
if(s1[i]=='?')
{
tmp=9-s2[i]+48;
// tmp=(tmp==0? 1:tmp);
count1*=tmp;
count1*=pow(sum-1);
sum--;
count+=count1;
count1=1;
}
else
{
l=i;j=l;
// tmp=9-s2[i]+48;
while(s1[l]!='?')
{
if(s1[l]=='\0')
break;
l++;
}
if(pan(j,l)==2)
return count+pow(sum);
else if(pan(j,l)==0&&sum>0)
return count;
else if(pan(j,l)==2)
return (tmp==0? 1:tmp);
else
i=l-1;
}
i++;
}
return count;
}
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
printf("%lld\n",Count(s1,s2));
}
return 0;
}