문제

나는 숙제의 일부로 문자열로 사용되는 두 개의 긴 숫자의 곱을 얻어야 하는 C 프로그램을 작업하고 있습니다.예:123456789021 및 132456789098.문자열로 취하기 때문에 곱셈을 위해 long long int로 변환했습니다.그러나 결과 제품은 매우 클 것입니다(내 생각에 long long int보다 더 클 것입니다).누구든지 이 곱셈을 수행하는 방법을 제안해 주실 수 있나요?

도움이 되었습니까?

해결책

다음은 다음과 같습니다.이 숫자를 종이에 어떻게 곱할 것인지 고려하십시오. 이 방법을 C에서 구현하십시오. 다음을 발견해야합니다.

  • 정수 (문자열로 표시)를 숫자로 나누는 방법
  • 각 숫자를 정수로 다시 변환하는 방법 0 <= d < 10
  • 숫자 배열을 관리하는 방법 (즉, 배열을 얼마나 커야합니까?)
  • 루프 작성 방법 곱셈을 구현해야 할 수도 있습니다.
  • 한 자리에서 다음 자리로 운반 제품을 관리하는 방법
  • 출력을 위해 해당 자릿수를 문자로 다시 변환하는 방법

다른 팁

일반적으로 큰 정수는 바이트 어레이로 표시됩니다. DLR에서 Microsoft의 Biginteger 구현을 볼 수 있습니다. Knuth가 개발 한 알고리즘을 사용했다고 생각합니다

이것을 확인하십시오 Biginteger 도서관 그리고 a 매우 기본적인 샘플 코드 7 세의 세계에서.

C에서 내 집 요리 코드 중 일부에 관심이 있다면 (곱셈 만) :

////////////////////////////////////////////////////////////////////////////////

Code removed after I checked the home-work tag ;)

///////////////////////////////////////////////////////////////////////////////////////

이것은 내가 참여한 이전 프로그래밍 콘테스트 중 일부에서 작동합니다.) 그러나 더 빠른 곱셈 알고리즘을 찾고 있다면 구현할 수 있습니다. Karatsuba 알고리즘, 나는 지금 이것을 실시간 콘테스트에서 개인적으로 사용합니다.

이봐, 이걸 확인해, 난 방금 숙제의 일부로 어제 완료했다.

#include<stdio.h>
#include<string.h>

int main()
{
    char one[195];
    char two[195];
    char temp[195];
    int a[195],c[195],b[195];
    int x,i,j,k,l,p,add;

    for(;;)/*determining the larger number...*/
    {
        printf("Input A:");
            gets(one);
        printf("Input B:");
            gets(two);

        k=strlen(one);
        l=strlen(two);
        if(l>k)
        {
            strcpy(temp,one);
            strcpy(one,two);
            strcpy(two,temp);
            break;
        }
        else
        {
            break;
        }
    }
        k=strlen(one);
        l=strlen(two);
    for(p=0;p<195;p++)/*assigning all initial values to 0*/
    {
        a[p]=0;
        b[p]=0;
        c[p]=0;
    }

    for(i=0;one[i];i++)/*converting char to integer(note:1,as a character assigned as 49.)*/
    {
        a[i]=((one[--k])-48);
    }

    for(i=0;i<two[i];i++)
    {
        b[i]=((two[--l])-48);
    }


    for(i=0;i<=strlen(two);i++)/*main algorithm*/
    {
        add=0;
        p=0;
        for(j=i;j<=(2*strlen(one)-1);j++)
        {
            x=c[j]+b[i]*a[p]+add;
            c[j]=x%10;
            add=x/10;
            p++;
        }
    }

    printf("\nMultiplication:");
    for(p=(2*strlen(one)-1);p>=0;p--)
    {
        if(p>strlen(one)&&c[p]==0)
        {
            continue;
        }
        printf("%d",c[p]);
    }
    printf("\n");
}

큰 정수 산술을 위해 라이브러리를 사용할 수 있습니다. Wikipedia에는 ​​목록이 있습니다. 여기.

또 다른 접근법은 숫자를 플로트/더블로 곱하고 결과를 표시 할 때 소수점을 깎아내는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top