大数进制转换

给出一个36进制的大数(0-9,A-Z),将其转为10进制并输出。

Input输入:36进制的大数,每一位用0-9,A-Z来表示,A表示10,Z表示35。(A的长度 <= 100000)Output输出:该数的10进制表示Sample Input

1AZ

Sample Output

1691

起初做大数据处理的题目,并没有什么功底,就是突然想到可以用数组,所以再次做到这类题时,仍然记得用数组存位,最后倒着输出就好  所以原始是这么写的

超时代码1
#include <iostream>
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Max 1000001
#define INF 0x3f3f3f3f
using namespace std;
char s[Max];
int ans[Max];
long long index = 0,d;
int main()
{
    scanf("%s",s);
    for(int i = 0;i < strlen(s);i ++)
    {
        if(s[i]>=‘0‘&&s[i]<=‘9‘)d = s[i] - ‘0‘;///每次记录一个位 大循环次数增加
        else d = s[i] - ‘A‘ + 10;

        for(int j = 0;j <= index;j ++)
        {
            d += ans[j] * 36;
            ans[j] = d % 10;///每次存单位数  此处循环次数增加
            d /= 10;
        }
        while(d){ans[++index]=d%10;d/=10;}
    }
    for(int i = index;i >= 0;i --)
    printf("%d",ans[i]);
}

超时就想可不可以减少循环次数,然后就想到一个位可以存多位数,甚至改成long long

然后

超时代码2

#include <iostream>
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Max 1000001
#define In 1000000000000000
#define INF 0x3f3f3f3f
using namespace std;
char s[Max];
long long ans[Max];
long long index = 0,d = 0;
int main()
{
    scanf("%s",s);
    for(int i = 0;i < strlen(s);i ++)
    {
        if(s[i]>=‘0‘&&s[i]<=‘9‘)d = s[i] - ‘0‘;///这里还没想到要每次取多位
        else d += s[i] - ‘A‘ + 10;
        for(int i = 0;i <= index;i ++)
        {
            d += ans[i] * 36;
            ans[i] = d % In;
            d /= In;
        }
        while(d)
        {
            ans[++ index] = d % In;///做了优化
            d /= In;
        }
    }
    for(int i = index;i >= 0;i --)
    if(i == index)printf("%lld",ans[i]);
    else printf("%015lld",ans[i]);
}

最后才想到能过的方法了

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 100000
using namespace std;
const long long In = (long long)1e10;///每一位存的大小界限  不超过1e10
char s[Max];
long long ans[Max];///存十进制转换后的数 每个位不再存10以下的数(也就是单位数) 而是存1e10以下的数
long long index = 0,d = 0;///index为ans下标 总的位数 d 是个辅助变量
const long long e[5] = {36,36*36,36*36*36,36*36*36*36,36*36*36*36*36};///36进制的不同位
int q[300];///转换 char 到 int
void init()///初始字符到int 方便直接使用
{
    for(int i = 0;i <= 9;i ++)
        q[i + ‘0‘] = i;
    for(int i = 0;i <= 25;i ++)
        q[i + ‘A‘] = i + 10;
}
int main()
{
    scanf("%s",s);
    int len = strlen(s),i = 0;
    init();
    while(i < len)
    {
        for(int j = 0;i + j < len && j < 5;j ++)///每次最高读取五个位  然后存到十进制ans数组
        d = d * 36 + q[s[i + j]];

        for(int j = 0;j <= index;j ++)
        {
            d += ans[j] * e[min(len - i - 1,4)];///当前的ans具体要前移几位要看剩下几位要存进来  如果剩下的不足五位 那么就是len - i位 对应于e数组相应值 需要注意e最高是36进制第五位 那么ans每个位不能存过高 不然相乘后会超了 long long
            ans[j] = d % In;
            d /= In;
        }
        if(d)ans[++ index] = d % In,d /= In;///如果d不为0 向前进一位
        i += 5;
    }
    for(int i = index;i >= 0;i --)
    if(i == index)printf("%lld",ans[i]);
    else printf("%010lld",ans[i]);///如果是0 要输出十位
}

java BigInteger类 路过

