大數進制轉換
阿新 • • 發佈:2017-11-26
超過 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);
大數進制轉換