带通配符的数

 

给定一个带通配符问号的数W,问号可以代表任意一个一位数字。

再给定一个整数X,和W具有同样的长度。

问有多少个整数符合W的形式并且比X大?

输入格式

多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间.

输出格式

每行一个整数表示结果。

 

答题说明

输入样例

36?1?8

236428

8?3

910

?

5

输出样例

100

0

4

 

思路:

从左往右依次判断各个数字,分别判断数字的情况和通配符的情况。通配符的情况可转换为更小规模的子问题。

此题重点考察分类讨论的能力,可以拿笔出来写下各种情况的分解。

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

const int N=101;
char a[N];
char b[N];

//return greater 
int findge(char* a, char *b)
{
        int r=0;
        int count=0;
        int len=strlen(a);
        for(int i=0;i<len;i++)
        {
                if(a[i]=='?')
                        count++;
        }

        for(int i=0;i<len;i++)
        {
                //?情况下
                if(a[i]=='?')
                {
                        //计算大于的情况,等于情况相当于当前问题的子问题(即计算后面数字大于的情况,在后续的循环中继续计算)
                        count--;
                        r += ('9'-b[i])*pow(10, count);
                }
                else//数字情况下 
                {
                        //大于,剩下的数字都可以随便取
                        if(a[i]>b[i])
                        {
                                return r+pow(10, count);
                        }
                        //小于,后面取什么都不行
                        else if(a[i]<b[i])
                        {
                                return r;
                        }
                        //等于,继续比较后面的数字
                        else if(a[i]==b[i])
                        {
                                continue;
                        }
                }
        }
        return r;
}

int main()
{
        freopen("./num.in", "r", stdin);
        while(scanf("%s %s", a, b)==2)
        {
                printf("%d
", findge(a, b));
        }

    return 0;
}
原文地址:https://www.cnblogs.com/cute/p/3628221.html