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

比赛题目是这样的:

yeah,现场出题,现场coding,现场评奖,现场颁奖。

So,想来现场参加火热决赛直取ipad Air的,请先通过线上初赛题目带通配符的数

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

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

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


输入格式

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

输出格式

每行一个整数表示结果。

答题说明:

输入样例

36?1?8

236428

8?3

910

?

5

输出样例

100

0

4


友情提醒:

1、本题用OJ模式答题,答题时可把下面输入框内预留的函数全部直接去掉,自己另起函数名实现本题功能。

2、因为本系统的OJ模式对于Java 和 C# 的支持有问题,所以本题暂不支持这两种语言挑战。

/

更新:答题页面提交了n次代码也没有反应,换浏览器也没用。

算了,一个小比赛而已,不参加也罢。

/

题目中有说要输入多组数据,每组数据两行。要实现的话可以创建一个链表保存输入的所有数据。但题中没有限定输入数据数量。要不要设定最大输入范围呢?

还是不用链表了先,直接返回一组数据的结果吧。


分析了一下后写出如下代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXLENGTH 10

// 检测问号数量函数
// 返回值:字符串中问号数量
int check(char *string){
	int count = 0;
	for(int i = 0; i < 10; i++){
		if(string[i] == '?'){
			count++;
		}
	}
	return (count);
}
// 确定字符串有效长度
// 返回值:字符串有效长度
int strlength(char *string){
    int root = 0;
    for(int i = 0;;i++){
        if(string[i] == 0){
            break;
        }
        root += 1;
    }
    return root;
}

// 确定问号位置函数
// 参数:字符串地址,字符串长度
// 返回值:输入     输出
//       36?1??   310
int decided(char *string, int charsNum){
    int save = 0;
    for(int i = 0, j = charsNum - 1; i < charsNum; i++, j--){
        if(string[i] == '?'){
            save *= 10;
            save += j;
            
        }
    }
    return save;
}

// 字符串转换为整数,同时将问号变为0

int translate(char *string){
	for(int i = 0; i < MAXLENGTH; i++){
		if(string[i] == '?'){
			string[i] = '0';
		}
	}
	return (atoi(string));
}


// 生成运算数字
// 参数:问号数量,问号位置,基数
int create(int questionMark, int questionMarkSet, int count){
	int qms = questionMarkSet; // 问号位置
	int ct = count; // 基数
	int root = 0;
	for(int i = 0; i < questionMark; i++){
		root += ((int)pow(10, qms % 10) * (ct % 10));
		qms /= 10;
		ct /= 10;
	}
    return root;
}

//测试问题函数
int testfunc(char *W, char *X){
	int questionMark = check(W);// 问号数量
	int questionMarkSet = decided(W, strlength(W)); // 确定问号位置
	int getX = atoi(X);
	int getW = translate(W);
	int checkW = 0; // 存放W-X的值
	for(int i = 1; i <= (int)pow(10, questionMark); i++){
        
		if((create(questionMark, questionMarkSet, i) + getW) > getX){
            checkW += 1;
        }
	};
	return checkW;
}



int main(){
	char W[MAXLENGTH] = "0";
	char X[MAXLENGTH] = "0";
    while(1){
        scanf("%s", W);
        scanf("%s", X);
    printf("%d", testfunc(W, X));
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值