题目链接:
或者: http://115.159.40.116/problem_show.php?pid=5545
描述
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; }