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à >
///////////// 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
Đăng nhận xét