大數進制轉換


給出一個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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM