30/09/2018, 18:43
String đột nhiên thay đổi giá trị
Em đang tìm số fibo nhỏ nhất >= tmp, với F, tmp đều là std::string
Hàm lessThan trả về true nếu F[i] < tmp
Hàm add() để cộng 2 string lại (tất nhiên là string chứa các chữ số)
while(lessThan(F[i], tmp))
{
++i;
F[i] = add(F[i - 1], F[i - 2]);
//std::cout << F[i] << '
' << tmp << '
';
}
Khi em để tmp là 1 số lớn (1000 chữ số 9) thì em tính F. Mọi chuyện vẫn ổn cho tới bước lặp cuối cùng, F[i] tính ra được là 24314… (ví dụ vậy), còn tmp đang mang giá trị 1000 chữ số 9 thì bỗng nhiên đổi thành 24314…
Mọi người cho em hỏi là tại sao lại vậy ?
Bài liên quan
Bởi vì giá trị của kiểu Int nó ko lớn đến 1000 chữ số 9 đâu bạn.
Dạ, em để biến tmp là std::string anh ơi
Nhưng bạn phải xem cả hàm lessThan kia nữa. Biết đâu trong đó bạn convert tmp thành int. Vì nếu không thì làm sao so sánh less than được giữa 1 integer và 1 string với nhau.
Bạn thử xem cái số lúc bạn bị lỗi có phải số này không: 2147483648. Đây là số lớn nhất của kiểu int.
Hic, ở đây, chỉ có biến i là int
Còn lại, F, tmp, là std::string hết
Em có nói rõ rồi mà.
Vậy i làm sao chạy qua giới hạn của kiểu Int được bạn?
Số Fibo có 1000 chữ số là cỡ số thứ 4900, nghĩa là i chỉ chạy tới 4900 thôi ^^
Dạ, nói ngắn gọn thì đây là xử lý số lớn nha anh ^^
Anh có thể google ^^
Haha, vậy chúc e tìm lỗi thành công.
Em cần chắc chắn các hàm này làm đúng nhiệm vụ của nó. Do ko xem đc hàm lessthan và hàm cộng nên anh ko kiểm tra đc, em post lên đc ko?
Hàm lessthan có truyền tham chiếu tmp ko? Vì chỉ có hàm này mới thay đổi đc tmp nên kiểm tra lại xem. Còn mà nó là truyền giá trị mà tmp vẫn bị thay đổi thì bí ẩn quá
Đây là toàn bộ chương trình của e.
Đề: nhập Q là số truy vấn. Với mỗi truy vấn, nhập một số tối đa 1000 chữ số và kiểm tra xem đó có phải là số Fibo hay không.
Em đưa toàn bộ code lên xem
while(carry){ a+=toChar(carry%10); carry/=10);}
không nên dùng phép cộng của string nhiều như thế. Tốt nhất là push_back vào sau rồi đảo ngược lại
Nhưng em vẫn không hiểu sao, các lần lặp trước đều đúng hết, nhưng chỉ tới bước lặp cuối cùng thì tmp lại chuyển luôn :’(
@ltd Nó liên quan gì đến vùng nhớ này nọ không anh
Đây là giá trị debug
Cái số 999… là giá trị của tmp, số rối rắm kia là số fib.
Và thấy rằng, đến bước lặp cuối, từ 999…, tmp đã chuyển sang giống fib[i] hoàn toàn :’(
Mình copy, thử build và chạy thử chương trình của bạn thì không thấy lỗi gì:
Mình dùng g++:
Thay hàm lessthan. Hàm cũ chạy mãi mà nó không chịu dừng
Anh thử với input 1040 số 9.
Cám ơn mấy anh em sửa theo anh @rok_Hoang thì chạy được rồi.
Mà nếu được, mấy anh có thể giải thích tại sao cái chương trình ban đầu biến tmp bị đổi giá trị không ?
{i=j; break;}??? Cái này giảm i để làm gì
…
if(F[j]==tmp)
tốt nhất là sinh hết 1000 số fibinacci rồi tìm kiếm nhị phân không hay hơn là cứ tìm tuần tự thế này. Nếu q=1000 và n đều là 1000 thì tìm theo cách này k chạy nổi đâu