1. 程式人生 > >大數進制轉換

大數進制轉換

超過 ava strlen output sca ++ -- next std

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

大數進制轉換