如果有人可以幫助我,我會很高興...
我應該撰寫一個程式,在不使用回圈的情況下以二進制表示形式列印一個整數。它還需要以 32 位表示形式列印出數字。對于小數字(例如 256 仍然有效),下面的代碼作業正常。對于大數字,我沒有得到預期的輸出。
有人看到我如何解決這個問題嗎?
非常感謝!
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
void
print_reverse(uint32_t value)
{
if (value % 10 == 0) {
if (value == 0) {
printf("1");
return;
} else {
printf("0");
print_reverse(value / 10);
}
} else {
if (value == 1) {
return;
} else {
printf("1");
print_reverse((value - 1) / 10);
}
}
return;
}
int
print_binary1(uint32_t value, uint32_t binary1, int zeros1)
{
int rest, binary, zeros;
if (value == 0) {
zeros = zeros1;
printf("%0*d", 32 - zeros, 0);
return binary1;
} else {
rest = value % 2;
if (rest >= 1) {
binary = binary1 * 10 1;
zeros = zeros1 1;
return print_binary1((value - 1) / 2, binary, zeros);
} else {
binary = binary1 * 10;
zeros = zeros1 1;
return print_binary1(value / 2, binary, zeros);
}
}
}
void
print_binary(uint32_t value)
{
printf("%" PRIu32, value);
if (value == 0) {
printf(" = 0b00000000000000000000000000000001");
} else {
printf(" = 0b");
int binary = print_binary1(value, 1, 0);
print_reverse(binary);
}
}
int
main(void)
{
uint32_t value;
printf("value: ");
if (scanf("%" SCNu32, &value) != 1) {
fprintf(stderr,
"ERROR: While reading the 'uint32_t' value an error occurred!");
return EXIT_FAILURE;
}
printf("\n");
print_binary(value);
printf("\n");
return EXIT_SUCCESS;
}
uj5u.com熱心網友回復:
首先,除非您有 32 個版本的幾乎相同的代碼行,否則不可能使用回圈。
例如,有問題的代碼使用遞回來實作回圈。(實際上,任何回圈都可以使用遞回來實作。)但它仍然在回圈(重復執行相同的代碼)。
在隱藏回圈的同時實作您想要的最簡單方法是使用snprintf.
其余部分回答了為什么該代碼不適用于較大的數字。
看起來這產生了我以前稱為“十進制編碼的二進制”(參考二進制編碼的十進制),其中十進制表示的每個數字代表一個位。例如,它將十三(1101 基數為 2)轉換為一千一百零一(1101 基數為 10)。
如果是這樣,程式支持的最大輸入是 1,1111,1111(基數 2),因為 10,0000,0000(基數 10)不適合uint32_t. 換句話說,32 位輸出支持 floor(log10(2^32-1)) = 9 位輸入。這意味著程式支持編號從 0 到 511,但不能超過。
通過切換到 64 位輸出,您可以支持 floor(log10(2^64-1)) = 19 位輸入,這仍然不足以滿足您的需求。
你需要一種不同的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/359058.html
