Thứ Sáu, 20 tháng 11, 2015

Tìm tất cả số nguyên tố nhỏ hơn hoặc bằng n

Đơn giản ta sẽ dò từ 2 đến n xem đó có phải nó số nguyên tố hay không và hàm tìm số nguyên tố như sau: 

public boolean isPrime(int n) {
if (n <= 1)
return false;
for (int i = 2; i < n; i++) {
if (n % i == 0)
return false;
}
return true;
}

Vấn đề sẽ xảy ra khi n là một số khoảng vài ngìn khi ta sẽ phải lặp rất nhiều để xem xét mà vấn đề chia hết cho 1 số ta có thể tái sử dụng được để tiết kiệm được thời gian. Tất nhiên phải tốn thêm bộ nhớ rồi :D

Sau đây là cách hiệu quả để làm việc đó (Phương pháp có tên Sieve of Eratosthenes)
Nguồn http://www.geeksforgeeks.org/sieve-of-eratosthenes/

Phương pháp sieve of Eratosthenes là một trong những cách hiệu quả nhất cho việc tìm tất cả các số nguyên tố nhỏ hơn hoặc bàng n vói n nhỏ hơn khoảng 10 triệu (Ref Wiki).
Dưới đây là miêu tả giải thuật của phương pháp Eratosthenes:
  1. Tạo một mảng liên tục từ 2 đến n: (2, 3, 4, …, n).
  2. Coi p = 2 ( số nguyên tố đầu tiên).
  3. Bắt đầu từ p ta sẽ đánh dấu mọi bội của p hư 2p,3p,4p,....
  4. Tìm số tiếp theo x gần p nhất mà chưa bị đánh dấu, khi đó x sẽ là số nguyên tố, ta tiếp tục đánh dấu mọi bội của x và cứ thế cho đến hết mảng.
Khi giải thuật kết thúc thì tất cả các số không bị đánh dấu là số nguyên tố
Giải thích bằng ví dụ:
Giả sử n = 50. 
Tạo một mảng từ 2 đến 50
Sieve1
Ta sẽ đánh dấu tất cả bội của 2
sieve2
Ta sẽ tìm được số 3 là số tiếp theo và đánh dấu mọi bội của 3.
sieve3
Tương tự với số 5.
Sieve4
Khi kết thúc ta có mảng như sau
Sieve5
Các số nguên tố là: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47.

Cài đặt:

Dưới đây là phàn code java giải thuật.
#include <stdio.h>
#include <string.h>
 
public class SieveOfEratosthenes { // đánh dấu mọi bội của a ddeuf không phải là số nguyên tố public static void markMultiples(boolean[] arr, int a) { for (int i = 2 * a; i <= arr.length; i += a) { arr[i] = true; } } // A function to print all prime numbers smaller than n public static void SieveOfEratosthenes(int n) { // There are no prime numbers smaller than 2 if (n >= 2) { // Create an array of size n and initialize all elements as false boolean[] arr = new boolean[n + 1]; /* * Following property is maintained in the below for loop arr[i] == * false means i is prime arr[i] == true means i is not prime */ for (int i = 2; i <= n; ++i) { if (!arr[i]) { // (i) is prime, print it and mark its multiples System.out.println(i); markMultiples(arr, i); } } } } // Driver Program to test above function public static void main(String[] args) { int n = 30; System.out.printf("Following are the prime numbers below %d\n", n); SieveOfEratosthenes(n); } }

Output:
Following are the prime numbers below 30
2 3 5 7 11 13 17 19 23 29
Có thể chạy thử tại đây http://ideone.com/fork/zCNaQt

Kiến trúc máy tính.

Giả sử CPU chỉ có duy nhất lệnh một lệnh SUB X, thực hiện phép trừ nội dung thanh ghi ACCUMULATOR với nội dung từ nhớ tại địa chỉ X và đặt kết quả vào cả ACC và X. Hãy thực hiện lệnh ngôn ngữ bậc cao A = B+C với computer chỉ có duy nhất lệnh trên (các từ nhớ tại B và C phải được bảo lưu, có thể sử dụng tối đa một từ nhớ trung gian).

Bài làm: 

Bạn chỉ cần để ý khi ta SUB X 2 lần thì cả ACC và X sẽ đều lưu giá trị 0
Ta sẽ lấy thêm một từ nhớ trung gian có tên là D
Có tất cả 12 bước như sau







Thứ Tư, 18 tháng 11, 2015

Tìm số phép biến đổi tối thiểu để 2 string giống nhau

Nguồn: http://www.geeksforgeeks.org/dynamic-programming-set-5-edit-distance/
Bài viết này chỉ là dịch thô từ nguồn trên do khả năng của mình có hạn nên rất mong nhận được sự góp ý từ các bạn


Cho 2 string str1 và str2 và các phép biến đổi cơ bản để thay đổi string str1. Tìm số biến đổi tối thiểu cần để str1 giống str2.
  1. Thêm
  2. Xóa
  3. Thay thế
Tất cả các phép trên là tương đương.


Thứ Hai, 16 tháng 11, 2015

Tìm số đường đi với số lần rẽ nhiều nhất là k

Nguồn:  http://www.geeksforgeeks.org/count-number-of-paths-with-k-turns/
Bài viết này chỉ là dịch thô từ nguồn trên do khả năng của mình có hạn nên rất mong nhận được sự góp ý từ các bạn

Cho một ma trận "m x n", tìm số đường đi để đến được phần tử thứ (i,j) từ phần tử thứ (0,0) với số lần rẽ tối đa là k

Rẽ là gì? Đơn giản nếu bạn đang đi theo hàng mà lại đột ngột đi theo cột thì đó là mọt lân rẽ

Nhớ rằng bạn chỉ được đi sang phải và xuống dưới mà thôi.


Ví dụ: 
Input:  m = 3, n = 3, k = 2
Output: 4
Nhìn đồ thị phía dưới.

Input:  m = 3, n = 3, k = 1
Output: 2 



Chúng tôi đề nghị bạn hãy tự nghĩ cách giải quyết trước khi xem lời giải

Chủ Nhật, 15 tháng 11, 2015

Thứ Bảy, 14 tháng 11, 2015

Copyright © My study

Distributed By My Blogger Themes | Blogger Theme By NewBloggerThemes Up ↑