Scanner sc = ...
BigInteger a = sc.nextBigInteger(36);
System.out.print(a);
时间: 2024-10-31 08:56:31

大数进制转换的相关文章

大数进制转换问题

在数据结构课关于栈的这一章中,我们都学过用"模2取余法"来将一个10进制数转换为一个二进制数,进而可以推广到"模n取余法",经其转换为n进制(n任意指定). 确实,这是一个很基础的题目,可你是否想过如果这个10进制数是一个大数(其位数可能上千位,此时用一般数据类型肯定是会溢出的),那么这个问题又如何来求解呢? 当然,也许你会说很简单嘛,自己写一个大数类(当然至少要写一个大数除法才行),或者你用的是Java这种现代化语言,就更轻松了,直接用BigInteger这样的大

POJ1220(大数进制转换)

NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4652   Accepted: 2132 Description Write a program to convert numbers in one base to numbers in a second base. There are 62 different digits: { 0-9,A-Z,a-z } HINT: If

hdu-1877(大数+进制转换)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1877 思路:注意考虑0,0的情况. #include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; int m,a,b; string s1,s2; string add(string s1,string s2) { if(s1.lengt

高精度的进制转换

1 #include <stdio.h> 2 #include <string.h> 3 4 char str[1000];//输入字符串 5 int start[1000],ans[1000],res[1000]; //被除数,商,余数 6 //res[]存的是余数,其最后结果的逆序为所求的结果 7 //转换前后的进制 8 const int oldBase = 10; 9 const int newBase = 2; 10 11 void change() 12 { 13 //

poj2305-Basic remains(进制转换 + 大整数取模)

进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串->整数 十进制->b进制; 3,十进制下计算并将整形结果转换成字符串形式,并倒序储存; 4,输出.三,步骤: 1,输入p[],m[]; 2,字符串->整形 + 进制->b进制: i,进制转换语句:m2 = m2*b + m[j]-'0'; ii,大整数取模,大整数可以写成这样的形式: 12

高精度进制转换

高精度进制转换: 对于普通的不是很大的数的相互转换,我们一般采用不断模取余的方法,例如:将10进制数m转换成n进制数,则对m模n取余即可.但是,如果是一个有几百.几千或者更多位的大数呢?显然这种模取余的方法不再适用了.那如何求解此类大数的转换呢?接下来,介绍一种通用方法. 我们将一个大数的每一位看做是一个单独的数,但是却不是完全孤立的,与其它位置上的数有关联,从该数的最高位开始,对该位上的数除以要转换的进制基数,得到商和余数,商取代原来该位上的数,进行下一位的相同操作,但是注意下一位的除数不仅仅

任意进制转换算法

任意进制转换算法 N年没有写博客,发个进制转换的玩下,支持负数:功能属于简化版的 Convert.ToInt32 ,特点是: 1.任意位,如:0,1(二进制),0...7(八进制),0...9,A...F(16进制),0...N(N进制),或者是:[email protected]#$%^&*(8进制,字符符号),也可以是中文. 2.8 byte 最大长度. 3.C#源码. 最近写markdown格式习惯啦,cnblogs啥时候全改掉算了,别用这个htmleditor算了. 先说明下进制转换的基

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

03 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换, 算术运算,比较运算,逻辑运算,短路现象, 三目运算符,字符型运算: 数据类型 整体划分 标量类型: int, float, string, bool 复合类型: array,     object 特殊类型: null,     resouce 整数类型int, integer 3种整数表示法 十进制写法:123: $n1 = 123; 八进制写法: 0123 $n2 = 0123; 十六进制写法: 0x123 $n3

计算机进制转换

一.计算机只认识0和1,二进制. 二.2进制转换成 8进制 和 16进制,如下图: 二进制 > 八进制 :  研究上图发现,3位最高二进制可以用来表示一位八进制.所以,将二进制分解每3位,不够前面补0,然后每3位转换为10进制,顺序排列即可. 二进制 > 十六进制  :4位最高二进制可以用来表示一位十六进制.所以,将二进制分解每4位,不够前面补0,然后每4位转换为10进制,超过9用字母表示即可.顺序排列即可. 如下: 二进制 > 十进制:   11001001 = 2^7+2^6+2^3