32进制数 请求帮助

题目描述

进制转换在计算机信息处理中应用很广, 鱼大大想要做好一个程序员,就得了解并熟悉进制转换,这对于鱼大大来说是非常重要的。
如今的计算机常见的进制有2进制、8进制、10进制、16进制。鱼大大也已经熟练的掌握了这几个进制之间的转换。不过很有远见的鱼大大认为,不久以后32进制也一定会变成一个常见的进制,不如现在就把他掌握好。
鱼大大知道计算机底层语言是二进制的0/1。于是他决定首先就要学会2进制和32进制的互相转换。现在需要你帮忙将一个2进制数变成32进制数,方便鱼大大学习记忆。

输入格式

一行一个首位为1的2进制数字

输出格式

一行一个32进制数字。(10~31分别用A~V表示)

样例

Input 1

101011101110000111111

Output 1

1BN1V

数据范围

对于40%的数据,输入2进制数字位数<30
对于60%的数据,输入2进制数字位数<60
对于100%的数据,输入2进制数字位数<150

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<climits>
#include<cstring>
#include<string>
#include<algorithm>
#include<functional>
#include<list>
using namespace std;

char a[160];//n-ary number
long long b[160];//m-ary number
long long ans=0;

int main(){
	cin>>a;
	for(int i=0;i<strlen(a);i++){
		long long num;
		if(a[i]>='0'&&a[i]<='9'){
			num=a[i]-'0';
		}
		else{
			num=a[i]-'A'+10;
		}
		ans=ans*2+num;//ans is the DEC form of a;
	}
	int i=1;
	while(ans!=0){
		b[i]=ans%32;
		ans=ans/32;
		i++;
	}
	i=i-1;
	for(int j=i;j>=1;j--){
		if(b[j]>=0&&b[j]<=9){
			cout<<b[j];
		}
		else{
			char s;
			s=55+b[j];
			cout<<s;
		}
	}
	return 0;
}

这一道题只得了65分,估计是因为超出了long long的范围了,请问该怎么改?

那就用高精度呗

老师还没教…

你这道题应该先用string/char把数据输入进来在处理,没必要用高精度

而且你处理的时候把它的每一位放到一个数组里存不就好了么,你放到ans里有可能会超吧

二进制转十进制是不断累加的,每一位都在变,怎样才能存入数组里呢

无需使用高精度,仅需将 32 进制中的每一位替换成它所对应的 2 进制数(每个占 5 位)。
例:
(AC)_{32}
先将 AC 化为 2 进制数
A_{32}=11=1011_2
C_{32}=13=1101_2
补足 5 位:
A_{32} 对应 01011
C_{32} 对应 01101
最后连接起来,去掉前导 0
(AC)_{32}=101101101_2
按照此思路模拟即可。