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

Đề tài: Tính 10000!

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    1

    Mặc định Tính 10000!

    Mình đang làm bài bài tập lớn tính 10000!,nhưng mà hiện tại gặp phải 1 vấn đề lớn sau:10000! gần 40000 chữ số,phải dùng kiểu dữ liệu nào để chứa được 40000 chữ đây?Bài dưới đây là code tính giai thừa của mình,dùng mảng 1000 phần tử,mỗi phần tử là 1 số có 4 chữ số.Vậy cũng chỉ chứa được 4000 phần tử,tức là đúng đến 1400!.Khai báo mảng 10000 phần tử thì toàn báo lỗi.Mong mọi người vào xem và cho ý kiến.
    Code:
    #include <stdio.h>
    #include <conio.h>
    void main()
    {
    long n,i,j,dem,nho;
    long a[1000];
    printf("Chuong trinh tinh n giai thua\n");
    printf("Nhap n:");scanf("%ld",&n);
    dem=1;a[1]=1;
    for (i=1;i<=n;++i)
    	{
    	nho=0;
    	for (j=1;j<=dem;++j)
    	    {
    	    a[j]=a[j]*i+nho;
    	    nho=a[j]/10000;
    	    a[j]=a[j]%10000;
    	    }
    	while (nho > 0)
    	    {
    	    ++dem;
    	    a[dem]=nho%10000;
    	    nho=nho/10000;
    	    }
    	 }
    printf("%ld!=",n);
    printf("%ld",a[dem]);
    for (i=dem-1;i>=1;--i)
    //for (i=dem-1;i>=(dem-100);--i)  /*dùng cái này để kiểm tra 1400! bằng công cụ calculator*/
    	{
            if (a[i]>999) printf("%ld",a[i]);
    	if ((a[i] >99) & (a[i]<=999)) printf("0%ld",a[i]);
    	if ((a[i] <=99) & (a[i]>9)) printf("00%ld",a[i]);
    	if (a[i] <=9) printf("000%ld",a[i]);
    	}
    getch();
    }
    Đã được chỉnh sửa lần cuối bởi hirosama : 14-03-2009 lúc 08:51 PM.

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    25

    Theo như mình được biết kiểu dữ liệu mảng khi cấp phát sẽ là 1 dãy các ô nhớ sắp kiền nhau và phài liên tục , nên phải cần 1 vùng bộ nhớ rất lớn và liên tục mới chứa hết được , nên chương trình báo lỗi , lỗi ở đâu là ko tìm ra vùng nhớ đủ rộng như thế , hồi trước mình học để khắc phục thì dùng cấp phát động như thế là ok vì cơ chế cấp phát động ko đòi hỏi một vùng nhớ rộng và liên tiếp mà có thể là nhiều vùng nhớ nhỏ ( còn trống ) trên bộ nhớ gộp lại , với cách làm này có thể tạo ra mảng 1 triệu phần tử , bạn chịu khó nghiên cứu cấp phát động đi nhé hay lắm đó
    Giọt nước có thể làm mòn tảng đá,không phải vì giọt nước có sức mạnh,mà do nước chảy liên tục ngày đêm.Chỉ có sự phấn đấu không mệt mỏi mới đem lại tài năng.Do đó ta có thể khẳng định ,không nhích từng bước thì không bao giờ có thể đi xa ngàn dặm.
    -Ludwig Van Beethoven

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

    Có thể xài mảng để biểu diễn số có 40000 chữ số. (Nếu học C++ rồi thì có thể tóm nó lại thành 1 class - kiểu dữ liệu riêng của ta tùy ý sử dụng)
    Hoặc cũng có thể dùng float hay double gì đó, nhưng chỉ tính dc giá trị làm tròn. (ko chắc lắm)

    Còn cấp phát động thì cũng là vùng nhớ liên tục chứ ko phải nhiều vùng nhớ nhỏ còn trống đâu , nhưng phải dùng cấp phát động là đúng rồi.

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Trích dẫn Nguyên bản được gửi bởi hirosama Xem bài viết
    Mình đang làm bài bài tập lớn tính 10000!,nhưng mà hiện tại gặp phải 1 vấn đề lớn sau:10000! gần 40000 chữ số,phải dùng kiểu dữ liệu nào để chứa được 40000 chữ đây?Bài dưới đây là code tính giai thừa của mình,dùng mảng 1000 phần tử,mỗi phần tử là 1 số có 4 chữ số.Vậy cũng chỉ chứa được 4000 phần tử,tức là đúng đến 1400!.Khai báo mảng 10000 phần tử thì toàn báo lỗi.Mong mọi người vào xem và cho ý kiến.
    Code:
    #include <stdio.h>
    #include <conio.h>
    void main()
    {
    long n,i,j,dem,nho;
    long a[1000];
    printf("Chuong trinh tinh n giai thua\n");
    printf("Nhap n:");scanf("%ld",&n);
    dem=1;a[1]=1;
    for (i=1;i<=n;++i)
    	{
    	nho=0;
    	for (j=1;j<=dem;++j)
    	    {
    	    a[j]=a[j]*i+nho;
    	    nho=a[j]/10000;
    	    a[j]=a[j]%10000;
    	    }
    	while (nho > 0)
    	    {
    	    ++dem;
    	    a[dem]=nho%10000;
    	    nho=nho/10000;
    	    }
    	 }
    printf("%ld!=",n);
    printf("%ld",a[dem]);
    for (i=dem-1;i>=1;--i)
    //for (i=dem-1;i>=(dem-100);--i)  /*dùng cái này để kiểm tra 1400! bằng công cụ calculator*/
    	{
            if (a[i]>999) printf("%ld",a[i]);
    	if ((a[i] >99) & (a[i]<=999)) printf("0%ld",a[i]);
    	if ((a[i] <=99) & (a[i]>9)) printf("00%ld",a[i]);
    	if (a[i] <=9) printf("000%ld",a[i]);
    	}
    getch();
    }
    bạn à. tại sao ko thử thao tác trên file ?
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  5. #5
    Ngày gia nhập
    08 2008
    Bài viết
    1

    To:lostninja và Lugia : Cảm ơn 2 bạn,mình về nghiên cứu lại cái cấp phát động
    To:langman :Mình cũng từng nghỉ đến cách thao tác trên file,nhưng gặp phải vấn đề là làm sao để in ngược các phần tử,vì bài của mình là lưu trữ ngược mà.

  6. #6
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định Tính 10000!

    Mình đang làm bài bài tập lớn tính 10000!,nhưng mà hiện tại gặp phải 1 vấn đề lớn sau:10000! gần 40000 chữ số,phải dùng kiểu dữ liệu nào để chứa được 40000 chữ đây?Bài dưới đây là code tính giai thừa của mình,dùng mảng 1000 phần tử,mỗi phần tử là 1 số có 4 chữ số.Vậy cũng chỉ chứa được 4000 phần tử,tức là đúng đến 1400!.Khai báo mảng 10000 phần tử thì toàn báo lỗi.Mong mọi người vào xem và cho ý kiến.
    Có một ý tưởng của bạn như này, hãy lấy máy tính của windows ra và tính 10000! Hãy xem kết quả để biết tại sao nó lại tính được nhanh như thế.

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

    ẹc ẹc lấy máy tính của win ra di quanghoang bạn có biết nó tính 10000! như thế nào ko vậy?

    QHQPTB

  8. #8
    Ngày gia nhập
    07 2008
    Bài viết
    4

    Sao ko thử nghĩ tới kiểu chuỗi ký tự (string) nhỉ?? Tớ có làm bài này rồi, khá là thành công đấy

    @network: ý của Hoàng là muốn anh chú ý đến cái này ~~~> E
    Đã được chỉnh sửa lần cuối bởi dark_baron : 15-03-2009 lúc 11:41 PM.

  9. #9
    Ngày gia nhập
    08 2008
    Bài viết
    1

    Tớ cũng hay dùng calculator để kiểm tra bài toán tính giai thừa mà.Nhưng trong trường hợp này tớ cần tính giai thừa chính xác cơ.

  10. #10
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi hirosama Xem bài viết
    Tớ cũng hay dùng calculator để kiểm tra bài toán tính giai thừa mà.Nhưng trong trường hợp này tớ cần tính giai thừa chính xác cơ.
    trên forum rất nhiều code trính giai thừa số lớn bạn ạ
    Time

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

  1. Hỏi ý tưởng bài toán kết các tờ tiền định giá 100, 200, 500 thành 10000
    Gửi bởi boydamtac199 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 08-12-2013, 11:21 PM
  2. Bài tập C++ giúp mình với: Tìm n<10000 sao cho tổng các ước số nguyên tố của n là lớn nhất
    Gửi bởi dwarfboy93 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 11
    Bài viết cuối: 04-03-2012, 12:57 AM
  3. Vẽ 10000 sao nhấp nháy sử dụng OpenGL trong C/C++?
    Gửi bởi regulus trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 16-03-2011, 11:58 AM
  4. 1+2+3+4+...+n>10000
    Gửi bởi cutbo trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 11-12-2009, 08:25 AM
  5. Diễn đàn sắp được 10000 đề tài rồi anh em có gì lên tiếng xem
    Gửi bởi AdminPro trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 6
    Bài viết cuối: 13-03-2009, 02:04 AM

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