2014-12-18 4 views
0

10 진수를 2 진수로 변환하려고합니다. 코드는 (윈도우 7, 32 비트 MS-VS2010) 꽤 잘 작동 :C : 매우 큰 정수를 이진수로 변환

int main() 
{ 

    int k, n; 
    int binary[100]; 
    printf("Enter the value in decimal \n "); 
    scanf("%d", &k); 
    n = (log(k * 1.0)/log(2 * 1.0)) + 1 ; //total no. of binary bits in this decimal 

    for (int i = n; i > 0; i--) 
     { 
     binary[i] = k % 2; 
     k /= 2; 
     } 

return 0; 

} 

그러나 한계는 오직 즉 32 비트 지능 크기 값 작동한다는 것입니다. 이 코드를 수정하여 2048 비트 (실제로 617 자리를 포함하는 10 진수)로 작동하도록합니다. 나는 어떤 도서관도 사용할 수 없다.

누군가이 문제를 해결하는 방법을 알려줄 수 있습니까?

예제 코드 스 니펫에 64 비트를 말할 수 있습니까? 그런 다음이 값을 사용하여 더 높은 값으로 확장 할 수 있습니다.

업데이트

1로 내가 문자열을 사용하려고 제안 당. 하지만 문자열을 큰 Int로 변환하는 방법을 이해할 수 없습니다. thsi가 32 비트 int로 변환 될 때 sti()를 사용할 수 없습니까?).

2 번째로 내가 찾을 수있다 :

log(222121212213212313133123413131313131311313154515441315413451315641314563154134156313461316413415635154613415645156451434) 

는 라이브러리 함수 log이를 발견 할 수 있습니까? 그렇다면 해결책은 무엇입니까?

+5

숫자를 'int'대신 문자열로 읽습니다. 그런 다음 문자열에서 숫자를 처리합니다. –

+0

@ legends2k 어떤 라이브러리도 사용할 수 없습니다. – user3891236

+2

라이브러리가 필요없고 입력 문자열을 가져 와서 변환하면됩니다. – 2501

답변

0

C에서 20148 비트와 같은 큰 값을 저장할 수있는 표준 유형이 없습니다 ... 콘솔에서 문자열을 읽고 (int로 변환하지 않음) 구문 분석을 시도 할 수 있습니다 당신 자신의 "010101 ...."에 문자열.

접근 방식은 그렇게 될 것이다 :
당신이 각 부문 (각 단계에서 2로 문자열을 "분할"가야는 2 문자열의 모든 숫자를 분할하고, 특별한 경우를 처리 할 필요가 11/2 => 5처럼), 각 단계마다 값을 2로 나눌 수없는 경우 다른 이진수로 "1"을 넣을 수 있습니다. 그렇지 않으면 "0"을 넣습니다. 이렇게하면 '0', '1', '0', '1'등의 숫자를 하나씩 수집 할 수 있습니다. 마지막으로 자릿수를 뒤 바꿔야합니다. 비슷한 접근 방식은 당신이 여기에서 찾을 수 있습니다 C#으로 구현 : Decimal to binary conversion in C#

1

당신이 그냥 포인터가 아닌 실제 답을해야한다는 말 때문에, 여기 간다 :

가 나는 변환하는 방법을 이해할 수 없습니다입니다 큰 문자열로 문자열

그건 할 수 없기 때문입니다. 거대한 숫자를 숫자 형식으로 변환하려면 먼저 숫자를 저장할 수있는 형식이 필요합니다. 이 언어는 일반적으로 길이가 128 비트 인 long long 이상을 제공하지 않습니다 (예 : C99를 사용할 수있는 경우, 즉 long은 보통 long long보다 작음). 귀하의 가정교사가 외부 라이브러리를 사용하지 말라고 말했기 때문에, 언어로만 사용할 수있는 라이브러리와 표준 라이브러리를 사용하여 솔루션을 코딩하길 원합니다.

없음을 발견 할 수있는 라이브러리 함수 로그, 당신은,이 몇 가지 산술 형의 인수를 기대하는 모든 때문에 stoi 또는 log을 사용할 수 없습니다 동안 내장 유형의 사람들의 없음 이 거대한 숫자를 보유하기에는 큰 것입니다. 따라서 문자열 (즉, 정적 또는 동적 문자 버퍼)을 사용하여 완전히 작업해야합니다.

log을 사용하여 이진 출력에 필요한 자릿수를 추측하고 싶습니다. 그러나 다른 옵션이 있습니다. 이것은 손으로 넘버의 수를 알지 못하게하고, 상한으로 동적으로 할당하여 더 이상 다시 할당 할 필요가 없도록합니다.

예를 들어 보겠습니다.

  1. 3 개 char 버퍼 in, out (입력의 길이)와 bin (입력 길이 * 4) 할당한다. in
  2. 동안 in-
  3. 복사 입력 i
  4. 만약 정수하는 다른 고토
  5. ch 변환을 in의 각 요소 ch를 들어 다른 고토
  6. 을하지 "0" 또는 "1"입니다 is_odd = 1 다음으로 i += 10
  7. quot = i/2
  8. 추가] quot
  9. is_odd = quot % 2out에; is_odd = 1'1' 다른 '0' 복사 out
  10. bin-in에 추가 4
  11. 경우 고토 , out와 고토
  12. 추가] in
에서 인쇄 bin
  • bin에를 재설정

    정수를 2로 정수로 나눌 때 몫은 항상 배수의 자릿수보다 작거나 같습니다. 따라서 inout을 입력과 동일한 크기로 할당하고 모든 반복에 사용할 수 있습니다. bin 버퍼의 경우 각 십진수가 4 비트를 넘지 않는다는 지식은 도움이됩니다. 따라서 입력이 10 자리 인 경우 버퍼에 필요한 상한은 10 * 4 = 40 바이트이고 버퍼는 inout 버퍼에는 10 바이트가 필요합니다.

    이것은 알고리즘의 모호한 글입니다. 아이디어가 전달되기를 바랍니다. 필자는 알고리즘을 작성하는 것보다 코드를 작성하는 것이 더 쉽다고 생각합니다.업데이트 대하여

  • 0

    : 울프 럼 알파 통해 연삭

    준다 :

    로그 (222121212213212313133123413131313131311313154515441315413451315641314563154134156313461316413415635154613415645156451434)

    대략

    이다 274.8056791141317511022 806994521207149274321589939103691837589 ..

    테스트 : 특급으로 퍼팅

    을 제공합니다

    2.2212121221321231313312341313131313131131315451544131541는 ... 이것은 당신이 필요로하는 정밀도에 대한 문제를 제기 10^119

    를 ×.

    참고 : 자연 로그 (기본 e)를 의미한다고 가정했습니다.

    +0

    기본적으로 해당 로그는 전체 번호를 찾는 데 사용됩니다. 10 진수의 비트 수. 우리가 들어간다. 그리고 이것은 로그베이스 10입니다. 저는 C 프로그램에서이 작업을하고 싶지만, 로그 캔트는 그러한 큰 번호를 처리합니다. – user3891236

    관련 문제