Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Xử lý tính toán với 2 số nguyên lớn có thể đến hàng trăm chữ số

  1. #1
    Ngày gia nhập
    03 2010
    Nơi ở
    tphcm
    Bài viết
    227

    Question Xử lý tính toán với 2 số nguyên lớn có thể đến hàng trăm chữ số

    --------------------------------------------------------------------------------

    Dùng mảng 1 chiểu để lưu trữ
    1. Viết 1 chương trình nhập vào 2 số nguyên lớn (có thể đến hàng trăm chữ số)
    2. Thực hiện phép toán trên 2 số đó:
    a.So sánh
    b.cộng
    c.trừ
    3.Thực hiện phép nhân,phép chia số nguyên lớn đối với số nguên hoặc số nguyên lớn đối với số nguyên lớn(bonus)
    Gợi ý:
    Nhập vào N1,N2 là 1 dãy kí tự char n1[300]
    Chuyển vào mảng số bằng cách-'0'
    N1 có 9 kí tự.N2 có 3 kí tự.Gọi chieudaimax là số phần tử của mảng có nhiều phần tử hơn.
    N1:123456789
    N2:123
    N1:

    n2:

    kq: +


    kq: n1 –n2


    kq: n2-n1



    Cộng: Ta sẽ cộng từng giá trị từ cuối mảng trở về trước. kết quả sẽ được lưu trong mảng kq. Mảng kq sẽ có max+1 phần tử. Và sẽ có biến nhớ để lưu giá trị của từng phép cộng của các phần tử.
    Trừ: Từ phép so sánh ta sẽ lấy phần tử lớn trừ phần tử nhỏ, nếu là trường hợp nhỏ trừ lớn sẽ xuất ra dấu – trước kết quả. Ta sẽ có biến nhớ để lưu có mượn hay không?
    Nhân: Để đơn giản ta có thể lặp đi lặp lại phép cộng nhiều lần. Ví dụ: a*3 = a+a+a
    Chia: Để đơn giản ta có thể dùng phép trừ.
    Ví dụ: 16/3
    Kiểm tra số 16 có lớn hơn 3 hay không? Nếu không à kq = 0
    3*1=3 < 16: tiếp tục lặp cho đến khi được tích >= số bị chia
    3*2=6
    3*3=9
    3*4=12
    3*5=15
    3*6=18
    18>16 à xuất 6-1 = 5
    Làm ơn làm dùm mình theo cách này bằng chương trình con nha
    Giúp đỡ mình chút nha tại mình học dỡ kĩ thuật lập trình lắm
    Cám ơn nhiều nha
    Lưu ý:nhập mảng ngẫu nhiên
    Đã được chỉnh sửa lần cuối bởi thuan : 23-03-2010 lúc 03:22 PM.

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    demo chưa có dấu và chưa có - * /
    PHP Code:
    #include <iostream>
    using namespace std
    #include <conio.h>



    class nguyenduong
    {
    private:
        
    char x[200];
    public:
        
    friend istreamoperator>>(istream&,nguyenduong&);
        
    friend ostreamoperator<<(ostream&,nguyenduong);
        
    friend nguyenduong operator+(nguyenduong,nguyenduong);
        
    friend bool operator>(nguyenduong,nguyenduong);
        
    friend bool operator>=(nguyenduong,nguyenduong);
        
    friend bool operator<(nguyenduong,nguyenduong);
        
    friend bool operator<=(nguyenduong,nguyenduong);
        
    friend bool operator==(nguyenduong,nguyenduong);
        
    friend bool operator!=(nguyenduong,nguyenduong);
    };
    int xstrlen(char *xau)
    {
        
    int i=0;
        while (
    xau[i])i++;
        return 
    i;
    }
    ostreamoperator<<(ostreamo,nguyenduong x)
    {
        return 
    o<<x.x;
    }
    istreamoperator>>(istream &i,nguyenduong &x)
    {
        return 
    i>>x.x;
    }
    void chenkitu(char *xau ,int vitri=0char chen='0'//vi tri bat dau tu 0  
    {
        for (
    int i=xstrlen(xau)+1;i>vitri;i--)   xau[i]=xau[i-1];  
        
    xau[vitri]=chen;  
    }  
    void xoakitu(char *xau,int vitri=0//vi tri bat dau tu 0
    {
        for(
    int i=vitri;i<=xstrlen(xau);i++) xau[i]=xau[i+1];
    }
    void canbang(char *a,char *b)  
    {  
        
    int ai=xstrlen(a),bi=xstrlen(b); 
        
    char *p=ai>bi?b:a;
        if (
    ai!=bi)  
            for (
    int i=(ai>bi?ai:bi)-xstrlen(p);i>0;i--) chenkitu(p);  
        
    chenkitu(a);chenkitu(b);  
    }  
    void tong(char *a,char *b,char *s,int i=0)   // bước đệm cho toán tử +, giống như vscanf và scanf vậy
    {                                              // sử dụng đệ quy để tính tổng 2 chuỗi
        
    static int temp=0
        if (
    i<xstrlen(a)) tong(a,b,s,i+1);  
        if (
    a[i]==NULLs[i]=NULL;  
            else 
            {  
                
    s[i]=a[i]+b[i]+temp-'0';  
                if (
    s[i]>'9's[i]-=10,temp=1;  
                    else 
    temp=0;  
            }  
    }  
    nguyenduong operator+(nguyenduong anguyenduong b)
    {
        
    nguyenduong s;
        
    canbang(a.x,b.x);
        
    tong(a.x,b.x,s.x);
        
    xoakitu(a.x);
        
    xoakitu(b.x);
        if (
    s.x[0]='0'xoakitu(s.x);
        return 
    s;
    }
    int sosanhf(char *a,char *b,int i=0// a>b trả về 1 , a<b trả về -1 , a==b trả về 0
    {
        if (
    i==xstrlen(a)) return 0;
        else if (
    a[i]>b[i]) return 1;
        else if (
    a[i]<b[i]) return -1;
        else return 
    sosanhf(a,b,i+1);
    }
    int sosanh(char *a,char *b)
    {
        
    canbang(a,b);
        
    int temp=sosanhf(a,b);
        
    xoakitu(a);    xoakitu(b);    
        return 
    temp;
    }
    bool operator>(nguyenduong a,nguyenduong b)
    {
        if (
    sosanh(a.x,b.x)==1)    return 1;
        else return 
    0;
    }
    bool operator>=(nguyenduong a,nguyenduong b)
    {
        if (
    sosanh(a.x,b.x)>=0)    return 1;
        else return 
    0;
    }
    bool operator<(nguyenduong a,nguyenduong b)
    {
        if (
    sosanh(a.x,b.x)==-1)    return 1;
        else return 
    0;    
    }
    bool operator<=(nguyenduong a,nguyenduong b)
    {
        if (
    sosanh(a.x,b.x)<=0)    return 1;
        else return 
    0;    
    }
    bool operator==(nguyenduong a,nguyenduong b)
    {
        if (
    sosanh(a.x,b.x)) return 0;
        else return 
    1;    
    }
    bool operator!=(nguyenduong a,nguyenduong b)
    {
        if (
    sosanh(a.x,b.x))    return 1;
        else return 
    0;    
    }





    void main(void)  
        {
            
    nguyenduong a,b;
            
    cout<<"Nhap vao 2 so nguyen lon : ";
            
    cin>>a>>b;
            
    cout<<"Tong 2 so la :"<<a+b;
            if (
    a>bcout<<a<<" > "<<b;
            
    // ok ?

            
    system("pause"); 
        } 
    Đã được chỉnh sửa lần cuối bởi langman : 20-03-2010 lúc 08:38 PM.
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  3. #3
    Ngày gia nhập
    03 2010
    Nơi ở
    ___Nghe _ An___
    Bài viết
    220

    neu ban tim so nguyen lon nhat
    thi minh co cach nay va cung dang co cai y dinh lam bai nay
    no nhu sau;/**/
    minh nhap taon bo so nguyen vao va sap xep chung theo day tang dan roi tu do gan mot bien max cho so lon nhat trong day do va dua ra ket qua
    nhung ma lam dc dieu do thi oc tuong tuong cung khong nho dau
    chu cban thanh cong

  4. #4
    Ngày gia nhập
    04 2010
    Nơi ở
    Hà Nội
    Bài viết
    138

    Trích dẫn Nguyên bản được gửi bởi thuan Xem bài viết
    --------------------------------------------------------------------------------

    Dùng mảng 1 chiểu để lưu trữ
    1. Viết 1 chương trình nhập vào 2 số nguyên lớn (có thể đến hàng trăm chữ số)
    2. Thực hiện phép toán trên 2 số đó:
    a.So sánh
    b.cộng
    c.trừ
    3.Thực hiện phép nhân,phép chia số nguyên lớn đối với số nguên hoặc số nguyên lớn đối với số nguyên lớn(bonus)
    Gợi ý:
    Nhập vào N1,N2 là 1 dãy kí tự char n1[300]
    Chuyển vào mảng số bằng cách-'0'
    N1 có 9 kí tự.N2 có 3 kí tự.Gọi chieudaimax là số phần tử của mảng có nhiều phần tử hơn.
    N1:123456789
    N2:123
    N1:

    n2:

    kq: +


    kq: n1 –n2


    kq: n2-n1



    Cộng: Ta sẽ cộng từng giá trị từ cuối mảng trở về trước. kết quả sẽ được lưu trong mảng kq. Mảng kq sẽ có max+1 phần tử. Và sẽ có biến nhớ để lưu giá trị của từng phép cộng của các phần tử.
    Trừ: Từ phép so sánh ta sẽ lấy phần tử lớn trừ phần tử nhỏ, nếu là trường hợp nhỏ trừ lớn sẽ xuất ra dấu – trước kết quả. Ta sẽ có biến nhớ để lưu có mượn hay không?
    Nhân: Để đơn giản ta có thể lặp đi lặp lại phép cộng nhiều lần. Ví dụ: a*3 = a+a+a
    Chia: Để đơn giản ta có thể dùng phép trừ.
    Ví dụ: 16/3
    Kiểm tra số 16 có lớn hơn 3 hay không? Nếu không à kq = 0
    3*1=3 < 16: tiếp tục lặp cho đến khi được tích >= số bị chia
    3*2=6
    3*3=9
    3*4=12
    3*5=15
    3*6=18
    18>16 à xuất 6-1 = 5
    Làm ơn làm dùm mình theo cách này bằng chương trình con nha
    Giúp đỡ mình chút nha tại mình học dỡ kĩ thuật lập trình lắm
    Cám ơn nhiều nha
    Lưu ý:nhập mảng ngẫu nhiên
    Thế giới thật rộng lớn

  5. #5
    Ngày gia nhập
    03 2011
    Nơi ở
    TP HCM Viet Nam
    Bài viết
    2

    các bạn viết trên C gì thế bạn nào có bài này mà viết trên C++ Free hay Visual C++ hoặc C++ studio thì pót lên cho mình xem với, mấy cái C khác đọc chả hiểu gì hết!

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Mặc định Xử lý tính toán với 2 số nguyên lớn có thể đến hàng trăm chữ số

    Đây là bài của tớ...hơi dài ^^

    file .exe tớ đính kèm phía dưới

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <malloc.h>
    4.  
    5. #define max 200 //Số lượng chữ số bạn có thể thêm hoặc giảm
    6.  
    7. short unsigned len(const char *);
    8. void copy(char *,const char *);
    9. void backcopy(char *,const char *);
    10. short unsigned startp(const char *);
    11. void createbuf(char *,char *,const char *,const char *);
    12. short int signal(const char *);
    13. void backset(char *);
    14. void setbuf(char *,short unsigned int stp=0,short unsigned int enp=max-1);
    15. short int decrease(char *);
    16. short int compare(const char *,const char *);
    17. short int menu(void);
    18. short int checkstr(char *);
    19. void getstr(char *,char *);
    20. void callF(char *,char *);
    21. short int add(const char *,const char *,char *);
    22. short int subtract(const char *,const char *,char *);
    23. short int multiply(const char *,const char *,char *);
    24. short int devide(const char *,const char *,char *,char *);
    25.  
    26. int main(void)
    27. {
    28.     char bnum1[max],bnum2[max];
    29.    callF(bnum1,bnum2);
    30.    return 0;
    31. }
    32. void callF(char *str1,char *str2)
    33. {
    34.     char result[max];
    35.    while (1)
    36.     switch(menu())
    37.     {
    38.         case '+':
    39.             printf("\nDoing : ADDITION\n\n");
    40.             getstr(str1,str2);
    41.             printf("\n\tValue 1: %s\n\tValue 2: %s",str1,str2);
    42.             add(str1,str2,result);
    43.             printf("\n\tResult : %s",result);
    44.             getch();
    45.             break;
    46.             case '-':
    47.             printf("\nDoing : SUBTRACTION\n\n");
    48.             getstr(str1,str2);
    49.             printf("\n\tValue 1: %s\n\tValue 2: %s",str1,str2);
    50.             subtract(str1,str2,result);
    51.             printf("\n\tResult : %s",result);
    52.             getch();
    53.             break;
    54.          case '*':
    55.             printf("\nDoing : MULTIPLICATION\n\n");
    56.             getstr(str1,str2);
    57.             printf("\n\tValue 1: %s\n\tValue 2: %s",str1,str2);
    58.             multiply(str1,str2,result);
    59.             printf("\n\tResult : %s",result);
    60.             getch();
    61.             break;
    62.          case '/':
    63.             printf("\nDoing : DIVISION\n\n");
    64.             getstr(str1,str2);
    65.             char mod[max];
    66.             printf("\n\tValue 1: %s\n\tValue 2: %s",str1,str2);
    67.             if (devide(str1,str2,result,mod)) printf("\n\tResult : %s + (%s/%s)",result,mod,str2);
    68.             else printf("\n\tResult : %s",result);
    69.             getch();
    70.             break;
    71.         case '0': return;
    72.         default: printf("\n\tOut of choices.");
    73.          getch();
    74.          continue;
    75.     }
    76. }
    77. short int menu(void)
    78. {
    79.     char i;
    80.    clrscr();
    81.     printf("\tPROGRAM : CACULATIONS WITH LARGE NUMBER\t\tWriten by Mr.Azure\n\n");
    82.    printf("\t+ Addition...\n\t- Subtraction...\n\t* Multiplication...\n\t/ Division...\n\t0 Exit...\n#:");
    83.    i=getch();
    84.     clrscr();
    85.    return i;
    86. }
    87. short int checkstr(char *str)
    88. {
    89.     if (str[0]=='+') for (short unsigned int i=1;i<len(str);i++) str[i]=str[i+1];
    90.     for (short unsigned int i=0;i<len(str);i++) if (str[i]!='-' && (str[i]<48 || str[i]>57)) return 0;
    91.    return 1;
    92. }
    93. void getstr(char *str1,char *str2)
    94. {
    95.    do
    96.    {
    97.     printf("\nInput the first number  : ");
    98.     gets(str1);
    99.       if (!checkstr(str1)) printf("\n\tEr...Try again!\n");
    100.    } while (!checkstr(str1));
    101.    do
    102.    {
    103.     printf("\nInput the second number : ");
    104.     gets(str2);
    105.       if (!checkstr(str2)) printf("\n\tEr...Try again!\n");
    106.    } while (!checkstr(str2));
    107.    return ;
    108. }
    109. short unsigned len(const char *string)
    110. {
    111.     short unsigned i=0;
    112.    while (string[i]!=0) i++;
    113.    return i;
    114. }
    115. void copy(char *copied,const char *coping)
    116. {
    117.     for (short unsigned i=0;i<=len(coping);i++) copied[i]=coping[i];
    118. }
    119. short unsigned startp(const char *string)
    120. {
    121.     for (short int i=0;i<len(string);i++) if (string[i]!=48) return i;
    122.    return (len(string)-1);
    123. }
    124. void createbuf(char *bufs1,char *bufs2,const char *str1,const char *str2)
    125. {
    126.    copy(bufs1,str1);
    127.    copy(bufs2,str2);
    128. }
    129. short int signal(const char *string)
    130. {
    131.     for (short unsigned int i=0;i<len(string);i++)
    132.         if (string[i]=='-') return -1;
    133.    return 0;
    134. }
    135. void backset(char *string)
    136. {
    137.     char buf[max];
    138.    setbuf(buf);
    139.    for (short int i=len(string);i>=0;i--) buf[max-len(string)+i-1]=string[i];
    140.    copy(string,buf);
    141. }
    142. void setbuf(char *string,short unsigned int stp,short unsigned int enp)
    143. {
    144.     for (;stp<enp;stp++) string[stp]='0';
    145.    string[enp]=0;
    146. }
    147. short int decrease(char *str)
    148. {
    149.     str[0]-=1;
    150.    if (str[0]==48)
    151.    {
    152.     str[0]=57;
    153.       str[len(str)-1]=0;
    154.    }
    155.    if (str[0]==49) return 0;
    156.    return 1;
    157. }
    158. short int compare(const char *str1,const char *str2)
    159. {
    160.     char result[max];
    161.    subtract(str1,str2,result);
    162.    if (signal(result)) return -1;
    163.    if (result[0]=='0' && result[1]==0) return 0;
    164.    return 1;
    165. }
    166. short int add(const char *str1,const char *str2,char *outstr)
    167. {
    168.     char bufs1[max],bufs2[max],bufr[max];
    169.     if (signal(str1)==-1 && signal(str2)==-1)
    170.    {
    171.       createbuf(bufs1,bufs2,str1+1,str2+1);
    172.       setbuf(bufr);
    173.       add(bufs1,bufs2,bufr);
    174.       bufr[startp(bufr)-1]='-';
    175.       copy(outstr,bufr+startp(bufr)-1);
    176.       return 0;
    177.    }
    178.    if (!signal(str1) && signal(str2)==-1)
    179.    {
    180.       createbuf(bufs1,bufs2,str1,str2+1);
    181.       setbuf(bufr);
    182.       subtract(bufs1,bufs2,bufr);
    183.       copy(outstr,bufr+startp(bufr));
    184.         return 0;
    185.    }
    186.    if (signal(str1)==-1 && !signal(str2))
    187.    {
    188.       createbuf(bufs1,bufs2,str2,str1+1);
    189.       setbuf(bufr);
    190.       subtract(bufs1,bufs2,bufr);
    191.       copy(outstr,bufr+startp(bufr));
    192.       return 0;
    193.    }
    194.    createbuf(bufs1,bufs2,str1,str2);
    195.    setbuf(bufr);
    196.    short unsigned longstr;
    197.    longstr=(len(str1)>len(str2)?len(str1):len(str2));
    198.    for (short int i=longstr-1,j=max-2;i>=0;i--,j--)
    199.    {
    200.     short int k1=((bufs1[len(bufs1)+i-longstr]>48 && bufs1[len(bufs1)+i-longstr]<=57 && longstr-len(bufs1)-i-1<0)?(bufs1[len(bufs1)+i-longstr]-48):0);
    201.     short int k2=((bufs2[len(bufs2)+i-longstr]>48 && bufs2[len(bufs2)+i-longstr]<=57 && longstr-len(bufs2)-i-1<0)?(bufs2[len(bufs2)+i-longstr]-48):0);
    202.       short int k=k1+k2+bufr[j]-48;
    203.       if (k>9)
    204.       {
    205.         bufr[j-1]=49;
    206.          k-=10;
    207.       }
    208.       bufr[j]=48+k;
    209.    }
    210.    copy(outstr,bufr+startp(bufr));
    211.    return 0;
    212. }
    213. short int subtract(const char *str1,const char *str2,char *outstr)
    214. {
    215.     char bufs1[max],bufs2[max],bufr[max];
    216.     if (!signal(str1) && signal(str2)==-1)
    217.    {
    218.       createbuf(bufs1,bufs2,str1,str2+1);
    219.       setbuf(bufr);
    220.       add(bufs1,bufs2,bufr);
    221.       copy(outstr,bufr+startp(bufr));
    222.       return 0;
    223.    }
    224.    if (signal(str1)==-1 && !signal(str2))
    225.    {
    226.       createbuf(bufs1,bufs2,str1+1,str2);
    227.       setbuf(bufr);
    228.       add(bufs1,bufs2,bufr);
    229.       bufr[startp(bufr)-1]='-';
    230.       copy(outstr,bufr+startp(bufr)-1);
    231.       return 0;
    232.    }
    233.    if (signal(str1)==-1 && signal(str2)==-1)
    234.    {
    235.       createbuf(bufs1,bufs2,str2+1,str1+1);
    236.       setbuf(bufr);
    237.       subtract(bufs1,bufs2,bufr);
    238.       copy(outstr,bufr+startp(bufr));
    239.       return 0;
    240.    }
    241.    createbuf(bufs1,bufs2,str1,str2);
    242.    setbuf(bufr);
    243.    short unsigned longstr;
    244.    longstr=(len(str1)>len(str2)?len(str1):len(str2));
    245.    for (short int i=longstr-1,j=max-2;i>=0;i--,j--)
    246.    {
    247.     short int k1=((bufs1[len(bufs1)+i-longstr]>48 && bufs1[len(bufs1)+i-longstr]<=57 && longstr-len(bufs1)-i-1<0)?(bufs1[len(bufs1)+i-longstr]-48):0);
    248.     short int k2=((bufs2[len(bufs2)+i-longstr]>48 && bufs2[len(bufs2)+i-longstr]<=57 && longstr-len(bufs2)-i-1<0)?(bufs2[len(bufs2)+i-longstr]-48):0);
    249.       short int k=k1-k2+signal(bufr);
    250.       if (k<0)
    251.       {
    252.         bufr[j-1]='-';
    253.          k+=10;
    254.       }
    255.       bufr[j]=48+k;
    256.    }
    257.    if (signal(bufr))
    258.    {
    259.     char *bbuf;
    260.       {
    261.         bbuf=(char*)malloc(max-startp(bufr));
    262.         bbuf[0]='1';
    263.          setbuf(bbuf,1,max-startp(bufr)-1);
    264.       }
    265.       subtract(bbuf,bufr+startp(bufr)+1,bufr);
    266.       free(bbuf);
    267.       backset(bufr);
    268.       bufr[startp(bufr)-1]='-';
    269.    }
    270.    copy(outstr,bufr+startp(bufr));
    271.    return 0;
    272. }
    273. short int multiply(const char *str1,const char *str2,char *outstr)
    274. {
    275.     char bufs1[max],bufs2[max],bufr[max];
    276.    if (signal(str1)==-1 && signal(str2)==-1)
    277.    {
    278.     createbuf(bufs1,bufs2,str1+1,str2+1);
    279.     setbuf(bufr);
    280.       multiply(bufs1,bufs2,bufr);
    281.       copy(outstr,bufr+startp(bufr));
    282.       return 0;
    283.    }
    284.    if (signal(str1) != signal(str2))
    285.    {
    286.     if (signal(str1) && !signal(str2)) createbuf(bufs1,bufs2,str1+1,str2);
    287.       if (!signal(str1) && signal(str2)) createbuf(bufs1,bufs2,str1,str2+1);
    288.     setbuf(bufr);
    289.       multiply(bufs1,bufs2,bufr);
    290.       bufr[startp(bufr)-1]='-';
    291.       copy(outstr,bufr+startp(bufr)-1);
    292.       return 0;
    293.    }
    294.    createbuf(bufs1,bufs2,str1,str2);
    295.    setbuf(bufr);
    296.    short unsigned shortstr=(len(str1)<len(str2)?len(str1):len(str2));
    297.    char **save;
    298.    {
    299.     save=(char**)malloc(shortstr*sizeof(char*));
    300.     for (short int i=0;i<shortstr;i++)
    301.       {
    302.         save[i]=(char*)malloc(max);
    303.          setbuf(save[i]);
    304.       }
    305.    }
    306.    for (short int i1=shortstr-1;i1>=0;i1--)
    307.    {
    308.     for (short int i2=len((len(str1)!=shortstr)?str1:str2)-1,j=max-2-shortstr+1+i1;i2>=0;i2--,j--)
    309.       {
    310.         short int k;
    311.         if (len(str1)<len(str2))
    312.             k=(bufs1[i1]-48)*(bufs2[i2]-48) + save[i1][j]-48;
    313.          else
    314.             k=(bufs2[i1]-48)*(bufs1[i2]-48) + save[i1][j]-48;
    315.          short int ex=-1;
    316.             while (k>=0)
    317.          {
    318.             ex++;
    319.             k-=10;
    320.          }
    321.          save[i1][j]=k+58;
    322.          save[i1][j-1]=(ex>0)?ex+48:48;
    323.       }
    324.       copy(save[i1],save[i1]+startp(save[i1]));
    325.    }
    326.    copy(bufr,save[0]);
    327.    for (short int i=1;i<shortstr;i++) add(bufr,save[i],bufr);
    328.    copy(outstr,bufr+startp(bufr));
    329.    for (short int i=0;i<shortstr;i++) free(save[i]);
    330.    free(save);
    331.    return 0;
    332. }
    333. short int devide(const char *str1,const char *str2,char *outstr1,char *outstr2)
    334. {
    335.     if (!compare(str2,"0"))
    336.    {
    337.     copy(outstr1,\0");
    338.     return 0;
    339.    }
    340.     char bufs1[max],bufs2[max],bufr[max]="0",exp[max]="1";
    341.    if (signal(str1)==-1 && signal(str2)==-1)
    342.    {
    343.     createbuf(bufs1,bufs2,str1+1,str2+1);
    344.       devide(bufs1,bufs2,bufr,outstr2);
    345.       copy(outstr1,bufr);
    346.       if (compare(outstr2,"0")) return 1;
    347.       return 0;
    348.    }
    349.    if (signal(str1) != signal(str2))
    350.    {
    351.     if (signal(str1) && !signal(str2)) createbuf(bufs1,bufs2,str1+1,str2);
    352.       if (!signal(str1) && signal(str2)) createbuf(bufs1,bufs2,str1,str2+1);
    353.       devide(bufs1,bufs2,bufr,outstr2);
    354.       backset(bufr);
    355.       bufr[startp(bufr)-1]='-';
    356.       copy(outstr1,bufr+startp(bufr));
    357.       if (compare(outstr2,"0")) return 1;
    358.       return 0;
    359.    }
    360.    createbuf(bufs1,bufs2,str1,str2);
    361.    short int runc=len(bufs1)-len(bufs2);
    362.    while ((runc>0)?runc:0)
    363.    {
    364.     char condition[max];
    365.       setbuf(exp,1,runc+2);
    366.       multiply(exp,bufs2,condition);
    367.  
    368.       while (compare(bufs1,condition)<0)
    369.       {
    370.         decrease(exp);
    371.         multiply(exp,bufs2,condition);
    372.       }
    373.       while (compare(bufs1,condition)>=0)
    374.       {
    375.          subtract(bufs1,condition,bufs1);
    376.          add(bufr,exp,bufr);
    377.       }
    378.       runc=len(bufs1)-len(bufs2);
    379.    }
    380.    while (compare(bufs1,bufs2)>=0)
    381.    {
    382.     add(bufr,"1",bufr);
    383.       subtract(bufs1,bufs2,bufs1);
    384.    }
    385.    copy(outstr1,bufr);
    386.    copy(outstr2,bufs1);
    387.    if (compare(outstr2,"0")) return 1;
    388.    return 0;
    389. }
    Attached Files Attached Files
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  7. #7
    Ngày gia nhập
    08 2011
    Nơi ở
    TPHCM quận Thủ Đức
    Bài viết
    48

    Trích dẫn Nguyên bản được gửi bởi thuan Xem bài viết
    --------------------------------------------------------------------------------

    Dùng mảng 1 chiểu để lưu trữ
    1. Viết 1 chương trình nhập vào 2 số nguyên lớn (có thể đến hàng trăm chữ số)
    2. Thực hiện phép toán trên 2 số đó:
    a.So sánh
    b.cộng
    c.trừ
    3.Thực hiện phép nhân,phép chia số nguyên lớn đối với số nguên hoặc số nguyên lớn đối với số nguyên lớn(bonus)
    Gợi ý:
    Nhập vào N1,N2 là 1 dãy kí tự char n1[300]
    Chuyển vào mảng số bằng cách-'0'
    N1 có 9 kí tự.N2 có 3 kí tự.Gọi chieudaimax là số phần tử của mảng có nhiều phần tử hơn.
    N1:123456789
    N2:123
    N1:

    n2:

    kq: +


    kq: n1 –n2


    kq: n2-n1



    Cộng: Ta sẽ cộng từng giá trị từ cuối mảng trở về trước. kết quả sẽ được lưu trong mảng kq. Mảng kq sẽ có max+1 phần tử. Và sẽ có biến nhớ để lưu giá trị của từng phép cộng của các phần tử.
    Trừ: Từ phép so sánh ta sẽ lấy phần tử lớn trừ phần tử nhỏ, nếu là trường hợp nhỏ trừ lớn sẽ xuất ra dấu – trước kết quả. Ta sẽ có biến nhớ để lưu có mượn hay không?
    Nhân: Để đơn giản ta có thể lặp đi lặp lại phép cộng nhiều lần. Ví dụ: a*3 = a+a+a
    Chia: Để đơn giản ta có thể dùng phép trừ.
    Ví dụ: 16/3
    Kiểm tra số 16 có lớn hơn 3 hay không? Nếu không à kq = 0
    3*1=3 < 16: tiếp tục lặp cho đến khi được tích >= số bị chia
    3*2=6
    3*3=9
    3*4=12
    3*5=15
    3*6=18
    18>16 à xuất 6-1 = 5
    Làm ơn làm dùm mình theo cách này bằng chương trình con nha
    Giúp đỡ mình chút nha tại mình học dỡ kĩ thuật lập trình lắm
    Cám ơn nhiều nha
    Lưu ý:nhập mảng ngẫu nhiên
    Mình vừa mới làm xong bài cộng với trừ hôm qua, đang làm bài nhân. Bạn muốn thuật toán hay là nguyên bài code mình sẽ post cho bạn.
    Đã được chỉnh sửa lần cuối bởi laksjd8979343 : 09-08-2011 lúc 07:35 PM.
    Kẻ nào bắt buộc nghe ai.
    Luôn luôn vẫn giữ ý sai của mình.

  8. #8
    Ngày gia nhập
    06 2013
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi laksjd8979343 Xem bài viết
    Mình vừa mới làm xong bài cộng với trừ hôm qua, đang làm bài nhân. Bạn muốn thuật toán hay là nguyên bài code mình sẽ post cho bạn.
    bạn cho mình xin thuật toán nhé cả code cũng được.thanks!

  9. #9
    Ngày gia nhập
    12 2012
    Nơi ở
    TIN5A - UNETI
    Bài viết
    167

    tính hai số nguyên lớn
    PHP Code:
    Cộng trừ bạn tính như bình thường;
    Nhân
       + 
    Đảo ngược hai chuỗi số
       
    Kí tự thứ k trong chuối tích bằng tổng của các tíchchuỗi số thứ nhất i chạy từ k về 0chuỗi thứ hai j chạy từ 0 đến kNếu tại i và j không nằm trong phạm vi của hai chuỗi số thì dừng tính tíchNếu tại i hoặc tại j là kí tự nằm ngoài phạm vi của chuỗi số thứ nhấtchuỗi số thứ hai thì bỏ qua lần tính này
    Chianếu số bị trừ lớn hơn số trừ cứ tiếp tục trừ đến khi nào thương nhỏ hơnmỗi lần trừ gán số bị trừ bằng thươngphần nguyên là số lần trừphàn dư là thương còn lại sau vòng lặp trên 

  10. #10
    Ngày gia nhập
    01 2013
    Bài viết
    1,479

    Trích dẫn Nguyên bản được gửi bởi ANHMATTROI Xem bài viết
    tính hai số nguyên lớn
    PHP Code:
    Cộng trừ bạn tính như bình thường;
    Nhân
       + 
    Đảo ngược hai chuỗi số
       
    Kí tự thứ k trong chuối tích bằng tổng của các tíchchuỗi số thứ nhất i chạy từ k về 0chuỗi thứ hai j chạy từ 0 đến kNếu tại i và j không nằm trong phạm vi của hai chuỗi số thì dừng tính tíchNếu tại i hoặc tại j là kí tự nằm ngoài phạm vi của chuỗi số thứ nhấtchuỗi số thứ hai thì bỏ qua lần tính này
    Chianếu số bị trừ lớn hơn số trừ cứ tiếp tục trừ đến khi nào thương nhỏ hơnmỗi lần trừ gán số bị trừ bằng thươngphần nguyên là số lần trừphàn dư là thương còn lại sau vòng lặp trên 
    Cái phép chia này fail nặng.

Các đề tài tương tự

  1. phân tích một số nguyên thành sô hàng đơn vị, chục, trăm,...(C++)
    Gửi bởi boykid1996 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 16-05-2013, 09:02 PM
  2. code bài toán cổ trăm trâu trăm cỏ trên C/C++. Kiểm tra giúp mình
    Gửi bởi tuanlt10 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 7
    Bài viết cuối: 26-12-2012, 09:39 AM
  3. Bài toán cổ Đàn trâu trăm con có mấy đáp án vậy?
    Gửi bởi muramasa trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 20-06-2011, 03:05 PM
  4. Lưu số có hàng trăm chữ số->vô hạn???
    Gửi bởi sieutanbinh1711 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 18
    Bài viết cuối: 17-05-2009, 11:08 AM
  5. 1 bài nữa về trăm trâu trăm cỏ:
    Gửi bởi Darkpower trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 04-10-2008, 12:39 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn