Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ nối chuỗi N lần

Nối một chuỗi lặp lại n lần. Người dùng nhập chuỗi và số lần n.

Thuật toán

concatStrNTimes(str, n):
    res = ""
    for i = 1 to n:
        res += str
    return res
end

Code cơ bản

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str, result = "";
    int n;
    
    cout << "Nhap chuoi: ";
    cin >> str; // Chỉ đọc đến space
    
    cout << "Nhap so lan noi: ";
    cin >> n;
    
    for(int i = 0; i < n; i++)
        result += str;
    
    cout << "Ket qua: " << result;
    return 0;
}

Kết quả

Nhap chuoi: Hello
Nhap so lan noi: 5
Ket qua: HelloHelloHelloHelloHello

Cải tiến quan trọng

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    int n;
    
    cout << "Nhap chuoi (co the co space): ";
    cin.ignore(); // Xóa newline còn sót
    getline(cin, str); // Đọc cả dòng
    
    cout << "Nhap so lan noi: ";
    cin >> n;
    
    string result;
    result.reserve(str.length() * n); // Quan trọng: dự trữ bộ nhớ
    
    for(int i = 0; i < n; i++)
        result += str;
    
    cout << "Ket qua: " << result;
    return 0;
}

Tại sao cần reserve()?

Không có reserve: mỗi += có thể reallocate, copy dữ liệu cũ → O(n²) tổng cộng.

Có reserve: cấp phát một lần, O(n) tổng cộng.

Phiên bản một dòng (C++23)

// C++23: std::string::repeat (chưa chuẩn hóa rộng rãi)
// Hiện tại có thể tự viết:
string repeat(const string& s, int n) {
    string r; r.reserve(s.size() * n);
    while(n--) r += s;
    return r;
}

Lưu ý

  • Dùng getline để đọc chuỗi có khoảng trắng.
  • Luôn reserve() khi biết trước kích thước cuối.
  • Tránh result = result + str (tạo temporary), dùng result += str.