写在前面
乱七八糟的,又是一道7/10的题目。呵呵,暑假放傻了。
【问题描述】
给定一个可以带通配符问号的正整数W,问号可以代表任意一个一位数字。再给定一个正整数X,和W具有同样的长度。问有多少个整数符合W的形式并且比X大?
【输入形式】
多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同,在[1…10]之间。
【输出形式】
每行一个整数表示结果。
【样例输入】
36?1?8
236428
8?3
910
?
5
【样例输出】
100
0
4
题解
思路
- 1.先找出?的个数
- 2.然后比较?前面的数字,这里是直接字符串切割来比较的
- 3.分情况,小于,等于,大于。等于有一个分支的情况
代码
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main(){
string str,strr;
while(cin>>str>>strr){
int left=0,right;//尺取法
int num=0;//记录通配符的个数
int ans=0;//结果
for(int i=0;i<str.length();i++){
if(str[i]=='?') num++;
}
while(str.find("?",left)!=str.npos){
right=str.find("?",left);
string str_temp=str.substr(left,right-left);//取出一个比较块
string strr_temp=strr.substr(left,right-left);//
if(str_temp>strr_temp){
ans+=pow(10,num);
break;
}else if(str_temp==strr_temp){
ans+=('9'-strr[right])*pow(10,num-1);//这一位取大的,后面全可以取
num--;//这一位取相等的,后面重新计算
}else{//小于。game over
break;
}
left=right+1;//尺子平移
}
cout<<ans<<endl;
}
return 0;
}