Trung Quân
  • Node.js
  • ReactJS
    • Learn React Hooks
  • MERN Stack
  • Thuật Toán
  • Công Nghệ
    • Amazon AWS
    • Hosting – Domain
  • Về Tác Giả
  • Bản Quyền
Top Posts
Lộ trình học lập trình Web từ con...
Nhận diện, xác thực khuôn mặt với ReactJS...
Tạo hiệu ứng thẻ bài Magic với HTML...
NodeJS viết API gửi Email với OAuth2 và...
Tạo hiệu ứng Parallax đơn giản chỉ với...
Git – GitHub • Học Git thực tế...
Tạo một trang GitHub Profile phiên bản vũ...
Cài đặt iTerm2, Oh My Zsh, Zsh-autosuggestions và...
Cài đặt NVM, NodeJS và GIT trên MacOS...
Thuật toán Tìm phần tử bị lặp đầu...

Trung Quân

  • Node.js
  • ReactJS
    • Learn React Hooks
  • MERN Stack
  • Thuật Toán
  • Công Nghệ
    • Amazon AWS
    • Hosting – Domain
  • Về Tác Giả
  • Bản Quyền
Bài tập ứng dụng webCommon Problems

Ứng dụng web liệt kê danh sách số Armstrong nhỏ hơn một số giới hạn cho trước

by trungquandev June 3, 2016
written by trungquandev June 3, 2016
Ứng dụng web liệt kê danh sách số Armstrong nhỏ hơn một số giới hạn cho trước

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 liệt kê danh sách số Armstrong nhỏ hơn một số giới hạn cho trước.

Hình dung bài toán:

-Đầu tiên cần phải hiểu bản chất số Armstrong là gì. Chắc nhiều bạn chưa biết. Mình sẽ giải thích đơn giản ^^

–Amstrong number hay còn gọi là “số tự mãn“, là số mà tổng các lũy thừa của các chữ số của nó bằng chính nó, lũy thừa bậc bao nhiêu ứng với số chữ số của số đó. Ví dụ:

+Số 153 thì 1^3+5^3+3^3 = 153;

+Số 1634 thì 1^4 + 6^4 + 3^4 + 4^4 = 1634;

– Đơn giản phải không, vậy lên ý tưởng code, mình có các bước làm như sau:

  • B1: Viết hàm đếm số chữ số của một số
  • B2: Viết hàm kiểm tra xem một số có phải là số Armstrong hay không
  • B3: Viết hàm liệt kê danh sách số Armstrong nhỏ hơn 1 số nào đó mà mình cho trước
  • B4: Viết form để nhập số giới hạn và code xử lý dữ liệu phía trên form
  • B5: Run….

———————————————————————————————————–

Xử lý bài toán nào:

B1: Hàm đếm số chữ số:

function dem_so_chu_so($n){
   if($n>=0){
        $dem =0;
  do{
      $dem++;
      $n/=10;
  }
  while($n>=1);
        
  return $dem;
   }
   else{
  echo 'yêu cầu nhập số dương';	
   }
}
/*
 Giải thích đoạn code trên:
-Đầu tiên kiểm tra số nhập vào có phải số nguyên dương hay không, không thì yêu cầu
 nhập lại

- Thuật toán đơn giản là tạo một biến đếm ($dem =0) coi như ban đầu có 0 chữ số
 Sau đó đưa biến đếm vào vòng lặp do cho nó tăng lên 1 đơn vị, đồng thời chia
 số cần đếm cho 10
- Đến khi điều kiện trong vòng lặp while sai (tức là số cần đếm nhỏ hơn hoặc bằng 1) 
 thì dừng vòng lặp lại và trả về kết quả đếm

-Ví dụ mình chia số 171 cho 10 lần đầu tiên được 17,1 và gán cho biến đếm = 1
 Chia tiếp 17,1 cho 10 được 1,71 và biến đếm bằng 2
 Chia lần nữa 1,71 cho 10 được 0,71 và biến đếm bằng 3 đồng thời dừng vòng lặp
 vì 0,71 < 1 ( điều kiện >= 1 trong vòng lặp while đã bị sai)

-Và ta thu được biến đếm =3, dĩ nhiên đúng vì 171 là số có 3 chữ số ^^
*/

