1. 程式人生 > >NOIP2000 進位制轉換

NOIP2000 進位制轉換

傳送門

這題以前搞過,不過總是沒懂。今天偶然看到以後思考了一下明白了。

可能這道題提醒人的重點在於,任何一個數也可以表示成為負進位制的冪次方形式。這樣的話,回想起正數是怎麼表示的,我們仿照正數的做法,只要進行短除即可。不過因為短除之後你的結果不能是負數,所以如果出現了負數,你就要在原數“借1”(不過因為是負進位制,所以實際表現形式是+1),然後這位餘數減去base即可。

之後就可以A啦。

看一下程式碼。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include
<iostream> #include<set> #include<queue> #define rep(i,a,n) for(int i = a;i <= n;i++) #define per(i,n,a) for(int i = n;i >= a;i--) #define pb push_back #define enter putchar('\n') using namespace std; typedef long long ll; const int M = 1000005; ll read() { ll ans = 0,op = 1;
char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { ans *= 10; ans += ch - '0'; ch = getchar(); } return ans * op; } int n,base,p,a[100],cnt; int main() { n = read(),base
= read(),p = n; while(p) { a[++cnt] = p % base,p /= base; if(a[cnt] < 0) a[cnt] -= base,p++; } printf("%d=",n); per(i,cnt,1) { if(a[i] >= 10) printf("%c",a[i] - 10 + 'A'); else printf("%d",a[i]); } printf("(base%d)\n",base); return 0; }