数字检测
题目ID:20317 必做题 100分
时间限制: 1000ms
空间限制: 524288kB
题目描述
作为一个学渣的鱼大大在学习了进制数之后,经常会写错进制数,导致他在做题的时候经常出现,写到了最后发现数字是错的情况,非常浪费时间。所以他迫切地想要一位大聪明随时随刻能帮他检测一下他写的n进制数到底是不是对的。现在鱼大大给出了一个n进制的数m,问此进制数是否合法。
注:大于10进制的数,超过9的数字分别用大写字母A ~ Z
表示
输入格式
第一行两个整数,分别表示n进制和n进制下的数m;
保证输入数据只包含数字和字母。
输出格式
如果合法,输出将其转成十进制后的数字。
如果不合法,将不合法的那个数字以及位置输出(若有多个不合法的数字分成多行输出)
样例
Input 1
16 129AFGH
Output 1
6 G
7 H
Input 2
8 127
Output 2
87
样例解释
【样例1说明】
16进制数的基本数字为0123456789ABCDEF;
不可能出现第6位的G和第7位的H,所以这两数字不合法。
【样例2说明】
8进制数的基本数字为01234567,127中的3个数字均合法,将其转成10进制后为87
数据范围
2≤n≤35
保证合法的mm转成十进制后不超过
好了,思路
1,打表判断i(下标)进制的最小的不符合值值
想这样
string s="0123456……(此处省略)YZ";
2.智能判断
首先需要一个char maxn(一定是char,进制数存的是字符串)
0~9:
maxn=n-1+'0';
后面看我代码吧。。。
好了
接下来就是代码了
智能版:
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize(1)
#include<iostream>
using namespace std;
int main(){
string s;
int n,x;
cin>>n>>s;
x=10;//进制默认为10
int t=1;
int sum=0;
char maxn;
if(n>=10){
maxn='A'+n-11;//m进制最大值=m-1,所以maxn='A'+n-10-1
}
else maxn=n-1+'0';//m进制最大值=m-1
bool p=0;//违规记录
for(int i=s.size()-1;i>=0;i--){
if(s[i]>='0'&&s[i]<='9'){
sum+=(s[i]-'0')*t;
}
else{
sum+=(s[i]-'A'+10)*t;//记下来
}
t*=n;
}
//cout<<sum;
for(int i=0;i<s.size();i++){
if(s[i]>maxn){//大于maxn力
cout<<i+1<<' '<<s[i]<<'\n';//下标从0开始,所以i+1
p=1;//违规力()
continue;
}
}
if(p==1){
return 0;//违规了直接停止
}
string a;//十进制
while(sum>0){
if(sum%x<10){
a+=sum%x+'0';
}
else{
a+='A'+(sum%x)-10;
}
sum/=x;
}
for(int i=a.size()-1;i>=0;i--){
cout<<a[i];
}
}
表:
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize(1)
#include<iostream>
using namespace std;
string op="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main(){
string s;
int n,x;
cin>>n>>s;
x=10;//进制默认为10
int t=1;
int sum=0;
char maxn=op[n-1];//op[n-1]为n禁止最大值(如10进制最大值就是9)
bool p=0;//违规记录
for(int i=s.size()-1;i>=0;i--){
if(s[i]>='0'&&s[i]<='9'){
sum+=(s[i]-'0')*t;
}
else{
sum+=(s[i]-'A'+10)*t;//记下来
}
t*=n;
}
//cout<<sum;
for(int i=0;i<s.size();i++){
if(s[i]>maxn){//大于maxn力
cout<<i+1<<' '<<s[i]<<'\n';//下标从0开始,所以i+1
p=1;//违规力()
continue;
}
}
if(p==1){
return 0;//违规了直接停止
}
string a;//十进制
while(sum>0){
if(sum%x<10){
a+=sum%x+'0';
}
else{
a+='A'+(sum%x)-10;
}
sum/=x;
}
for(int i=a.size()-1;i>=0;i--){
cout<<a[i];
}
}