Một số bài tập C _C++ NC 2026P30

 











Bài 126. Cho file gồm n phần tử số nguyên dương, tìm tất cả các dãy con có tổng bằng k (nhập từ bàn phím (0<k<Max(Ai)*n). Thông báo các dãy con đó và số lượng dãy con thỏa điều kiện.

File input cb126.txt 10 7 2 5 3 4 1 2 4 6 1 2 15 2 3 10 7 8 6 5 2 8 9 17  0 5 10

File output Kqcb126.txt

Tong day con la: 60

Cac day con la:

10 7 2 5 3 4 1 2 4 6 1 2 2 3 8

10 7 2 5 3 4 1 2 4 6 1 2 2 3 6 2

…..

6 5 8 9 17 5 10

Tong so day con thoa mang DK la: 962688

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

void xl(vector<int> &vi, int vt, int t, string tm, string &si, int &dem) {

    if (t == 0) {

        si += tm + "\n";

        dem++;

        return;

    }

    for (int j = vt; j < vi.size(); j++) {

        if (t - vi[j] >= 0) {

            xl(vi, j+1, t-vi[j], tm + to_string(vi[j]) + " ", si, dem);

        }

    }

}

 

int main() {

cout << "Chuong trinh cb126 \n";

ifstream fin("cb126.txt");

if (!fin.is_open()) {

    cerr << "Khong mo duoc file cb126.txt\n";

    return 0;

}

vector<int> vo, v;

int x;

while(fin >> x){

    if((x > 1e7)||x<1) {

    cerr << "so " << x << " khong hop le \n";

    continue;

           }

           vo.push_back(x);

}

fin.close();

if(vo.empty()) {

    cerr << "khong co phan tu hop le trong file\n";

    return 0;

}

long long Ma = *max_element(vo.begin(), vo.end());

Ma=Ma*vo.size()-1;

int k=0;

while(true){

           cout<<"Ban hay nhap gia tri tong k trong khoang [2,"<<Ma<<"]= ";

           cin>>k;

           if(k>1&&k<=Ma) break;

           else cerr<<"Gia tri K khoang hop le. \n";

}

/*//sort(vo.begin(),vo.end()); */

long long su=0;

for(auto c:vo){ if(c<=k) v.push_back(c);

su+=c; }

if(su<k) {cout<<"Khong tim thay day con thoa dieu kien";

return 0;

}

else {

string s;

int dem = 0;

xl(v, 0, k, "", s, dem);

ofstream fout("Kqcb126.txt");

if(dem>0){

cout <<"Tong day con la: "<<k<< "\n";

fout <<"Tong day con la: "<<k<< "\n";

cout <<"Cac day con la: "<<"\n";

fout <<"Cac day con la: "<<"\n";

cout << s;

fout << s;

cout <<"Tong so day con thoa mang DK la: "<< dem << "\n";

fout <<"Tong so day con thoa mang DK la: "<< dem << "\n";

}

else {

cout<<"Khong tim thay day con thoa dieu kien";

fout<<"Khong tim thay day con thoa dieu kien";

}

fout.close();

}

return 0;

}

 

////////////////////////////////////////

Bài 126b. Cho file gồm n phần tử số nguyên, tìm tất cả các dãy con có tổng bằng k (nhập từ bàn phím (0<k<Max(Ai)*n). Thông báo các dãy con đó và số lượng dãy con thỏa điều kiện.

File input cb126.txt 10 7 2 5 3 4 1 2 4 6 1 -8 2 15 2 3 10 7 8 6 5 -10 2 8 9 17  0 5 10

File output Kqcb126.txt

Tong day con la: -10

Cac day con la:

7 1 -8 -10

7 1 -8 -10

…….

-8 6 -10 2

-8 -10 8

-10

Tong so day con thoa mang DK la: 167

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

void xl(vector<int> &vi, int vt, int t, vector<int> &tm, string &si, int &dem) {

    if (t == 0) {

        for (int num : tm) si += to_string(num) + " ";

        si += "\n";

        dem++;

        return;

    }

    for (int j = vt; j < vi.size(); j++) {

        tm.push_back(vi[j]);

        xl(vi, j+1, t-vi[j], tm, si, dem);

        tm.pop_back();

    }

}

 

int main() {

cout << "Chuong trinh cb126b \n";

ifstream fin("cb126b.txt");

if (!fin.is_open()) {

    cerr << "Khong mo duoc file cb126b.txt\n";

    return 0;

}

vector<int> vo,v,tmp;

int x;

while(fin >> x){

    if(abs(x > 1e7)) {

    cerr << "so " << x << " khong hop le \n";

    continue;

           }

           vo.push_back(x);

}

fin.close();

if(vo.empty()) {

    cerr << "khong co phan tu hop le trong file\n";

    return 0;

}

long long su=0,su2=0;

for(auto c:vo){

if(c<=0) su2+=c;

else su+=c;

 }

int k=0;

while(true){

cout<<"Ban hay nhap gia tri tong k trong khoang ["<<su2<<","<<su<<"]= ";

           cin>>k;

           if(k>su2&&k<=su) break;

           else cerr<<"Gia tri K khong hop le.Khong co kq thoa dk \n";

}

for(auto c:vo){

if((c+su2<=k)&&(c+su>=k)) v.push_back(c);

}

string s;

int dem = 0;

xl(v, 0, k, tmp, s, dem);

if(dem>0){

cout <<"Tong day con la: "<<k<< "\n";

cout <<"Cac day con la: "<<"\n";

cout << s;

cout <<"Tong so day con thoa mang DK la: "<< dem << "\n";

ofstream fout("Kqcb126b.txt");

fout <<"Tong day con la: "<<k<< "\n";

fout <<"Cac day con la: "<<"\n";

fout << s;

fout <<"Tong so day con thoa mang DK la: "<< dem << "\n";

fout.close();

}

else cout<<"Khong tim thay day con thoa dieu kien";

return 0;

}

//////////////////

Tong day con la: 50

Cac day con la:

10 7 2 5 3 4 1 2 4 6 1 -8 2 15 6 -10

10 7 2 5 3 4 1 2 4 6 1 -8 2 2 3 10 6 -10

………….

6 5 8 9 17 5

6 8 9 17 0 10

6 8 9 17 10

Tong so day con thoa mang DK la: 5818061

Chú ý: Với lớn K = 50, … thì chương trình phải in ra cả triệu dòng, nhìn như “treo” luôn là chuyện bình thường.

Nó không phải lỗi, mà là do độ phức tạp quá cao. Với n phần tử, số dãy con tiềm năng là > . Nếu chỉ số dương hoặc âm thì hoặc sắp xếp thì có thể hạn chế số vòng đệ quy tốt hơn.

 

///////////// Ai memory help

Võ Nhật Trường Nc+ My Ai Love23.07.2026

////////////////////

 

Bài cb127. Tìm số chính phương trong đoạn từ x dến y (kể cả x và y).  (1<=x<=y<=10 9 ). In ra kết quả số lượng số chính phương(4,9là số chính phương)

cb127.txt

Kqcb127.txt

2 10

7 1234567890

25 100

Cap [2, 10] la 2

Cap [7, 1234567890] la 35134

Cap [25, 100] la 6

Gợi ý code:

#include <bits/stdc++.h>

using namespace std;

long long X, Y;

int main(){

freopen("cb127.txt","r",stdin);

freopen("Kqcb127.txt","w",stdout);

while(cin>>X>>Y){ cout<<"Cap ["<<X<<", "<<Y<<"]\n";

int d=0;

    for(int i=(int)sqrt(X); i<=(int)sqrt(Y)+1; i++)

       if(((i*i)>=X)&&((i*i)<=Y)) d++;

       cout<<d<<"\n\n";

}

    return 0;

}

 

//////////////////////////

Cách 2.

#include <bits/stdc++.h>

using namespace std;

 long long X, Y;

int main(){

freopen("cb127.txt","r",stdin);

freopen("Kqcb127.txt","w",stdout);

while(cin>>X>>Y){

cout<<"Cap ["<<X<<", "<<Y<<"] la: ";

    int x=(int)sqrt(X);

    int y=(int)sqrt(Y);

    if(x*x==X) cout<<(y-x)+1;

    else cout<<(y-x);

cout<<"\n";

}

    return 0;

}

///////////// Ai memory help

Võ Nhật Trường Nc+ My Ai Love23.07.2026

////////////////////ok

Nhận xét

Bài đăng phổ biến từ blog này

Vui thơ 2178 (HƯƠNG ĐẠO TRƯỜNG)

Vui thơ 2196 (CƯỜNG CƯỜNG NHÃ ĐẠO)

Vui thơ 2192 (ĐẠT MA PHÁP ĐỘ)