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ố 15 kết quả

Đề tài: Cách tính 3^10.000 trong C như thế nào?

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

    Post Cách tính 3^10.000 trong C như thế nào?

    Đây là 1 bài tập trên lớp thầy mình ra...các bạn có thể giúp mình cách tính 3^10.000 không?
    Thanks các bạn nhiều!

  2. #2
    Ngày gia nhập
    05 2011
    Nơi ở
    TP HCM
    Bài viết
    27

    Mình nghĩ bạn có thể dùng số nguyên lớn để giải bài toán này: dùng mảng để chưa từng kí số !

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

    Trích dẫn Nguyên bản được gửi bởi mini_bestboy Xem bài viết
    Mình nghĩ bạn có thể dùng số nguyên lớn để giải bài toán này: dùng mảng để chưa từng kí số !
    Bạn có thể nói rõ cho mình được không? Thanks bạn nhiều!

  4. #4
    Ngày gia nhập
    05 2011
    Nơi ở
    TP HCM
    Bài viết
    27

    Bạn tạo 1 mảng. Mỗi phần tử của mảng sẽ chứa 1 chữ số của con số kết quả bài toán !
    Ví như số 123456 sẽ được lưu vào mảng 6 phần tử,các ptử lần lượt là 1 2 3 4 5 6

    Tạo 1 hàm thực hiện phép nhân trên từng phần tử như bạn nhân có nhớ hồi cấp 1 ý ! Nhân từng số, có nhớ, cộng vào số tiếp theo ...

    Sau đó cho 1 vòng lặp chạy 10000 lần, mỗi lần bạn sẽ dùng hàm đó, nhân mảng của bạn với số 3 !

    Không biết cách này tốt chưa vì số tạo ra khá lớn, sẽ chạy lâu (dự đoán chắc <5000 chữ số)

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    59

    bạn xem thử code này, mình mới tập code nên cứ có bài là code thử cho biết:
    có một vấn đề hơi chán là code này chạy kết quả 3 mũ 10000 mất đến 8.8 s :(
    C Code:
    1. #include <stdio.h>
    2. #define MAX 5000
    3. //Prototype
    4.  
    5. void LuyThua(int a[MAX], int coso, int somu);
    6. void InKQ(int a[MAX]);
    7.  
    8. main()
    9. {
    10.     int coso, somu;
    11.     int a[MAX];
    12.    
    13.     printf("Nhap co so (mot chu so): ");
    14.     scanf("%d", &coso);
    15.     printf("Nhap so mu: ");
    16.     scanf("%d", &somu);
    17.     LuyThua(a, coso, somu);
    18.     printf("KQ cua %d mu %d la: \n", coso, somu);
    19.     InKQ(a);
    20.    
    21.    
    22. }
    23.  
    24. void LuyThua(int a[MAX], int coso, int somu)
    25. {
    26.     int i, nho = 0, tam;
    27.     //khoi tao
    28.     a[0] = 1;
    29.     for(i = 1;i < MAX;i++)
    30.     {
    31.         a[i] = 0;
    32.     }
    33.    
    34.     //tinh
    35.     for(;somu > 0; somu--)
    36.     {      
    37.         for(i = 0; i < MAX; i++)
    38.         {
    39.             tam = (a[i]*coso + nho);
    40.             a[i] = tam%10;
    41.             nho = tam/10;
    42.         }
    43.     }
    44. }
    45.  
    46. void InKQ(int a[MAX])
    47. {
    48.     int i, flag = 0;
    49.    
    50.     for(i = MAX - 1; i >= 0;i-- )
    51.     {
    52.         if (a[i + 1] == 0 && a[i] != 0)
    53.         {
    54.             flag = 1;
    55.         }
    56.        
    57.         if(flag == 1)
    58.         {
    59.             printf("%d", a[i]);
    60.         }
    61.     }
    62.     printf("\n");
    63. }

  6. #6
    Ngày gia nhập
    05 2011
    Nơi ở
    TP HCM
    Bài viết
    27

    Mặc định Cách tính 3^10.000 trong C như thế nào?

    @maitan_10000: Đoạn code bạn chạy lâu có lẽ do dư phần lúc tính, bạn cho i chạy 0->MAX mặc dù ban đầu thì mảng chỉ có thật sự 1,2 chữ số thôi, do đó chạy khá là lâu ! Nên cải tiến lại bằng cách kết hợp lưu số chữ số của kết quả (tức số phần tử mảng A), như thế ta cho i chạy -> numOfArray thôi, sẽ nhanh hơn đó


    Một cách cải tiến hơn nữa, bạn có thể dùng 1 mảng kiểu long để chứa số, vì 1 biến long lưu được 1 số đến 9 chữ số. Và mỗi lần duyệt bạn vẫn nhân từng số cho số mũ, nếu lớn hơn 9 chữ số thì chuyển phần nguyên kết quả qua phần tử tiếp theo ! Do đó mảng chỉ cần khoảng [5000/9] phần tử, và khi lũy thừa cũng giảm được đến 9 lần tính toán so với cách trên nhỉ ^^

    Dù sao vẫn nghĩ thầy bạn chỉ yêu cầu thuật toán thôi, chứ kết quả đến cả ngàn chữ số thì kiểm tra mệt đấy !

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

    Hì, thanks mọi người rất nhiều!

  8. #8
    Ngày gia nhập
    11 2010
    Nơi ở
    Black Hole
    Bài viết
    824

    C Code:
    1. #include<stdio.h>
    2. #include<stdlib.h>
    3.  
    4. #define SIZE 1000000
    5.  
    6. int main(int argc,char *argv[]){
    7.   int array[SIZE];
    8.   int i=1;
    9.   int j=SIZE-1;
    10.   array[SIZE-1]=1;
    11.   int l;
    12.  
    13.   for(l=0;l<SIZE-1;l++)
    14.     array[l]=0;
    15.  
    16.   while (i<=atoi(argv[1])) {
    17.     int k=SIZE-1;
    18.     int sup=0;  
    19.  
    20.     while(k>=(j-1)){
    21.       int temp=(sup+array[k]*2) %10;
    22.       sup=(sup+array[k]*2)/10;
    23.       array[k]=temp;
    24.       k--;
    25.     }
    26.     if(array[j-1]!=0)
    27.       j=j-1;
    28.     i++;
    29.   }
    30.  
    31.   printf("ket qua cua 2^%d :    ",atoi(argv[1]));
    32.   for(l=j;l<SIZE;l++)
    33.     printf("%d",array[l]);
    34.   return 0;
    35. }

    dựa vào bài này viết bài của bạn nhé
    Come as guest...... stay as family......... because we're smiling together.

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

    Thuật toán chưa tối ưu...chờ đến 45s ~~
    C Code:
    1. #include <stdio.h>
    2. #define max 10000
    3. #define val 2000
    4.  
    5. short unsigned int end(const unsigned int a[])
    6. {
    7.    short unsigned int i=0;
    8.    while (a[i++]==0);
    9.    return i-1;
    10. }
    11.  
    12. int main(void)
    13. {
    14.    unsigned int luu[max];
    15.    short unsigned int m;
    16.  
    17.    for (short unsigned int i=0;i<max;i++) (luu[i]=0);
    18.    luu[max-1]=1;
    19.  
    20.    for (short unsigned int i=1;i<=val;i++)
    21.    {
    22.       m=max-1;
    23.       short unsigned int nho=0;
    24.       while (m>=end(luu) || nho>0)
    25.       {
    26.          luu[m]*=729;
    27.          luu[m]+=nho;
    28.          nho=luu[m]/10;
    29.          luu[m]%=10;
    30.          m--;
    31.       }
    32.    }
    33.  
    34.    for (short unsigned int i=end(luu);i<max;i++) printf("%u",luu[i]);
    35.    scanf("%*c");
    36.    return 0;
    37. }

    Nguồn VN-EASY.COM
    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ẻ đó.

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

    Thanks mọi người nhiều...nhưng bạn nào chạy ra rùi có thể cho mình kết quả được không? Mình ngàn lần cảm ơn nhiều!
    Đã được chỉnh sửa lần cuối bởi Shanks : 10-08-2011 lúc 11:33 AM.

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

  1. Làm Chữ chạy trên form C# như thẻ <marquee> trong HTML thế nào?
    Gửi bởi magnet241 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 05-04-2012, 11:55 AM
  2. In thẻ,hóa đơn từ các textbox,combobox,datetimepicker trong form C# như thế nào?
    Gửi bởi snoit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-04-2012, 03:13 PM
  3. Game Tạo Form trong suốt trong C# tựa game Thần Võ như thế nào?
    Gửi bởi tocvang_pro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 21-09-2011, 04:21 PM
  4. Sử lí như thế nào khi nhập rất chậm trong trình xoạn thảo trong devC
    Gửi bởi toansvcn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 23-05-2011, 10:04 PM
  5. Code tìm kiếm trong cây nhị phân trong C++. Lỗi chỉ tìm được từ đầu tiên trong file thôi sửa thế nào?
    Gửi bởi elvish 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: 11-04-2010, 09:43 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