C - Nhân 2 số nguyên lớn

Thảo luận trong 'C/C++' bắt đầu bởi white.smut, 9 Tháng một 2014.

  1. Offline

    white.smut

    • Administrator

    • Loading: |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] 99% Completed - Error: Disconnected. Please try again!
    Số bài viết:
    842
    Đã được thích:
    425
    Điểm thành tích:
    450
    Mã:
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    #include <string.h>
     
    long mu(int a,int n)
    {
    if (n==1) return a;
    else return a*mu(a,n-1);
    }
     
    long karatsuba (int x,int y,int n)
    {
    int a,b,c,d;
    long u,v,w;
    if (n<=1) return x*y;
    else
    if (n%2==0)
    {
    a=x/mu(10,n/2);
    b=x%mu(10,n/2);
    cout<<"\na="<<a<<"\nb="<<b;
    c=y/mu(10,n/2);
    d=y%mu(10,n/2);
    cout<<"\nc="<<c<<"\nd="<<d;
    u=karatsuba(a,c,n/2);
    v=karatsuba(b,d,n/2);
    w=karatsuba(a+b,c+d,n/2);
    return u*mu(10,n) + (w-u-v)*mu(10,n/2)+v;
    }
    else if (n%2!=0)
    {
    a=x/mu(10,n/2);
    b=x%mu(10,n/2);
    cout<<"\na="<<a<<"\nb="<<b;
    c=y/mu(10,n/2);
    d=y%mu(10,n/2);
    cout<<"\nc="<<c<<"\nd="<<d;
    u=karatsuba(a,c,n/2);
    v=karatsuba(b,d,n/2);
    w=karatsuba(a+b,d+c,n/2);
    return u*mu(10,n-1) + (w-u-v)*mu(10,n/2)+v;
    }
    return u;
    }
     
    void main()
    {
    char t1[10],t2[10];
    long so1,so2,tam1,tam2;
    int n1,n2,n;
    clrscr();
    cout<<"\nso1=";
    cin>>so1;
    tam1=so1;
    itoa(tam1,t1,10);
    n1=strlen(t1);
    cout<<"\nso2=";
    cin>>so2;
    tam2=so2;
    itoa(tam2,t2,10);
    n2=strlen(t2);
    if (n1>n2)
    n=n1;
    else n=n2;
    cout<<"\nKQ="<<karatsuba(so1,so2,n);
    getch();
    }
    
    Code trên chỉ tính toán được những số có 4 chữ số trở xuống, muốn tính toán được 5 chữ số bạn có thể thay kiểu dữ liệu long thành unsigned long, vì tràn kiểu nên không tính toán được số từ 6 chữ số trở lên.

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí