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

来源:互联网 发布:tensorflow word2vec 编辑:程序博客网 时间:2024/05/16 15:23

1.题目

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

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

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


输入格式

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

输出格式

每行一个整数表示结果。


输入样例

36?1?8

236428

8?3

910

?

5

输出样例

100

0

4


2.分析

拿到这个题目,如果我们自己直接计算的话,肯定是从前往后比较,那么就用如下几种情况

在比较时这里我们把W中的?位都看成9,如8?9看成899,这样做的便于统一数字比较

1.W和X对应位相等时

W=89,X=80比较第1位;
W=801,X=802比较第1、2位
这时候直接舍弃最前相等的位,从不等的位开始比较
W=89,X=80比较W=9,X=0
W=801,X=802比较W=01,X=02->W=01,X=02比较W=1,X=2

2.W对应位小于X对应位

W=8,X=9;
W=809,X=819
显然这时候W>X的可能性为0

3.W对应位大于X对应位

W=?,X=5
W=8?7?,X=2000
W=7?7?,X=7760
W=??,X=99
这是最复杂的一种情况,分为如下两种情况
(1).当W和X对应位是数字时
这时候W一定比X大,所以可能的情况就是取决于?有多少个
如W=8?7?,X=2000是可能的个数为10*10
(2).当W和X对应位是?时
a)W这个?对应位比X大
如W=7?7?,X=7760第一个问号取值为8、9,这时候继续往后面对比时W一定比X大,故此时变得W和X都是数字时一样,可能的情况取决于往后数的?有多少个
如W=7?7?,X=7760此种情况的个数为2*10(8、9->2,1个?->10)
b)W这个?对应位和X相等
这又转变为W和X对应位相等的情况
如W=7?7?,X=7760在此种情况下即为比较W=777?,X=7760->W=7?,X=60,即此种情况下可能的情况为10

那么W=7?7?,X=7760满足要求的情况为如上两种情况的和20+10=30

3.实现程序

显然这种“待求解问题可以简化为规模更小的问题”的程序用递归最为合适
#include<stdio.h>#include<stdlib.h>#include <string.h>double a(char *W, char *X){    int i, length, wValue, xValue, w_xValue;double result;//注意结果必须保存为double类型//计算输入串长度length = strlen(W);//这里将当前的字符转换成数字,不确定的?转换成9wValue = (W[0] == '?' ? 9 : ((int)W[0] - 48));xValue = ((int)X[0] - 48);//获得当前两个对应位的差w_xValue = wValue - xValue;if (w_xValue < 0){return 0;}else if (w_xValue == 0){return length>1 ? a(W+1, X+1) : 0;//注意length=1时不能向下递归应该返回0}else{result = (W[0] == '?' ? w_xValue : 1);if (length > 1){for (i = 1; i < length; i++){result *= (W[i] == '?' ? 10 : 1);}if (W[0] == '?'){result += a(W+1, X+1);}}return result;}}int main(){    char W[11];    char X[11];    //循环获得输入    while(gets(W) != NULL)    {gets(X);//输出结果printf("%.0f\n", a(W, X));          }        return 0;}

4.程序说明

根据分析写出程序是很显然的,但是要注意几个问题

1.result不能采用int,当极限情况W=??????????,X=1000000000时会产生溢出

2.注意length==1时不能继续往下递归

3.这个CSDN的烦人的测试用例输入把我搞晕了,开始怎么也搞不对,这个CSDN最好还是给个示例吧,我的奖品都是因为它没了,:-(...


原创,转载请注明来自http://blog.csdn.net/wenzhou1219

0 0