1e9 là gì

X% [1e9 + 7] và x% [10 ** 9 + 7] có khác nhau trong Python không? Nếu đúng thì tại sao?

Hoàng Hồng Việt · Hoàng Hồng Việt 16:31 07/05/2021
22:24:20 11/01/2022

Đối với một số nguyên x x % [10 ** 9 + 7]và x % [1e9 + 7]đang cho các kết quả khác nhau sau một vài lần lặp. Để tái tạo kết quả này, tôi đang chia sẻ giải pháp của mình cho LeetCode # 576. Đường dẫn ngoài ranh giới . Giải pháp của tôi sẽ không vượt qua 5 trong số 94 trường hợp thử nghiệm nếu tôi thay đổi return ans % [10 ** 9 + 7]thành return ans % [1e9 + 7][nhận ra điều này khiến tôi mất một giờ].

Lưu ý rằng giải pháp này dài hơn nhiều so với một lớp lót được trình bày bởi một số anh chàng thiên tài ở đây . Tuy nhiên, vấn đề tương tự cũng nảy sinh với giải pháp của anh ấy nếu chúng ta thay đổi % [10 ** 9 + 7]thành % [1e9 + 7].

Tôi đã chơi một chút với trình biên dịch python và nhận thấy rằng 1e9 cung cấp một nghĩa đen float. Vì vậy, đối với tôi, có vẻ như sự đặc biệt này là do 'sự kỳ lạ' của số học dấu phẩy động. Nhưng tôi vẫn không hiểu làm thế nào một số 0 sau dấu thập phân có thể gây ra sự khác biệt. Tại sao sự khác biệt này lại phát sinh?

Không sao chép, có thể tìm thấy sự khác biệt tại đây: //www.diffchecker.com/PyKQCElB

Để tái tạo, đây là giải pháp của tôi:

class Solution: def findPaths[self, m: int, n: int, maxMove: int, startRow: int, startColumn: int] -> int: if maxMove == 0: return 0 current_state = [[0 for _ in range[n]] for _ in range[m]] next_state = [[0 for _ in range[n]] for _ in range[m]] current_state[startRow][startColumn] = 1 ans = self.count_ways[m, n, current_state] k = 1 while k < maxMove: # print["CS:", current_state] for i in range[m]: for j in range[n]: next_state[i][j] = 0 if i != 0: next_state[i][j] += current_state[i-1][j] if i!= m-1: next_state[i][j] += current_state[i+1][j] if j != 0: next_state[i][j] += current_state[i][j-1] if j != n-1: next_state[i][j] += current_state[i][j+1] current_state, next_state = next_state, current_state ans += self.count_ways[m, n, current_state] # print["NS:", current_state] # print["k:{},ans:{}".format[k, int[ans % 10 ** 9 + 7]]] # print["k:{},ans:{}".format[k, int[ans % 1e9 + 7]]] k += 1 # return ans % [1e9 + 7] # This is giving incorrect results. return ans % [10 ** 9 + 7] # This works fine. def count_ways[self, m, n, grid]: ways = 0 for i in range[m]: for j in [0, n-1]: # Checking left and right strips of a grid. ways += grid[i][j] for j in range[n]: for i in [0, m-1]: # Checking top and bottom strips of a grid. ways += grid[i][j] # This will automatically add corner boxes twice. return ways

CHỈNH SỬA: Sử dụng trường hợp kiểm tra này [các đối số cho findPaths, theo thứ tự]:

36 5 50 15 3
  • python
  • python-3.x
  • floating-point
8 hữu ích 1 bình luận 307 xem chia sẻ

Video liên quan

Chủ Đề