我們可以用這樣的方式來表示一個十進制數:將每個阿拉伯數字乘以一個以該數字所處位置的(值減1)爲指數,以10爲底數的冪之和的形式。例如,123可表示爲1*10^2+2*10^1+3*10^0這樣的形式。
與之相似的,對二進制數來說,也可表示成每個二進制數碼乘以一個以該數字所處位置的(值-1)爲指數,以2爲底數的冪之和的形式。一般說來,任何一個正整 數R或一個負整數-R都可以被選來作爲一個數制系統的基數。如果是以R或-R爲基數,則需要用到的數碼爲0,1,....R-1。例如,當R=7時,所需 用到的數碼是0,1,2, 3,4,5和6,這與其是R或-R無關。如果作爲基數的數絕對值超過10,則爲了表示這些數碼,通常使用英文字母來表示那些大於9的數碼。例如對16進制 數來說,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。在負進制數中是用-R作爲基數,例如-15(+進制)相 當於110001(-2進制),
並且它可以被表示爲2的冪級數的和數:
110001=1*(-2)^5+1*(-2)^4+0*(-2)^3+0*(-2)^2+0*(-2)^1+1*(-2)^0
問題求解:
設計一個程序,讀入一個十進制數的基數和一個負進制數的基數,並將此十進制數轉換爲此負進制下的數:-R∈{-2,-3,-4,....-20}
輸入格式 Input Format
輸入文件有若干行,每行有兩個輸入數據。
第一個是十進制數N(-32768<=N<=32767); 第二個是負進制數的基數-R。
輸出格式 Output Format
輸出此負進制數及其基數,若此基數超過10,則參照16進制的方式處理。【具體請參考樣例】
樣例輸入 Sample Input
30000 -2
-20000 -7
28800 -16
-25000 -16
樣例輸出 Sample Output
30000=11011010101110000(base -2)
-20000=263526(base -7)
28800=19180(base -16)
-25000=7FB8(base -16)
比較基礎的題,只要注意整除函數即可。
以下代碼是BYVoid(www.byvoid.com)大牛的,他的代碼真是精練!
#include <iostream>
#include <cstdio>
using namespace std;
int N,M,base;
inline int Div(int a,int b)
{
int n;
n=a/b;
if (n*b<=a)
return n;
return n+1;
}
void work()
{
int num[100];
int top=0;
if(N==0)
{
cout<<0;
}
int P;
while (N)
{
P=Div(N,base);
num[++top]=N-P*base;
N=P;
}
for (;top>=1;top--)
{
if (num[top]<10)
cout<<num[top];
if (num[top]>=10)
cout<<(char)(num[top]-10+'A');
}
cout<<"(base "<<base<<")"<<endl;
}
int main()
{
freopen("fjz.in","r",stdin);
freopen("fjz.out","w",stdout);
while(cin>>N)
{
cin>>base;
M=N;
cout<<N<<"=";
work();
}
return 0;
}
正在连接评测机...
已连接到评测机
GRID | 1 |
名称 | Flitty |
系统版本 | 1.00 |
备注 | COGS 1号评测机 Flitty |
编译成功
测试点 | 结果 | 得分 | 运行时间 | 内存使用 | 退出代码 |
1 | 正确 | 10 | 0.000 s | 273 KB | 0 |
2 | 正确 | 10 | 0.000 s | 273 KB | 0 |
3 | 正确 | 10 | 0.000 s | 273 KB | 0 |
4 | 正确 | 10 | 0.000 s | 273 KB | 0 |
5 | 正确 | 10 | 0.000 s | 273 KB | 0 |
6 | 正确 | 10 | 0.000 s | 273 KB | 0 |
7 | 正确 | 10 | 0.000 s | 273 KB | 0 |
8 | 正确 | 10 | 0.000 s | 273 KB | 0 |
9 | 正确 | 10 | 0.000 s | 273 KB | 0 |
10 | 正确 | 10 | 0.000 s | 273 KB | 0 |
运行时间 0.003 s
平均内存使用 273 KB
测试点通过状况 AAAAAAAAAA
得分:100
恭喜你通过了全部测试点!
沒有留言:
張貼留言