2008-11-05 35 views
19

Tôi đang làm 2^1000 và đang nhận được điều này:Làm cách nào để tránh ký hiệu khoa học với số lượng lớn?

1.07151e + 301

Có cách nào để thực sự tắt chức năng này thành một số hợp lý mà không có sự e + 301 hoặc ít nhất là bất cứ ai có thể chỉ cho tôi nơi tôi có thể thấy làm thế nào để tắt chức năng này trong một số thực, bởi một số cách làm việc với e + 301 phần

Cảm ơn

+0

Điều này có thể đến từ đây không? http://projecteuler.net/index.php?section=problems&id=16 –

+1

Trong nhị phân, nó đơn giản - 1 theo sau là 1000 số không. Tạo một thuật toán đơn giản để thực hiện phân chia dài và bạn được sắp xếp (liên tục chia cho 1010 và cộng lại số dư). – Skizz

+0

Nó _is_ một số thích hợp. –

Trả lời

9

Vì vậy, tôi nghĩ rằng những gì bạn thực sự muốn chỉ là khả năng in mà không có ký pháp khoa học. Nếu bạn đang sử dụng printf, những gì bạn muốn là:

printf("%f1000.0", value); 
// note that 1000 is way larger than need be, 
// I'm just too lazy to count the digits 

Với cout, hãy thử một cái gì đó như:

cout.setf(ios::fixed); 
cout << setprecision(0) << value; 

Nếu bạn muốn in nó như là một sức mạnh của hai (2^1000 vs 10.715 ...), bạn là của riêng bạn.

+0

Cảm ơn điều này thực sự đã cho thấy số chính xác :) – AntonioCS

+0

Có cách nào tôi có thể đặt đầu ra trong chuỗi thay vì in trên màn hình không ?? – AntonioCS

+1

Chỉ cần sử dụng snprintf. Lưu ý rằng vì con số này chỉ là một sức mạnh của hai, bạn không mất bất kỳ thông tin nào, nhưng nếu bạn thử cùng một điều với câu 3^1000, một đôi sẽ không thể lưu trữ tất cả độ chính xác cần thiết. – Eclipse

10

Bạn cần phải sử dụng một lớp số thiết kế đặc biệt cho số dài.

Để biểu thị 2^1000 dưới dạng số chính xác, theo định nghĩa, bạn cần định dạng số thực sự chứa 1001 bit nhị phân. Định dạng nguyên thủy thông thường dài nhất thường chỉ có 64 bit.

BTW, câu trả lời là:

% perl -Mbigint -e 'print 2**1000' 
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 
+0

cố định để sửa lỗi off-by-one – Alnitak

+1

Nếu bạn cố gắng lấy perl từ Mbigint, Phantom sẽ đánh bại bạn và trả lại cho chúng. Nó không phải là tốt đẹp để cướp bộ lạc pygmy. Trừ khi bạn là Indiana Jones. –

+0

Tôi cho rằng bạn biết điều này, nhưng đây là câu hỏi của Project Euler. Một số người có thể xem xét nó một chút phân biệt để giải thích rõ ràng hầu hết các giải pháp. – Beska

0

Bạn đang nhận được là chính xác một số như các loại biến thể hỗ trợ. Con số đó là theo thứ tự của 1 tiếp theo là 301 zeroes. Để có được con số chính xác, bạn sẽ phải làm việc với thư viện hỗ trợ số lớn hoặc làm việc với ngôn ngữ được tạo cho loại toán đó (maple, matlab, v.v.)

13

Có giới hạn thực tế về cách thức một số lớn có thể được điều khiển trực tiếp trong các thanh ghi máy có thể. nếu bạn đang sử dụng phao chính xác kép có tổng cộng 64 bit, một số trong số đó được dành cho phần định trị, một số cho số mũ, và 1 cho bit dấu.

2^1000 cần số nguyên bit 1001 để được thể hiện mà không bị mất chính xác. Để làm việc với các số như vậy, bạn sẽ cần sử dụng thư viện có hỗ trợ số lớn, chẳng hạn như GNU MP.

+1

1001 bit, thực sự :) 2^1 cần 2 bit; và bằng cảm ứng từ đó. –

+0

Bạn đúng, cảm ơn vì đã chỉ ra, tôi đã chỉnh sửa để phản ánh điều đó. –

+0

Kết thúc dường như bị cắt khỏi câu đầu tiên: "Có giới hạn cơ bản về số lượng lớn có thể" thực sự nói "Có giới hạn _practical_ về số lượng lớn có thể được thể hiện trong thanh ghi máy . " – florin

2

cout < < cố định < < your_number;

Nhưng nó có thể sẽ không hiển thị toàn bộ số. Như ai đó đã nói trước đây, bạn cần phải viết một lớp.

4

Nếu bạn muốn tự làm điều đó trong C++, ví dụ bạn có thể tạo mảng chữ số và tự tính toán. Ví dụ đã được kiểm tra và xác minh:

unsigned int result[400]; // result digits 
unsigned int i, j, carry; 

// Initialize result digits 
for (i = 0; i < 399; i++) { 
    result[i] = 0; 
} 
result[399] = 2; 

for (i = 2; i <= 1000; i++) { // Calculate 2^i 
    carry = 0; 
    for (j = 399; j > 0; j--) { 
    result[j] <<= 1; // multiply with 2 
    result[j] += carry; // add carry 
    carry = result[j]/10; 
    result[j] %= 10; // we want one digit (0-9) only 
    } 
} 

printf("2^1000 = "); 
// print result digits 
for (i = 0; i < 400; i++) { 
    if (result[i] != 0) { // no leading zeros, please 
    for (j = i; j < 400; j++) { 
     printf("%d", result[j]); 
    } 
    break; 
    } 
} 
printf("\n"); 
2

Một lựa chọn, nếu logic ứng dụng của bạn sẽ cho phép nó là thay đổi các đơn vị bạn đang thao tác ....

Nếu bạn đang đo khoảng cách từ New York đến Paris trong Angstroms, chọn dặm hoặc km để thay thế. ... Ngoại trừ các yêu cầu toán học thuần túy, (như số nguyên tố bao thanh toán cho mật mã học hoặc ... nghiên cứu về Giả thuyết Reimann), hiếm khi cần phải giữ lại nhiều chữ số chính xác đó.Mặt khác, nếu bạn đang làm một cái gì đó đòi hỏi các giá trị số nguyên chính xác hoàn toàn với nhiều chữ số, thì có lẽ bạn sẽ nhận được phần mềm chuyên dụng được thiết kế để xử lý số lượng lớn ... không quen thuộc với khu vực đó. (chi phí, nhà cung cấp, khả năng, v.v.) Nếu chi phí là một vấn đề, và bạn đang nghĩ đến việc viết riêng của mình, tôi không biết đủ về những gì liên quan để biết cách tiếp cận đó có đáng để nỗ lực không ...

-1

Bao gồm tiêu đề limits.hcmath.h

cout.precision(0); 
cout<< fixed<< pow(2,31);    //OR ANY NUMBER HERE 

Sử dụng cout.precision để thiết lập chính xác.

+0

Giải pháp này đã được đưa ra ở đây gần một thập kỷ trước. –

Các vấn đề liên quan