我正在使用netBean来编写代码C,我的赋值是将一个非常大的二进制数转换为十进制数(二进制数可能高达100位),我很困惑,因为我的程序在二进制数约为50时有效-60位数但在输入较大时会在运行时自动崩溃。我使用long long int来存储小数结果,但它似乎不起作用! 这是我的代码:
long long int decimal = 0;
int position = 0;
for(int i = strlen(binaryInput)-1; i>=0; --i){
if(binaryInput[i]=='1'){
decimal += (long long int)(pow(2,position));
}
++position;
}
printf("\nDecimal number is: %lli ", decimal);
'binaryInput'是我从键盘存储binaryNumber的字符串。
答案 0 :(得分:2)
这是一个提示:
最简单的解决方案是实际获取长二进制数,并将其分成两半(或四分之一,或其他任何内容。)
跟踪哪一个是二进制数的上限,以及哪一个是二进制数的下限。
计算较低范围的真实值,以及较高范围。之后将它们加在一起。
答案 1 :(得分:0)
long long int
的范围为-9,223,372,036,854,775,807至9,223,372,036,854,775,807,如上所述here。 100位无法适应那里。但是,这种类型是签名的,您可以尝试使用未签名的类型,但我认为您的数字没有任何假设为非负数。
您可以尝试使用符合128位签名的int128_t
,但这不是标准版(Why isn't there int128_t?)。
考虑使用大小为100的数组,其中每个单元格将存储一个数字。使用此方法,建议您使用Double dabble算法,该算法用于将二进制数转换为二进制编码的十进制(BCD)表示法。
如果你需要一个库,那么GNU Multiple Precision Arithmetic Library可以解决问题。
PS:使用位移代替pow()
,因为它将对浮点值进行操作,并会降低代码的性能。
答案 2 :(得分:0)
不确定这是否是最优化的技术。最多可以计算1000位数字。您可以增加数组分配以计算更长的二进制数 我使用字符串进行输入,并使用高中数学技术进行加法运算,并计算2的幂
#include <bits/stdc++.h>
typedef long long int lli;
using namespace std;
int main() {
char bin_number[1010];
//variable for big integer operation
int int_number[1010], t_int_number[500];
/*
* int_number : converted decimal number will be stored here
* t_int_number : will be used to calculate the power of 2
*/
int bin_length, t_int_length, int_length, index;
/*
* bin_length : length(bin_number)
* t_int_length : length(t_int_length)
* int_length : length(int_length)
*/
bool carry;
while(scanf("%s", bin_number) != EOF) { //input binary number
for (int i = 0; i < 500; i++) { //intialize decimal number to 0 and t_int_number to 0
int_number[i] = 0;
t_int_number[i] = 0;
}
//set t_int_number to 1
t_int_number[0] = 1;
t_int_length = 1;
//set the int_number to 0
int_length = 1;
index = 0;
//calculate input length
bin_length = strlen(bin_number);
for (int i = bin_length - 1; i >= 0; i--) { //checks each digit of binary number
//if the digit in binary representation is 1
if (bin_number[i] == '1') {
//sum (int_number, t_int_number)
for (int index = 0; index < t_int_length; index++) {
int_number[index] +=
t_int_number[index]; //sum t_int_number digits
if (int_number[index] > 9) { //if carry
int_number[index + 1] ++;
int_number[index] -= 10;
}
}
int_length = index;
if (int_number[index] != 0) { //i f length increase for addition
int_length ++;
}
}
//Being ready for next iteration
//multiplying everytime with 2 and save it to t_int_number
carry = false;
for (index = 0; index < t_int_length; index++) {
t_int_number[index] += t_int_number[index]; //double the number
}
for (index = 0; index < t_int_length; index++) {
if (t_int_number[index] > 9) {
t_int_number[index] -= 10;
t_int_number[index + 1]++;
}
}
if (t_int_number[index] != 0) {
t_int_length++;
}
}
//printing the decimal number
for (int i = int_length - 1; i >=0; i--) {
printf("%d", int_number[i]);
}
printf("\n");
}
return 0;
}