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

Đề tài: Giúp tìm CODE tích và thương 2 số vô cùng lớn! (kiểu int)

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

    Mặc định Giúp tìm CODE tích và thương 2 số vô cùng lớn! (kiểu int)

    Ai có thể giúp tôi giải bài tập!

    Nhập vào 2 số nguyên dương vô cùng lớn!
    Tính tích và thương của 2 số đó!
    VD:
    số thứ nhất: 74823374873284728734
    số thứ hai: 8472342342345435
    Tính tích và thương của 2 số đó ! (với thương thì số thứ 1 chia thứ 2)

    (Bài tập này chắc chắn là dùng mảng và tui đã làm được cộng và trừ nhưng bị đứng ý tưởng ở nhân chia, bác nào bik thì gợi mở cho tui ý tượng với hoặc với code của bác cũng đc!!!)
    Thanks nhiều!

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Hồi Tiểu học bạn nhân chia kiểu gì thì bây giờ thuật toán cũng giống như vậy.

  3. #3
    Ngày gia nhập
    11 2011
    Bài viết
    8

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Hồi Tiểu học bạn nhân chia kiểu gì thì bây giờ thuật toán cũng giống như vậy.
    Trả lời như bạn thì mình khỏi cần hỏi chi cho mất thời gian nhé! Bạn trả lời thì trả lời chứ đừng spam!
    Có nói gì không phải thì bỏ qua! Thanks!

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

    Chương trình này tớ viết không biết lỗi còn không...bác xem thử nhé......thuật toán hơi tệ ^^
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <malloc.h>
    4.  
    5. #define max 200
    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. }
    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ẻ đó.

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi duynguyen_a3win Xem bài viết
    Trả lời như bạn thì mình khỏi cần hỏi chi cho mất thời gian nhé! Bạn trả lời thì trả lời chứ đừng spam!
    Có nói gì không phải thì bỏ qua! Thanks!
    Không phải bạn đang hỏi về ý tưởng à ?
    Ý tưởng của tôi là nhân giống hệt như cách nhân đã học hồi tiểu học: nhân từng chữ số của 1 số với số còn lại, cộng với nhớ của phép nhân trước ...
    Mà box này không tính bài nên muốn spam ở đây cũng khó đấy.

  6. #6
    Ngày gia nhập
    09 2011
    Nơi ở
    Huế
    Bài viết
    0

    Mặc định Giúp tìm CODE tích và thương 2 số vô cùng lớn! (kiểu int)

    nhìn cái code của bác kia em hoa mắt @@

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

    nhìn đoạn code xong màk mún đi bịnh viện truyền nước biển rồi! mình cũng đang làm bài này. Mà sao thấy bác đó viết code j chóng mặt lun vậy trời!

  8. #8
    Ngày gia nhập
    11 2011
    Bài viết
    8

    đồng ý lun! Mình mới học mà không nghĩ thầy sẽ cho ra bài tập mà code dài như vậy đâu! Dù sao cũng cảm ơn bạn nhưng có lẻ cách này khôn gkha3 quan lắm! Cảm ơn bạn nhé!

  9. #9
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Trích dẫn Nguyên bản được gửi bởi duynguyen_a3win Xem bài viết
    đồng ý lun! Mình mới học mà không nghĩ thầy sẽ cho ra bài tập mà code dài như vậy đâu! Dù sao cũng cảm ơn bạn nhưng có lẻ cách này khôn gkha3 quan lắm! Cảm ơn bạn nhé!
    Nghĩ vậy nhiều khi lầm đó bạn .
    Code dài hay ngắn là tùy người viết.
    Bạn ko muốn dài thì cứ đọc, hiểu ý tưởng. Từ đó muốn code thế nào lại cho ngắn gọn là tùy bạn
    Cái gì hay thì cứ tiếp thu đi. Ít nhất người khác bày code cho mình thì cũng nên đọc đi, đọc cũng là cách học đấy.
    Đừng lười và nói cay đắng như vậy.
    Mất lòng người ta rồi lần sau ai chỉ bài cho bạn nữa ?
    Um Mani Padme Hum...!!

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

  1. Trả lời: 1
    Bài viết cuối: 11-05-2012, 11:44 AM
  2. Code các hàm sắp xếp sử dụng template con trỏ hàm viết bằng C++. Giúp mình kiểm tra code
    Gửi bởi satthuvotinh trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 16-05-2011, 12:32 PM
  3. Code in ra số nguyên tố và số chính phương của một dãy trên C. Giúp mình kiểm tra code?
    Gửi bởi lavender 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: 07-06-2009, 01:52 PM
  4. Code quản lý sinh viên bằng danh sách lối vòng. Giúp mình thay đổi code kế thừa?
    Gửi bởi caocanha trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 04-05-2009, 03:39 PM
  5. Code tính tích hai ma trận k cùng cấp ? xem giúp mình với
    Gửi bởi rong3sao trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 2
    Bài viết cuối: 10-04-2009, 06:21 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