题目描述:
带通配符的数: 给定一个带通配符问号的数W,
问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式 多组数据,每组数据两行,第一行是W,
第二行是X,它们长度相同。在[1..10]
之间. 输出格式 每行一个整数表示结果。
带通配符的数: 给定一个带通配符问号的数W,
问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入格式 多组数据,每组数据两行,第一行是W,
第二行是X,它们长度相同。在[1..10]
之间. 输出格式 每行一个整数表示结果。
#include <stdio.h>
int nbig(char* str1, char* str2)
{
int len = strlen(str1);
int result = 0;
int i = 0;
for(i = 0;i < len; i++)
{
if (str1[i] != '?' && str2[i] > str1[i])
{//如果第一个数当前位的数值小于第二数相同位的数值,
//不需要比较剩下
break;
}
if (str1[i] == '?')
{
if (result)
{//result不为0时,第一个数确定比第二个数大,当前位置可以去0到9
result *= 10;
}
else
{//result为0,计算当前位置可以的取值
result = '9'-str2[i];
}
}
else if(str1[i] > str2[i])
{//当前位置数值不是?,如果第一个数已经大于第二个数,不影响结果
result = result ? result:1;
}
}
if (result)
{//如果第一个数大于第二个数,剩下的位数为?的都可以去0到9
while(i++ < len)
{
if (str1[i] == '?')
result *= 10;
}
}
return result;
}
int main()
{
printf("%s\n%s\n%d\n", "36?1?8", "236428 ", nbig("36?1?8", "236428 "));
printf("%s\n%s\n%d\n", "6?1?8", "76428 ", nbig("36?1?8", "236428 "));
printf("%s\n%s\n%d\n", "?", "5 ", nbig("36?1?8", "236428 "));
}