数字检测 信友队20317

数字检测

题目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转成十进制后不超过2^{30}

好了,思路

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];
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值