我一直在研究將給定數字(十進制基數)轉換為從 2 到 16 的任何其他基數的代碼。
顯然,我遇到了函式base_conversion_it(它代表迭代)反向列印值的問題。
我不能使用陣列或指標,互聯網上的每個人似乎都是這樣解決這個問題的。我的任務需要創建一個迭代函式和一個遞回函式(我做了并且有效)。
void base_conversion_it(unsigned int n, unsigned int b) {
if (n > 0) {
//bases between 2 and 16
if (b >= 2 && b <= 16) {
int r; //r = remainder
int q = 1; //quotient
int num; //saves the remainder
while (q != 0) {
r = n % b;
printf("%X", r);
q = n / b;
n = q;
}
}
}
}
uj5u.com熱心網友回復:
您開始從個位數進行轉換。
也許從最重要的數字開始?
// It's Undefined Behaviour if `b` is outside the range [2...16]
void base_conversion_it(unsigned int n, unsigned int b) {
unsigned highestbase = 1;
while (highestbase * b <= n) highestbase *= b; //possible wrap around and infinite loop
while (highestbase) {
printf("%X", n / highestbase);
n %= highestbase;
highestbase /= b;
}
printf("\n");
}
uj5u.com熱心網友回復:
抱歉錯過了迭代。
char digits[] = "0123456789ABCDEFGHIJKLMNOP";
void print(unsigned long long val, unsigned base)
{
unsigned long long mask = base;
while(val / mask >= base) mask *= base;
do
{
printf("%c", digits[val / mask]);
val %= mask;
mask /= base;
}while(val);
}
int main(void)
{
print(45654756453, 10); printf("\n");
print(45654756453, 16); printf("\n");
print(45654756453, 24); printf("\n");
print(45654756453, 2); printf("\n");
}
https://godbolt.org/z/W3fGnnhYs
遞回:
char digits[] = "0123456789ABCDEF";
void print(unsigned long long val, unsigned base)
{
if(base <= 16 && base > 1)
{
if(val >= base) print(val / base, base);
printf("%c", digits[val % base]);
}
}
https://godbolt.org/z/84hYocnjv
uj5u.com熱心網友回復:
如果您不能使用陣列(包括字串)或遞回,那么我認為您需要以最重要的優先順序計算輸出數字。這比以相反的順序計算它們并反轉結果有點不自然,但可以做到:
使用回圈查找 的最重要的非零基數的
b位值n。例如,檢查除以n的連續冪b的結果,直到結果為 0,然后退一步。在一個單獨的回圈中,從發現的最重要位置的一個開始
b,n一個一個地讀出基數。對于每個數字,- 鴻溝的電流值
n由位值pv當前數字的獲得一個數字值。 - 替換
n為n % pv。
小心繼續一直向下放置值 1,而不是在
n變為 0時停止。- 鴻溝的電流值
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/331910.html
上一篇:C中的遞回函式列印1到n到1
