Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 2 trên tổng số 2 Đầu tiênĐầu tiên 12
Từ 11 tới 19 trên tổng số 19 kết quả

Đề tài: Tính giai thừa số lớn | Tính 100! trong lập trình C

  1. #11
    No Avatar
    javi Khách

    Mặc định Tính giai thừa số lớn | Tính 100! trong lập trình C

    Trích dẫn Nguyên bản được gửi bởi Leon88 Xem bài viết
    Cải tiến 100! giờ mình làm dc code chạy đến 270! mong các bạn cho ý kiến

    Theo cách 100! trên thì 1 mảng 200 số mỗi 1 phần tử là 1 số, giờ tôi làm mỗi phần tử là 2 số như vậy việc tính 200! sẽ rất nhanh, nếu 1 phần tử a[i] là 3 số thì việc tính đến giai thừa 900! cũng ko vấn đề. Do khai báo mảng 200 phần tử thuộc kiểu Unsigned nên mỗi phần tử có thể là số có 3 chữ số => mình có thể tính đến số 200*3 = 600 chữ số. Nếu khai báo mảng 200 phần tử thuộc kiểu integer thì có thể tính đến số có 10.000 chữ số ...
    Bài này để vòng for thứ 2 duyệt từ 1 đến n thì hơi uổng.
    Mình viết như sau. Chỉ khi có carry mới tăng số vòng lặp lên.
    num = 10, 100, 1000 ... tùy theo cách chọn kiểu biến. carry = nhớ; tmp = tạm
    C Code:
    1.     for (i=2; i<=N; i++){
    2.         carry = 0;
    3.         for(j=0; j<=count; j++){
    4.             tmp = a[j] * i;
    5.             a[j] = tmp%num + carry;
    6.             if ((tmp/num) > 0) {
    7.                 carry = tmp/num;
    8.                 if(j==count)count++;//tăng số vòng lặp
    9.             }
    10.         }
    11.     }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi javi : 22-03-2007 lúc 08:04 AM.

  2. #12
    No Avatar
    hoangvnt Khách

    Để tính toán với số lớn, thông thường phải tự tạo kiểu dữ liệu riêng. Các bạn có thể tham khảo thư viện tính toán số lớn GMP http://gmplib.org/. Thư viện này có thể tính toán chính xác những số cực lớn. Đây là thư viện mã nguồn mở nên các bạn có thể tham khảo source code (nếu cần thiết). Thư viện có thể tính được 500000! trong vòng 1412 ms đấy!!!

  3. #13
    Ngày gia nhập
    04 2007
    Bài viết
    30

    mình dùng 1 hàm cộng 2 chuỗi số và 1 hàm nhân 2 chuỗi số(2 hàm này đương nhiên là ko có sẵn)và đã chạy được đến 7000! nhìn con số kết quả tuôn ra đầy màn hình dzui lắm

  4. #14
    Ngày gia nhập
    04 2007
    Nơi ở
    Ho Chi Minh City
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi Leon88 Xem bài viết
    Mình mới tham gia diễn đàn mong các bạn xem thử code đã áp dụng theo cách trên
    không biết bạn đã test chưa. Nhưng tui test bài của bạn thì thấy nó không work gì hết trơn. Lý do: khi bạn gán biến n=tam ....... sau đó lại gán tam=n (dư thừa tại đây. Tại sao không bỏ đi? ===> Kết quả là : work.

  5. #15
    No Avatar
    nanh Khách

    Trích dẫn Nguyên bản được gửi bởi javi Xem bài viết
    100 ! = có khoảng 157 chữ số nên đặt N = 200 là ok rồi
    100! chính xác có 158 chữ số, tôi đã viết chương trình và chạy, tính rất nhanh, mảng 200 phần tử, có thể tính được đến 211!
    Có cách nào để tính được >211! ???

  6. #16
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà Nội
    Bài viết
    8

    Mặc định ma phương

    mình có một vấn đề: thây giáo dạy mình cho btvn có một dung rất ngắn gọn:
    "viết một chương trinh c để lập một ma phương bất kỳ"(đã biết ma phương là một ma trận vuông cấp n x n có các hàng =các cột=đường chéo chính=đường chéo phụ).mình nghĩ mãi không ra .ai có thể giúp mình giải quyết bài mày không,có thể đưa ý tương xử lý hoặc viết được code càng tốt.
    xin cảm ơn!

  7. #17
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Hix, hôm nay có dịp đụng nó mới thấy mệt mỏi T_T, ai thích thì mình cho code luôn đây. 1000! giai thừa luôn .
    C++ Code:
    1. #include <iostream>
    2. #include <cmath>
    3. #include <vector>
    4.  
    5. typedef unsigned int USI;
    6. typedef std::vector<USI> factorial;
    7.  
    8. /*Function prototype*/
    9. void displayFactorial(std::ostream& , factorial& );
    10. double calculateDigits(USI );
    11. void readInNumber(std::istream& , std::ostream& );
    12. void findFactorial(factorial& , USI , USI );
    13.  
    14. int main()
    15. {
    16.   readInNumber(std::cin, std::cout);
    17.   return 0;
    18. }
    19.  
    20. void displayFactorial(std::ostream &oss, factorial& aFact)
    21. {
    22.   for(int x = aFact.size() - 1; x >= 0; --x){
    23.     oss << aFact[x];
    24.   }
    25. }
    26.  
    27. double calculateDigits(USI _mNumber)
    28. {
    29.   double approxi = 0.0;
    30.   for(USI digit = 2; digit <= _mNumber; ++digit)
    31.     approxi += std::log10(digit);
    32.   return approxi;
    33. }
    34.  
    35. void readInNumber(std::istream &iss, std::ostream &oss)
    36. {
    37.   USI _mNumber;
    38.   oss << "\nPlease enter a number : ";
    39.   iss >> _mNumber;
    40.  
    41.   USI numberOfDigits = static_cast<int>(calculateDigits(_mNumber)) + 1;
    42.   factorial _mDigit(numberOfDigits, 0);
    43.   _mDigit[0] = 1;
    44.   findFactorial(_mDigit, numberOfDigits, _mNumber);
    45. }
    46.  
    47.  
    48. void findFactorial(factorial &aFact, USI numberOfDigits, USI _mNumber)
    49. {
    50.   USI remainder, _zZemp, value;
    51.   double temp = 0.0;
    52.   for(USI dig = 2; dig <= _mNumber; ++dig)
    53.   {
    54.     remainder = 0; 
    55.     temp += std::log10(dig);
    56.     _zZemp = static_cast<int>(temp) + 1;
    57.  
    58.     for(int index = 0; index <= _zZemp; ++index)
    59.     {
    60.       value = (aFact[index] * dig) + remainder;
    61.       remainder = (value / 10);
    62.       aFact[index] = (value % 10);
    63.     }
    64.   }
    65.   std::cout << _mNumber << "! : \n";
    66.   displayFactorial(std::cout, aFact);
    67. }

  8. #18
    Ngày gia nhập
    06 2009
    Bài viết
    3

    Tựa đề 100! . He he, kiểu này 80% học chung thầy với tui rồi. Hôm nay mới nộp bài xong. Cho file exe tham khao nè
    Attached Files Attached Files

  9. #19
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    1000! thì có gì ghê nhờ, mình cũng nghịch tí tính 50 000! luôn :P
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. unsigned short array[1000] = {1};
    4. unsigned int len= 1;
    5.  
    6. #define FACTOR  1000
    7.  
    8. int main()
    9. {
    10.     // TODO: Place code here.
    11.     clrscr();
    12.     unsigned int i;
    13.     unsigned long l;
    14.     unsigned long cn;
    15.  
    16.     cn= 0;
    17.     for(l= 1; l<=FACTOR; l++)
    18.     {
    19.         for(i= 0; i<len || cn; i++)
    20.         {
    21.             cn+= array[i]*l;
    22.             array[i]= (unsigned short)(cn%10000);
    23.             cn/= 10000;
    24.         }
    25.         len= i;
    26.     }
    27.  
    28.     printf("%d", array[len-1]);
    29.     for(i= len-1; i--;)
    30.     {
    31.         printf("%04d", array[i]);
    32.     }
    33.  
    34.     printf("\n");
    35.    
    36.     return 0;
    37. }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Mời các bạn ghé thăm blog cá nhân của tôi

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

  1. Chung cư Đại Thanh giá rẻ ở ngay giá gốc sốc 10 triệu
    Gửi bởi haonhien68 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 2
    Bài viết cuối: 13-11-2014, 01:47 PM
  2. Atlazbooks giảm giá 25% nhiều đầu sách nhân ngày 8-3
    Gửi bởi pipilazy trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 25-02-2012, 11:35 PM
  3. Giai thừa, Tính toán giai thừa trong lập trình C
    Gửi bởi congthao trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 14-07-2009, 01:12 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