NOIP2000 進位制轉換
阿新 • • 發佈:2018-11-08
這題以前搞過,不過總是沒懂。今天偶然看到以後思考了一下明白了。
可能這道題提醒人的重點在於,任何一個數也可以表示成為負進位制的冪次方形式。這樣的話,回想起正數是怎麼表示的,我們仿照正數的做法,只要進行短除即可。不過因為短除之後你的結果不能是負數,所以如果出現了負數,你就要在原數“借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; }