B2: Hàm kiểm tra số Armstrong:

function is_Armstrong_Number($so) {
  if ($so >= 0) {
    $so_mu = dem_so_chu_so($so);
    $p = $so;
    $tong_luy_thua = 0;
    while ($so > 0) {
      $k = $so % 10;
      $tong_luy_thua += pow($k, $so_mu);
      $so /= 10;
    }
    if ($p == $tong_luy_thua) {
      return true;
    } else {
      return false;
    }
  } else {
    echo 'yêu cầu nhập số dương';
  }
}
/*
-Giải thích đoạn code trên:
-Đầu tiên cũng yêu cầu số nhập vào phải là số dương, sai thì nhập lại

-Xác định số mũ lũy thừa để tính, sử dụng hàm đếm số chữ số ở trên
-Gán một biến $p bằng với giá trị của số ban đầu
-Khởi tạo biến $tong_luy_thua để tính tổng lũy thừa của các chữ số, mục đích là
 để sau kiểm tra xem có bằng với $p (giá trị của số ban đầu hay không)

-Thuật toán khá đơn giản: sử dụng vòng lặp while, lặp cho đến khi số nhập vào
 nhỏ hơn hoặc bằng 0 thì dừng. Tức là biểu thức trong while($so>0) sai thì dừng.

-Bên trong vòng lặp ta lấy từng giá trị một của từng chữ số bằng cách chia dư số đó
 cho 10 và khởi tạo biến $k rồi gán giá trị chia dư cho $k;
-Tiếp theo tính lũy thừa số vừa chia dư được đó với số mũ ở trên và gán vào $tong_luy_thua
 đồng thời chia số ban đầu cho 10.

-Nói thì khó hiểu, ví dụ cho dễ hiểu này: ta có số 153
 +Lần lặp đầu tiên chia dư 153 cho 10 được số 15 dư 3, tổng lũy thùa lúc này bằng 3^3 =9
 +Lần lặp thứ 2 chia dư tiếp 15 cho 10 được 1 dư 5, tổng lũy thùa lúc này bằng
  3^3 + 5^3 = 152
 +Lần lặp thứ 3 chia dư 1 cho 10 được 0 dư 1, tổng lúc này bằng 3^3 + 5^3 + 1^3 = 153
  đồng thời thu được giá trị 0, khiến biểu thức lớn hơn 0 ở trong while bị sai
  => dừng vòng lặp, ta được kết quả tổng lũy thừa = 153

-Việc cuối cùng là so sánh lại $tong_luy_thua với $p ban đầu, nếu 2 số bằng nhau thì số
 đó là số Armstrong, trả về giá trị true, ngược lại sai thì trả về false
*/

B3: Hàm liệt kê số Armstrong

function list_armstrong($limit) {
  (string) $ketqua = "";
  for ($i = 0; $i < $limit; $i++) {
    if (is_Armstrong_Number($i) == true) {
      $ketqua. = $i.
      '  ';
    }
  }
  return $ketqua;
}
/*
 Giải thích code:
-Khởi tạo biến $ketqua để lưu chuỗi số Armstrong ta thu được

-Khởi tạo biến chạy $i, duyệt $i cho đến khi nhỏ hơn số giới hạn thì dừng
-Bên trong vòng lặp kiểm tra xem $i có phải số Armstrong hay không, dùng hàm kiểm tra
 ở trên.
 
 +Nếu đúng là số Armstrong thì thêm $i vào chuỗi kết quả, không đúng thì không thêm
-Cuối cùng trả về chuỗi kết quả danh sách số Armstrong để hiển thị
*/

B4: Viết form để nhập số giới hạn và code xử lý dữ liệu phía trên form

<?php
if(isset($_POST["ok"])) {
  $limit = $_POST["limit"];
  $ketqua = list_armstrong($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="Liệt Kê" 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à so-armstrong.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 liệt kê, name = "ok"

-Sau khi nhấn nút liệt kê, đoạn code php ở bên trên form sẽ kiểm tra xem bạn đã nhấn nút
 liệt kê 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ê list_armstrong 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;
*/

B5: Chạy hàm và nhận kết quả thôi =))

