CSDN英雄会第四届在线编程大赛·线上初赛:带通配符的数

英雄会第四届在线编程大赛·线上初赛:带通配符的数
给定一个带通配符问号的数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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值