Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Cộng Trừ Nhân Chia với số nguyên lớn

  1. #1
    Ngày gia nhập
    03 2011
    Nơi ở
    Bình Dương, Hồ Chí Minh
    Bài viết
    392

    Mặc định Cộng Trừ Nhân Chia với số nguyên lớn

    Tiêu đề đã nói rõ nội dung, còn đây là code:
    C++ Code:
    1. #include <iostream>
    2. #include <string.h>
    3. using namespace std;
    4. #define MAXLEN 1000
    5.  
    6. struct SNL
    7. {
    8.     char sign;//dấu, nếu số âm thì sign=-1
    9.     char len;//chiều dài
    10.     char num[MAXLEN];//lưu các chữ số
    11. };
    12.  
    13. void initSNL(SNL &n);//Khởi tạo số nguyên lớn
    14. void str2snl(char *str, SNL &n);//Chuyển một chuỗi kí tự thành số nguyên lớn
    15. void scanSNL(SNL &n);//Đọc số nguyên lớn từ bàn phím
    16. void printSNL(SNL &n);//In số nguyên lớn ra màn hình
    17. int cmpu(SNL &a, SNL &b);//So sánh 2 số nguyên lớn không xét dấu
    18. int cmp(SNL &a, SNL &b);//So sánh 2 số nguyên lớn, nếu a>b trả về 1, a=b trả về 0, a<b trả về -1
    19. void addu(SNL &s, SNL &a, SNL &b);//Cộng không xét dấu
    20. void add(SNL &s, SNL &a, SNL &b);//Cộng có xét dấu
    21. void subu(SNL &s, SNL &a, SNL &b);//Trừ không xét dấu
    22. void sub(SNL &s, SNL &a, SNL &b);//Trừ có xét dấu
    23. void mul(SNL &r, SNL &a, SNL &b);//Nhân hai số nguyên lớn
    24. void div(SNL &r, SNL a, SNL b);//Phép chia số nguyên lớn
    25.  
    26. void InitSNL(SNL &n)
    27. {
    28.     for (int i=0; i<MAXLEN; i++) n.num[i]=0;
    29.     n.len=0;
    30.     n.sign=1;
    31. }
    32. void str2snl(char *str, SNL &n)
    33. {
    34.     int i;
    35.     if (str[0]=='-')
    36.     {
    37.         n.sign=-1;
    38.         str++; //bỏ qua kí tự đầu tiên
    39.     }
    40.     else
    41.         n.sign=1;
    42.  
    43.     n.len=strlen(str);//Chiều dài (số chữ số) của số nguyên lớn
    44.  
    45.     for (i=0; i<n.len; i++)
    46.         n.num[i]=str[n.len-i-1]-'0';//Chuyển từng kí tự thành số
    47. }
    48.  
    49. int cmpu(SNL &a, SNL &b)
    50. {
    51.  
    52.     if (a.len>b.len)//Số nào dài hơn thì số đó lớn hơn
    53.         return 1;
    54.     else if (a.len<b.len)
    55.         return -1;
    56.     else//Trường hợp chiều dài 2 số bằng nhau
    57.     {
    58.         int len=a.len-1;
    59.         while (len>=0)
    60.         {
    61.             //So sánh từ chữ số
    62.             if (a.num[len]>b.num[len])
    63.                 return 1;
    64.             else if (a.num[len]<b.num[len])
    65.                 return -1;
    66.             else
    67.                 len--;
    68.         }
    69.     }
    70.     return 0;
    71. }
    72.  
    73. int cmp(SNL &a, SNL &b)
    74. {
    75.     if (a.sign * b.sign<0) return a.sign;
    76.     return a.sign * cmpu(a,b);
    77. }
    78.  
    79. void scanSNL(SNL &n)//Đọc SNL từ bàn phím
    80. {
    81.     char *t=new char[MAXLEN];
    82.     cin>>t;
    83.     str2snl(t,n);
    84.     delete []t;
    85. }
    86.  
    87. void printSNL(SNL &n)
    88. {
    89.     if (n.sign<0) cout<<"-";
    90.     for (int i=n.len-1; i>=0; i--) cout<<(int)n.num[i];
    91. }
    92.  
    93. void addu(SNL &s, SNL &a, SNL &b)
    94. {
    95.     InitSNL(s);
    96.     s.len=a.len>b.len?a.len:b.len;
    97.     char m=0;//biến nhớ
    98.     for (int i=0; i<s.len; i++)
    99.     {
    100.         s.num[i]=a.num[i]+b.num[i]+m;
    101.         if (s.num[i]>9)
    102.         {
    103.             s.num[i] -= 10;
    104.             m=1;
    105.         }
    106.         else
    107.             m=0;
    108.     }
    109.     if (m)
    110.     {
    111.         s.num[s.len]=1;
    112.         s.len++;
    113.     }
    114. }
    115.  
    116. void add(SNL &s, SNL &a, SNL &b)
    117. {
    118.     if (a.sign*b.sign>0)//Nếu a và b cùng dấu
    119.     {
    120.         addu(s,a,b);
    121.         s.sign=a.sign;//Dấu của s cũng là dấu của a hoặc b
    122.     }
    123.     else
    124.     {
    125.         int t=cmpu(a,b);
    126.         if (t==1)
    127.         {
    128.             subu(s,a,b);
    129.             s.sign=a.sign;
    130.         }
    131.         else if (t==-1)
    132.         {
    133.             subu(s,b,a);
    134.             s.sign=b.sign;
    135.         }
    136.         else
    137.             InitSNL(s);
    138.  
    139.     }
    140. }
    141.  
    142. void subu(SNL &r, SNL &a, SNL &b)
    143. {
    144.     InitSNL(r);
    145.     r.len=a.len>b.len?a.len:b.len;
    146.     int m=0;
    147.     for (int i=0; i<r.len; i++)
    148.     {
    149.         if (a.num[i]<b.num[i]+m)
    150.         {
    151.             r.num[i]=10+a.num[i]-b.num[i]-m;
    152.             m=1;
    153.         }
    154.         else
    155.         {
    156.             r.num[i]=a.num[i]-b.num[i]-m;
    157.             m=0;
    158.         }
    159.     }
    160.     while (r.num[r.len-1]==0) r.len--;
    161. }
    162.  
    163. void sub(SNL &r, SNL &a, SNL &b)
    164. {
    165.     b.sign=-b.sign;
    166.     add(r,a,b);
    167.     b.sign=-b.sign;
    168. }
    169.  
    170. void mul(SNL &r, SNL &a, SNL &b)
    171. {
    172.     InitSNL(r);
    173.     for (int i=0; i<b.len; i++)
    174.         for (int j=0; j<b.num[i]; j++)
    175.             for (int k=0; k<a.len; k++)
    176.             {
    177.                 r.num[k+i] += a.num[k];
    178.                 if (r.num[k+i]>9)
    179.                 {
    180.                     r.num[k+i] -= 10;
    181.                     r.num[k+i+1]++;
    182.                 }
    183.             }
    184.             r.len=a.len+b.len;
    185.             while (r.num[r.len-1]==0) r.len--;
    186.             r.sign=a.sign*b.sign;
    187. }
    188.  
    189. void div(SNL &r, SNL a, SNL b)
    190. {
    191.     InitSNL(r);
    192.     r.len=a.len-b.len+1;
    193.     if (a.len>=b.len)
    194.     {
    195.         int blen=b.len;
    196.         int i;
    197.         if (a.len>b.len)
    198.         {
    199.             i=a.len-1;
    200.             int x=a.len-b.len;
    201.             while (i>=0)
    202.             {
    203.                 if (i>=x)
    204.                     b.num[i]=b.num[i-x];
    205.                 else
    206.                     b.num[i]=0;
    207.                 i--;
    208.             }
    209.         }
    210.         b.len=a.len;
    211.         SNL d;
    212.         i=1;
    213.         while (b.len>=blen)
    214.         {
    215.             while (cmpu(a,b)>-1)
    216.             {
    217.                 subu(d,a,b);
    218.                 r.num[r.len-i]++;
    219.                 a=d;
    220.             }
    221.             b.len--;
    222.             i++;
    223.             for (int k=0; k<b.len; k++) b.num[k]=b.num[k+1];
    224.             b.num[b.len]=0;
    225.         }
    226.         while (r.num[r.len-1]==0) r.len--;
    227.     }
    228.     r.sign=a.sign*b.sign;
    229. }
    230.  
    231. int main()
    232. {
    233.     SNL a,b,c;
    234.     InitSNL(a);
    235.     InitSNL(b);
    236.     InitSNL(c);
    237.  
    238.     cout<<"Nhap so nguyen a: "; scanSNL(a);
    239.     cout<<"Nhap so nguyen b: "; scanSNL(b);
    240.  
    241.     add(c,a,b);
    242.     cout<<endl<<"a + b = "; printSNL(c);
    243.     sub(c,a,b);
    244.     cout<<endl<<"a - b = "; printSNL(c);
    245.  
    246.     mul(c,a,b);
    247.     cout<<endl<<"a * b = "; printSNL(c);
    248.  
    249.     div(c,a,b);
    250.     cout<<endl<<"a / b = "; printSNL(c);
    251.  
    252.     cout<<endl;
    253.     system("pause");
    254.     return 0;
    255. }

    Nguồn:
    Ref Link Code:
    Nếu không vào được link trên thì các bạn down về:
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi vitbau1412 : 22-10-2011 lúc 10:31 AM.

  2. #2
    Ngày gia nhập
    12 2015
    Bài viết
    1

    anh ơi code này bị sai phần Chia rồi !
    các trương hợp 2 số cùng dương , 1 âm và 1 dương thì đúng
    nhưng trường hợp 2 số cùng âm phép chia sai mất rồi!

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

  1. Trả lời: 4
    Bài viết cuối: 09-02-2012, 10:42 PM
  2. Kỹ thuật C++ Lời giải về Chuỗi Ký tự,mảng số nguyên 1 chiều,mảng 2 chiều,tạo Menu
    Gửi bởi xuanngoc trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 15-10-2011, 01:54 AM
  3. Lời giải bài tập: Chuỗi Ký tự, mảng số nguyên 1 chiều, mảng 2 chiều, tạo Menu
    Gửi bởi xuanngoc trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 15-10-2011, 01:17 AM
  4. tìm số nguyên tố có trong mảng 2 chiều, tính tổng các số nguyên tố đó??
    Gửi bởi lesliuton01 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 08-06-2010, 10:21 AM
  5. mảng 1 chiều | Kiểm tra mảng có chứa số nguyên tố???
    Gửi bởi namekct 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: 11-01-2010, 09:46 PM

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