bạn nào muốn giao diện ứng dụng như hình ở trên thì có thể dowload source code của mình về tham khảo.

Source code: Github: Liệt kê số Armstrong

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

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 lập trình MERN Stack Miễn Phí 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 ^^
KHOÁ HỌC LẬP TRÌNH MERN STACK 100% DỰ ÁN THỰC TẾ và CHẤT LƯỢNG
mern-stack-course-trungquandev
0 comment
0
FacebookTwitterGoogle +Pinterest
trungquandev

previous post
Ứng dụng web liệt kê “n” số nguyên tố đầu tiên
next post
Ứng dụng web chuyển năm dương lịch bất kỳ sang âm lịch

Related Posts

Tản mạn về cái tên “Lập trình viên...

March 25, 2018

Hiểu sâu về JWT – JSON Web Tokens

September 15, 2019

Node.js lắng nghe, quan sát những thay đổi...

July 4, 2019

Hướng Dẫn Import Database Trong phpmyadmin

April 18, 2016

Framework và CMS khác nhau như thế nào?...

September 3, 2017

Hướng dẫn đăng ký chống DDoS với Google...

January 14, 2017

Ứng dụng web tìm kiếm “cặp số bạn...

June 28, 2016

Tổng Quan Về Laravel Một Framework Khá Mạnh...

July 22, 2016

Cấu hình bộ phát wifi TP-Link cho gia...

November 23, 2018

Ứng dụng web liệt kê “n” số nguyên...

May 30, 2016

Bát Chánh Đạo

batchanhdao-trungquandev

About Me

About Me

Trung Quân

Software Engineer at Pod Foods

Academy Of Cryptography Techniques

"I am a dog and cat lover, love green, love to read books, write blog and oil painting ..."

Read my CV → https://cv.trungquandev.com/

My Maxim Live

A bit of fragrance clings to the hand that gives flowers!

For Vietnamese young generation

Đừng bao giờ làm người khổng lồ trong tư tưởng nhưng chỉ là thằng lùn trong hành động.

Keep in touch

Facebook Instagram Linkedin Youtube Email Github

Fanpage Facebook

Facebook

Học lập trình “MERN Stack Cơ Bản” qua ứng dụng thực tế

mern-stack-trello-app-trungquandev


  Khóa học lập trình MERN Stack (NodeJS, ReactJS, ExpressJS, MongoDB) cực kỳ chất lượng và Miễn Phí do chính mình hướng dẫn nhé:
  MERN Stack - xây dựng ứng dụng quản lý công việc dạng Kanban tương tự Trello.

Học lập trình “MERN Stack Nâng Cao” qua ứng dụng thực tế

mern-stack-advanced-trello-app-trungquandev


  * Học lập trình MERN Stack Nâng Cao (NodeJS, ReactJS, ExpressJS, MongoDB). Đây là một khóa học mà mình đã làm cực kỳ tâm huyết, với phong cách dạy lập trình làm dự án thực tế, chuyên nghiệp. Để các bạn có một hành trang kiến thức vững chắc cho hành trình làm lập trình viên trong tương lai nhé.
  Lập Trình MERN Stack Nâng Cao - Học Thực Tế Để Đi Làm

YouTube: Trungquandev Official

youtube-channel-trungquandev-official


  - Các bạn tham khảo kênh YouTube chính thức của mình và ủng hộ mình bằng cách tặng mình một lượt Đăng Ký Kênh nha.
Cảm ơn các bạn ^^

  YouTube: TRUNGQUANDEV OFFICIAL

© Copyright

Bản quyền:
  © DMCA (Digital Millennium Copyright Act)


DMCA.com Protection Status

License

Giấy phép nội dung:
  Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 Quốc tế.


Giấy phép Creative Commons

Other links

Portfolio của mình:
  https://cv.trungquandev.com

Lập trình cuộc sống:
  https://laptrinhcuocsong.com

Nhiều bài viết hay về javascript:
  https://codetheworld.io

  • Facebook
  • Youtube
  • GitHub
  • Linkedin
  • Instagram

@2022 - trungquandev.com. Since 2016 - All Right Reserved. Developed by Trung Quân Dev