nyoj985带通配符的数

来源:互联网 发布:淘宝网页卖家中心在哪 编辑:程序博客网 时间:2024/04/29 08:44
题目链接:

http://acm.nyist.net/JudgeOnline/problem.php?pid=985
或者:http://115.159.40.116/problem_show.php?pid=5545

描述
给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
再给定一个整数X,和W具有同样的长度。
问有多少个整数符合W的形式并且比X大?
输入
多组测试数据。
每组数据两行。第一行代表W,第二行代表X,它们的长度相同,并且都不超过15。

提供几组测试数据:
?1234?5
1123455
???????????????
100000000000000
1234
1234
答案:
84
899999999999999
0

AC代码:

#include <stdio.h>#include <string.h>#include <math.h>char w[20] = {0}, x[20];long long countFunction(int i) {//注意返回类型 long long ans = 0, flag = 0;//flag -1表示w小于x,1表示大于,0表示未知 for(; w[i] != 0; i++) {  if(w[i] == '?') break;  if(w[i] > x[i]) {   flag = 1;//若在?前wi有大于xi的则w恒大于x   ans = 1;   break;  } else if(w[i] < x[i]) {   flag = -1;//若在?之前wi有小于xi的,则w恒小于x   break;  }  //xi等于wi则继续循环,大小未知,直到遇到?,或字符串到末尾 } int con = 0, j = i+1; if(flag == 0 && w[i] != 0) {//大小未知且w[i]!=0说明i走到了?的位置  ans = '9'-x[i++];//算出此处wi恒大xi的个数  j = i; } if(flag != -1) {//flag=-1恒小时,ans=0,直接输出   for(; w[i] != 0; i++) if(w[i] == '?') con++;  //因为是恒大所以直接统计后面的?个数 ,再ans = ans*pow(10,con); 即可  ans *= ceil(pow(10.0,con)); }//未知其实是?与?前面等于x,?后面未知,故递归求之;?处恒大于x的情况前面已计算在ans中 if(flag == 0 && w[j] != 0) ans += countFunction(j); return ans;}int main() { while(~scanf("%s%s", w, x)) {  printf("%lld\n", countFunction(0));  memset(w,0,sizeof(w)); } return 0;}

0 0
原创粉丝点击