題目傳送門 題目描述 我們可以用這樣的方式來表示一個十進位數: 將每個阿拉伯數字乘以一個以該數字所處位置為指數,以 1010 為底數的冪之和的形式。例如 123123 可表示為 1 \times 10^2+2\times 10^1+3\times 10^01×102+2×101+3×100 這樣的形 ...
題目傳送門
題目描述
我們可以用這樣的方式來表示一個十進位數: 將每個阿拉伯數字乘以一個以該數字所處位置為指數,以 1010 為底數的冪之和的形式。例如 123123 可表示為 1 \times 10^2+2\times 10^1+3\times 10^01×102+2×101+3×100 這樣的形式。
與之相似的,對二進位數來說,也可表示成每個二進位數位乘以一個以該數字所處位置為指數,以 22 為底數的冪之和的形式。
一般說來,任何一個正整數 RR 或一個負整數 -R−R 都可以被選來作為一個數制系統的基數。如果是以 RR 或 -R−R 為基數,則需要用到的數位為 0,1,....R-10,1,....R−1。
例如當 R=7R=7 時,所需用到的數位是 0,1,2,3,4,5,60,1,2,3,4,5,6,這與其是 RR 或 -R−R 無關。如果作為基數的數絕對值超過 1010,則為了表示這些數位,通常使用英文字母來表示那些大於 99 的數位。例如對 1616 進位數來說,用 AA 表示 1010,用 BB 表示 1111,用 CC 表示 1212,以此類推。
在負進位數中是用 -R−R 作為基數,例如 -15−15(十進位)相當於 (110001)_{-2}(110001)−2 (-2−2進位),並且它可以被表示為 22 的冪級數的和數:
(110001)_{-2}=1\times (-2)^5+1\times (-2)^4+0\times (-2)^3+0\times (-2)^2+0\times (-2)^1 +1\times (-2)^0(110001)−2=1×(−2)5+1×(−2)4+0×(−2)3+0×(−2)2+0×(−2)1+1×(−2)0
設計一個程式,讀入一個十進位數和一個負進位數的基數, 並將此十進位數轉換為此負進位下的數。
輸入格式
輸入的每行有兩個輸入數據。
第一個是十進位數 nn。 第二個是負進位數的基數 -R−R。
輸出格式
輸出此負進位數及其基數,若此基數超過 1010,則參照 1616 進位的方式處理。
輸入輸出樣例
輸入 #130000 -2
輸出 #1
30000=11011010101110000(base-2)
輸入 #2
-20000 -2
輸出 #2
-20000=1111011000100000(base-2)
輸入 #3
28800 -16
輸出 #3
28800=19180(base-16)
輸入 #4
-25000 -16
輸出 #4
-25000=7FB8(base-16)
說明/提示
【數據範圍】
對於 100\%100% 的數據,-20 \le R \le -2−20≤R≤−2,|n| \le 37336∣n∣≤37336。
NOIp2000提高組第一題
解答:
正數對負數取模:(得到的是位權)
eg: 5對-2取模 5=(-2)*(-2)+1;
但是當負數對負數取模,那麼得到的可能是負數:(位權一多半為正數)
eg: -5對-2取模 -5= 2 * (-2) + (-1);
但是,由於位權不能為負數,所以我們需要改進,則:
eg:-5對-2取模 -5=3*(-2)+1;
因此我們可以判斷,如果是負數對負數取模的話,我們可以將這個負數取模之後的餘數加上取模數的絕對值,然後除了之後的商加上1;
代碼實現如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
void solve(int x,int y)
{
int a;
if (x == 0)
return;
int z = x % y;
if (z < 0)
{
z-=y;
x += y;
}
if (z >= 10)
{
z = 'A' + z - 10;
}題目傳送門
else
{
z += '0';
}
solve(x / y, y);
printf("%c", z);
return;
}
int main()
{
int n, r;
cin >> n >> r;//r<0
string ans = "";
cout << n << "=";
solve(n, r);
printf("(base%d)", r);
return 0;
}
稀有氣體怎麼會反應呢,就這樣吧