Cho số nguyên n, in tất cả chuỗi con (substring) của số đó không được chuyển sang chuỗi hoặc mảng.
Input: number = 5678 Output: 5, 56, 567, 5678, 6, 67, 678, 7, 78, 8
Giải pháp: Dùng toán học. Lấy lũy thừa 10 theo số chữ số. In chữ số hàng chục nghìn trước, sau đó chia 10 lặp lại. Loại bỏ chữ số hàng đầu và lặp lại.
Thuật toán
B1: Tính lũy thừa 10 dựa trên số chữ số. B2: In giá trị đệ quy, chia 10 cho đến khi số = 0. B3: Loại bỏ chữ số hàng đầu (MSB), lặp B2 với số mới. B4: Lặp cho đến khi số = 0.
Chương trình minh họa
#include <iostream>
#include <math.h>
using namespace std;
void printSubNumbers(int n);
int main(){
int n = 6789;
cout << "Số là " << n << " và các chuỗi con là :\n";
printSubNumbers(n);
return 0;
}
void printSubNumbers(int n){
int s = log10(n);
int d = (int)(pow(10, s) + 0.5);
int k = d;
while (n) {
while (d) {
cout << (n / d) << " ";
d = d / 10;
}
n = n % k;
k = k / 10;
d = k;
}
}
Kết quả
6 67 678 6789 7 78 789 8 89 9