Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 8 của 8
  1. #1

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình nghĩ đơn giản nhất là dùng string
    ngày xưa hồi còn đi học cũng đã làm rồi nhưng hồi đó dùng pascal
    mình nghĩ vấn đề này cũng không quá khó
    khi nào có thời gian mình sẽ code cho bạn nha

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi dangthuan
    Để cộng được số có hơn 100 chữ số thì mình phải khai báo kiểu gì nhỉ[IMG]images/smilies/11.gif[/IMG]
    kiểu char chứ còn gì [IMG]images/smilies/biggrin.png[/IMG] cách cộng thì bạn search thử, cũng có vài bài ở trong 4rum, nhưng tốt hơn là tự nghĩ cách rồi đưa code lên đây sẽ có nhiều người mổ xẻ nó ra, vâỵ chắc tốt hơn [IMG]images/smilies/tongue.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình mới học C nên cũng chưa biết code ra sao

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    có ai giúp mình với

  6. #6
    dùng thuật toán cộng số lớn ấy

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn có thể làm giống như cộng hai số từ lúc bạn học lớp 3 đó.
    Ý tưởng của mình là bạn có thể cộng giống như học sinh tiểu học làm đó
    Đây là source mà mình có code cả cộng trừ nhân luôn đó, còn phần chia 2 số, nó hơi phức tạp mình chưa biết, có gì chúng ta cùng nhau thảo luận thêm.
    Mã:
    #include <stdio.h>
    #include <string.h>
    #include "iostream"
    
    #define MAX 1000
    
    typedef struct 
    {
        int ChuSo[MAX];
        int SoChuSo;
        bool SoAm;              // bang true neu la so am
    } SoNguyen;
    
    typedef struct 
    {
        int ChuSo[MAX];
        int SoChuSo;
    } SoDuong;
    
    void XuatSo(SoNguyen x)
    {
    	int i;
        if (x.SoAm) printf("-"); 
        for(i= x.SoChuSo-1; i>= 0; i--) 
            printf("%d", x.ChuSo[i]);   
            printf("
    ");
    }
    
    SoNguyen NhapSo(char* s)
    {
         SoNguyen x;
         x.SoAm = false;
         int k = 0;
         if (s[0]== '-') 
         { 
             x.SoAm = true;
             k = 1;                         // neu la so am thi ky tu 1 moi la so
         }
    	 int i;     
         int len = strlen(s);
         for(i= len- 1; i>=k; i--)
             x.ChuSo[len- i- 1] = s[i] - 48;                      
         x.SoChuSo = len - k;               
         return x;      
    }
    
    
    SoDuong ABS(SoNguyen x)                       // lay tri tuyet doi la so duong
    {
    	int i;
        SoDuong a;
        a.SoChuSo = x.SoChuSo;
        for(i= 0; i< a.SoChuSo; i++)
            a.ChuSo[i] = x.ChuSo[i];        
        return a;
    }
    
    SoNguyen DuongToNguyen(SoDuong a)             // doi tu so duong sang so nguyen
    {
        SoNguyen x;
        x.SoAm = false;
        x.SoChuSo = a.SoChuSo;
        int i;
        for(i= 0; i< x.SoChuSo; i++)
            x.ChuSo[i] = a.ChuSo[i];        
        return x;
    }
    
    // neu a< b: return -1
    //     a= b: return 0
    //     a> b: return 1
    
    int SoSanh(SoDuong a, SoDuong b)              
    {
        if (a.SoChuSo < b.SoChuSo) return -1;
        else     
            if (a.SoChuSo > b.SoChuSo) return 1;
            else
            {
                int i = a.SoChuSo - 1;            
                while (i>=0 && a.ChuSo[i]== b.ChuSo[i]) i--;                  
                if (i== -1) return 0;
                else
                    if (a.ChuSo[i] < b.ChuSo[i]) return -1;
                    else return 1;
            }
    }
    
    SoDuong CongTay(SoDuong a, SoDuong b)               // thuc hien phep cong tay
    {
       SoDuong c;
       int nho = 0, kq;
       int max; 
       int i;
       if (a.SoChuSo > b.SoChuSo)
       {
          max = a.SoChuSo;
          for(i= b.SoChuSo; i<max; i++)
                  b.ChuSo[i] = 0;
       }
       else
       {
          max = b.SoChuSo;       
          for(i= a.SoChuSo; i<max; i++)
                  a.ChuSo[i] = 0;
       }
       for(i = 0; i< max; i++)
       {
           kq = a.ChuSo[i]+ b.ChuSo[i] + nho;
           c.ChuSo[i] = kq % 10;
           nho = kq / 10;
       }   
       if (nho== 0)               
           c.SoChuSo = max;
       else
       {
           c.SoChuSo = max+1;
           c.ChuSo[max] = nho;
       }
       return c;     
    }
    
    // a phai lon hon b
    SoDuong TruTay(SoDuong a, SoDuong b)                     // thuc hien phep tru tay
    {
       SoDuong c;
       int muon = 0, kq;
       int vitricuoi = 0;
       int i;
       for(i= b.SoChuSo; i< a.SoChuSo; i++)
             b.ChuSo[i] = 0;
     
       for(i = 0; i< a.SoChuSo; i++)
       {
           kq = a.ChuSo[i] - (b.ChuSo[i] + muon);           
           if (kq<0) 
           { 
               kq = kq + 10;
               muon = 1;
           }
           else
               muon = 0;   
           c.ChuSo[i] = kq;
           if (kq!= 0) vitricuoi = i;                      // vi du 1234 - 1200 = 0034 thi vi tri cuoi se nho lai vi tri so 3
       }   
       c.SoChuSo = vitricuoi + 1;
       return c;     
    }
    
    SoDuong NhanTay1Den9(SoDuong a, int n)                     // thuc hien phep nhan tay voi so tu 1 --> 9
    {
        SoDuong b;
        int nho = 0, kq;
        int i;
        for(i = 0; i< a.SoChuSo; i++)
        {
            kq = a.ChuSo[i]* n + nho;
            b.ChuSo[i] = kq % 10;
            nho = kq / 10;
        }
        if (nho == 0)
           b.SoChuSo = a.SoChuSo;
        else
        {
            b.ChuSo[a.SoChuSo] = nho;
            b.SoChuSo = a.SoChuSo + 1; 
        }
        return b;    
    }
    
    SoDuong NhanTay10(SoDuong a)                     // thuc hien phep nhan tay voi 10
    {
        SoDuong b;
        b.ChuSo[0] = 0;
        int i;
        for(i = 0; i< a.SoChuSo; i++)
            b.ChuSo[i+1] = a.ChuSo[i];
        b.SoChuSo = a.SoChuSo + 1;
        return b;
    }
    
    SoDuong NhanTay(SoDuong a, SoDuong b)                     // thuc hien phep nhan tay
    {
       SoDuong c;
       c.ChuSo[0]= 0;
       c.SoChuSo = 1;
       int i,j;
       for(i=0; i< b.SoChuSo; i++)
          if (b.ChuSo[i]!= 0)
          {
              SoDuong k = NhanTay1Den9(a, b.ChuSo[i]);
              for(j=0; j< i; j++)
                 k = NhanTay10(k); 
              c = CongTay(c, k);           
          }
       return c;     
    }
    
    SoNguyen Cong(SoNguyen x, SoNguyen y)
    {
        SoDuong a = ABS(x);
        SoDuong b = ABS(y);
        SoNguyen z;  
        SoDuong c;
             
        if (x.SoAm == y.SoAm)              // neu x va y cung duong hay am
        {
           c = CongTay(a, b);
           z = DuongToNguyen(c);
           z.SoAm = x.SoAm;       
        }
        else
        {
           int ss = SoSanh(a, b);
           if (ss == -1)                      // a < b                                    
              c = TruTay(b, a);
           else
              c = TruTay(a, b);
           z = DuongToNguyen(c);
              
           if (x.SoAm)                     // neu x am y duong
           {
               if (ss== -1)            
                  z.SoAm = false;          // neu x am y duong va |x|<|y| thi ket qua la so duong
               else
                  z.SoAm = true; 
           }
           else                           // neu x duong y am
           {
               if (ss== -1)            
                  z.SoAm = true;          // neu x duong y am va |x|<|y| thi ket qua la so am
               else
                  z.SoAm = false; 
           }
        }       
        return z;
    }
    
    SoNguyen Tru(SoNguyen x, SoNguyen y)
    {
        if (y.SoAm) y.SoAm = false;
        else y.SoAm = true;
        return Cong(x, y);
    }
    
    SoNguyen Nhan(SoNguyen x, SoNguyen y)
    {
        SoDuong a = ABS(x);
        SoDuong b = ABS(y);
        SoNguyen z;  
        SoDuong c;
        
        c = NhanTay(a, b);
        z = DuongToNguyen(c);
        if (x.SoAm== y.SoAm)             // nhan 2 so cung dau ket qua la duong
           z.SoAm = false;
        else
           z.SoAm = true; 
        return z;
    }
    
    int main()
    {
         SoNguyen x, y, z;     
         char s[MAX];
         //printf("Nhap x: "); 
    	 gets(s);
         x = NhapSo(s);
         //printf("Nhap y: "); 
    	 gets(s);
         y = NhapSo(s);
         
         
         printf("Tong: ");
         z = Cong(x, y);
         //printf("
    x+y = ");
         XuatSo(z);
         
         printf("Hieu: ");          
         z = Tru(x, y);
         //printf("
    x-y = ");
         XuatSo(z);
         
         
         printf("Tich: ");
         z = Nhan(x, y);
         //printf("
    x*y = ");
         XuatSo(z);
         
         getchar();
         return 0;
    }
    Chúc may mắn.

  8. #8
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    bạn nên tìm hiểu cách người ta mở rộng từ số 16 bít lên số 32 bít, (hình như trong sách hợp ngữ thì phải), áp dụng tương tự vào bài của bạn.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •