friend-numbers

Ứng dụng web tìm kiếm “cặp số bạn bè” (friend numbers)

Xin chào các bạn, mình là Quân, hôm nay mình sẽ hướng dẫn các bạn code ứng dụng tìm kiếm hay nói cách khác là liệt kê các “cặp số bạn bè”.

Nói đến đây chắc nhiều bạn chưa biết “số bạn bè” <=> friend numbers là gì, mình sẽ giải thích, đơn giản thôi, hai số được gọi là một cặp số bạn bè khi và chỉ khi tổng tất cả các ước của số này bằng chính số kia và ngược lại.

Ví dụ ta có 2 số a và b, số a có tất cả 10 ước chẳng hạn thì cộng 10 ước đó lại nếu tổng bằng số b, và ngược lại nếu b có 9 ước chẳng hạn, cộng 9 ước đó lại tổng bằng số a. Thì 2 số a và b là một cặp friend numbers.

Hình dung đề bài:

-Sau khi giải thích số bạn bè là gì rồi chắc nhiều bạn đã có ý tưởng về thuật toán…bạn nào chưa brain storm được thì đọc tiếp nhé :))

-Thuật toán đơn giản gồm 2 bước viết thuật toán và 1 bước viết form:

  • B1: Xây dựng một hàm tính tổng các ước của một số nguyên.
  • B2: Xây dựng hàm liệt kê ra các cặp số bạn bè
  • B3: Viết form để nhập số giới hạn và code xử lý dữ liệu phía trên form
  • B4: Run thôi…

Xử Lý Bài Toán Nào:

B1: Hàm tính tổng các ước của một số nguyên

function tong_uoc_cua_mot_so_nguyen_da_toi_uu($so) {
  $tong_uoc = 1;
  $can = sqrt($so);
  for ($i = 2; $i <= $can; $i++) {
    if (($so % $i) == 0) {
      $tong_uoc = ($tong_uoc + $i + ($so / $i));
    }
  }
  return $tong_uoc;
}
/* Giải thích: -Tổng quan: Dùng vòng lặp từ 2 đến căn bậc 2 của số nguyên đã cho, kiểm tra cứ nếu có một ước của số nguyên đó thì sẽ cộng tổng tất cả các ước đó lại - Tạo một biến để lưu tổng các ước và gán cho nó giá trị là 1 luôn, vì 1 luôn là ước của mọi số bất kỳ. - Duyệt vòng lặp từ 2 đến căn của số nguyên, nếu số nguyên đó chia hết cho $i thì $i chính là ước của số nguyên đó. - Cuối cùng là tính giá trị tổng ước và trả về tổng ước. - Chú ý khi $i là một ước thì kết quả phép chia của số nguyên cho $i cũng sẽ là ước của số nguyên đó. */

B2: Hàm liệt kê cặp số bạn bè

function xac_dinh_so_be_ban_da_toi_uu($limit) {
  $result = '';
  for ($i = 2; $i <= $limit; $i++) {
    $j = tong_uoc_cua_mot_so_nguyen_da_toi_uu($i);
    if ($j <= $limit && tong_uoc_cua_mot_so_nguyen_da_toi_uu($j) == $i && $j > $i)
      $result = $result.$i.
    ' và '.$j.
    '<br>';
  }
}
return $result;
}
/*
Giải Thích:
- Tổng quan, sau khi ta đã có hàm tính tổng ước ở trên, giờ ta chỉ việc kiểm tra 
  xem tổng ước của một số i có bằng số j hay không và ngược lại, nếu bằng thì gán 
  giá trị đó vào chuỗi kết quả $result.

- Khởi tạo biến $result để lưu kết quả ở dạng chuỗi (String)
- Duyệt vòng lặp để chạy biến $i từ 2 cho đến số giới hạn
- Tạo biến $j và gán cho $j giá trị bằng tổng tất cả các ước của số $i
- Kiểm tra 3 điều kiện ràng buộc && đó là:
   + Biến $j phải nhỏ hơn số giới hạn.
   + Tổng tất cả các ước của $j phải bằng $i
   + Và $j phải lớn hơn $i để in ra được 2 số khác nhau
- Sau khi kiểm tra nếu thỏa mãn 3 điều kiện trên thì sẽ gán 2 số $i và $j 
  vào chuỗi kết quả. $i và $j chính là một cặp số bạn bè.
- Cuối cùng là trả về chuỗi kết quả $result
*/

B3: Viết form để nhập số giới hạn và code xử lý số giới hạn

<?php
if(isset($_POST["ok"])) {
  $limit = $_POST["limit"];
  $ketqua = xac_dinh_so_be_ban_da_toi_uu($limit);
  echo $ketqua;
}
?>
<form action="đường dẫn đến file code của bạn" method="post" enctype="multipart/form-data">
 Nhập số giới hạn: <input type="number" name="limit" value="" />
         <input type="submit" value="Tìm Kiếm" name="ok" />
</form>
/*
 Giải thích code:
-Ta sẽ tạo một form để nhập số giới hạn, chú ý trong dấu ngoặc kép chỗ action là đường dẫn
 đến file code của bạn, ví dụ của mình là sobeban.php
 
-Thẻ input type = "number" để nhập giá trị mà ta giới hạn; có name = "limit"
-Thẻ input type = "submit" để nhấn yêu cầu tìm kiếm, name = "ok"
 
-Sau khi nhấn nút tìm kiếm, đoạn code php ở bên trên form sẽ kiểm tra xem bạn đã nhấn nút
 tìm kiếm hay chưa (dùng hàm isset). Nếu tồn tại $_POST["ok"] nghĩa là bạn đã nhấn thì
 sẽ lấy giá trị $_POST["limit"] gửi lên từ thẻ input và gán vào biến $limit.
 
-Chạy hàm liệt kê xac_dinh_so_be_ban_da_toi_uu($limit) và gán kết quả vào biến $ketqua
-Cuối cùng là hiển thị chuỗi kết quả đó ra: echo $ketqua;
*/

B4: Chạy bài làm của mình và xem kết quả thu được sau một mớ thời gian code đau đầu thôi =)).

Bạn nào muốn giao diện ứng dụng đẹp như hình ở trên thì có thể dowload source code của mình về tham khảo, phần giao diện html-css mình không hướng dẫn vì đó là những kiến thức căn bản, bạn nào muốn học thì cứ search gg, nhiều lắm :))

Còn nữa, ở phần trên, tên các hàm mình có viết là đã tối ưu, có nghĩa là nhiều bạn sẽ rất dễ mắc phải lối mòn code cơ bản không tư duy nhiều, như vậy code sẽ không thể chạy nhanh được, các bạn có thể dowload source code dưới đây của mình về xem sẽ rõ. Trong file code mình cũng có giải thích khá kỹ.

Source code: Github: List Friend Numbers

Done.

Nếu có gì thắc mắc hoặc cần hỏi, bạn có thể comment dưới Bài Viết này hoặc Liên Hệ với mình, mình sẽ trả lời bạn sớm nhất. Cảm ơn các bạn và hẹn gặp lại các bạn ở những bài hướng dẫn tiếp theo.

Best Regards – Trung Quân

trungquandev-img-modal

Khóa học lập trình làm việc thực tế:

Nếu các bạn thấy bài viết của mình có ích thì hãy ủng hộ mình bằng cách tham khảo bài viết giới thiệu khóa học cực kỳ chất lượng và chính chủ dưới đây của mình nhé, cảm ơn các bạn ^^

nodejs-mongodb-messenger-realtime-course-trungquandev
Node.js và MongoDB - Xây dựng một ứng dụng Messenger trò chuyện trực tuyến.