Một số bài tập C _C++ NC 2026P27
Bài 102. Cho mảng các số nguyên. Tìm dãy con liên tiếp có tổng các phần tử lớn nhất. Với n<=10000, -10 6 <= ai<=106
|
cb102.txt |
Kqcb102.txt |
|
7 1 -2 -1 4 -1 5 -2 |
8 |
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
int a[10006];
int n;
long long sum1=0, sum2=-1e18;
int main(){
cin>>n;
for(int i=0; i<n;i++)
cin>>a[i];
for(int i=0;i<n; i++){
sum1+=a[i];
sum2=max(sum1,sum2);
if(sum1<0)sum1=0;
}
cout << sum2 << endl;
return 0;
}
//////////////////////////////
Bài 102e. Cho mảng các số nguyên. Tìm dãy con liên
tiếp có tổng các phần tử lớn nhất và
dãy con liên tiếp có tổng các phần tử nhỏ nhất. Với n<=10000, -10 6 <= ai<=106 .
Thông báo giá trị tổng và các phần tử đó.
File
input: cb102e.txt VD: 1 -2 -1 4 -1 5 -2 10 -23 90 6 -128
File
output:Kqcb102e.txt
Gợi
ý code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<algorithm>
using
namespace std;
int
main() {
cout << "Chuong trinh tim day
con co tong lon nhat nho nhat \n";
ifstream fin("cb102e.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file
cb102e.txt \n";
return 0;
}
vector<int> vo, tmp;
double x;
while(fin >> x){
if(abs(x) > 1e6) {
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;
}
tmp.push_back(0);
double sum=0;
for(auto c:vo){
sum+=c;
tmp.push_back(sum);
}
int L=0, R=0, L1=0,R1=0;
double max=-1e20, min=1e20;
for(int i=0;i<tmp.size()-1;i++){
for(int
j=i+1;j<tmp.size();j++){
if(tmp[j]-tmp[i]>=max){
L=i;
R=j;
max=tmp[j]-tmp[i];
}
if(tmp[j]-tmp[i]<=min){
L1=i;
R1=j;
min=tmp[j]-tmp[i];
}
}
}
if (R-L>0) {cout<<" Day
con lien tiep co tong lon nhat bang "<<max<<"
gom:\n";
for(int i=L;i<R;i++)
cout<<vo[i]<<" ";
}
else cout<<vo[L];
cout<<"\n";
if (R1-L1>0) {cout<<"
Day con lien tiep co tong nho nhat bang "<<min<<"
gom:\n";
for(int i=L1;i<R1;i++)
cout<<vo[i]<<" ";
}else cout<<vo[L1];
ofstream
fout("Kqcb102e.txt");
if (R-L>0) {fout<<" Day
con lien tiep co tong lon nhat bang "<<max<<"
gom:\n";
for(int i=L;i<R;i++)
fout<<vo[i]<<" ";
}
else fout<<vo[L];
fout<<"\n";
if (R1-L1>0) {fout<<"
Day con lien tiep co tong nho nhat bang "<<min<<"
gom:\n";
for(int i=L1;i<R1;i++)
fout<<vo[i]<<" ";
}else fout<<vo[L1];
return 0;
}
///////////////////////////////////
Cách
2: Bài 102e đầy đủ:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<algorithm>
using
namespace std;
int
main() {
cout << "Chuong trinh tim day
con co tong lon nhat nho nhat \n";
ifstream fin("cb102e.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file
cb102e.txt \n";
return 0;
}
vector<int> vo;
double x;
while(fin >> x){
if(abs(x) > 1e6) {
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;
}
int BL=0, BR=0, k=0;
double sm=0,s=0;
for(int i=0;i<vo.size();i++){
if(s+vo[i]<vo[i])
{
s=vo[i];
k=i;
}
else s+=vo[i];
if(sm<s){
sm=s;
BL=k;
BR=i;
}
}
int Lb=0, Rb=0;
double ms=0;
k=0;s=0;
for(int i=0;i<vo.size();i++){
if(s+vo[i]>vo[i])
{
s=vo[i];
k=i;
}
else s+=vo[i];
if(ms>s){
ms=s;
Lb=k;
Rb=i;
}
}
cout<<"Day con lien tiep
co tong lon nhat bang "<<sm<<" gom:\n";
for(int i=BL;i<=BR;i++)
cout<<vo[i]<<" ";
cout<<"\n";
cout<<"Day con lien tiep
co tong nho nhat bang "<<ms<<" gom:\n";
for(int i=Lb;i<=Rb;i++)
cout<<vo[i]<<" ";
ofstream
fout("Kqcb102e.txt");
fout<<"Day con lien tiep
co tong lon nhat bang "<<sm<<" gom:\n";
for(int i=BL;i<=BR;i++)
fout<<vo[i]<<" ";
fout<<"\n";
fout<<"Day con lien tiep
co tong nho nhat bang "<<ms<<" gom:\n";
for(int i=Lb;i<=Rb;i++)
fout<<vo[i]<<" ";
return 0;
}
//////////////////////////////////////
Bài 102b. Tính tổng
và đưa ra dãy đầu tiên có tổng lớn nhất
|
cb102b.txt |
Kqcb102.txt |
|
11 1 20 -100 1 2 27 -200 1 6 9 14 |
30 1
2 27 |
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("cb102b.txt","r",stdin);
freopen("Kqcb102b.txt","w",stdout);
int n;
cin>>n;
int a[n+2];
for(int i=0;i<n;i++){
cin>>a[i];
}
int maxx = INT_MIN, sum = 0;
int dau = 0, cuoi = 0,t = 0;
for (int i = 0; i < n; i++) {
if (sum + a[i] < a[i]) {
t = i;
sum = a[i];
} else {
sum += a[i];
}
if (maxx< sum) {
maxx = sum;
dau = t;
cuoi = i;
}
}
cout << maxx << endl;
for(int i=dau;i<=cuoi;i++){
cout << a[i] <<" ";
}
return 0;
}
///////////////////////
Bài 102c. Tính tổng và đưa ra dãy cuối có tổng lớn nhất
|
cb102c.txt |
Kqcb102c.txt |
|
11 1 20 -100 1 2 27 -200 1 6 9 14 |
30 1
6 9 14 |
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("cb102c.txt","r",stdin);
freopen("Kqcb102c.txt","w",stdout);
int n;
cin>>n;
int a[n+2];
for(int i=0;i<n;i++){
cin>>a[i];
}
int maxx = a[0], mx = a[0];
int dau = 0, cuoi = 0,t = 0;
for (int i = 1; i < n; i++) {
if (a[i]>=mx + a[i]) {
t = i;
mx= a[i];
} else {
mx+=a[i];
}
if (maxx<= mx) {
maxx = mx;
dau = t;
cuoi = i;
}
}
cout << maxx << endl;
for(int i=dau;i<=cuoi;i++){
cout << a[i] <<" ";
}
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love15.07.2026
///////////////////ok//
Bài 103. Cho một xâu bất kỳ. Hãy liệt kê và đếm số lần xuất hiện của các phần
tử trong xâu.VD:
|
cb103.txt |
Kq103.txt |
|
adsasd3243bvAB |
a 2 d 2 s 2 3 2 2 1 4 1 b 1 v 1 A 1 B 1 |
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
map<char, int>m;
string st;
int main() {
freopen("cb103.txt","r",stdin);
freopen("Kqcb103.txt","w",stdout);
getline(cin, st);
int x=st.size();
for(int i=0; i<x;i++) {
m[st[i]]++;
}
for(int i=0; i<x; i++)
if(m[st[i]]!=0){
cout<<st[i]<<"
"<<m[st[i]]<<endl;
m[st[i]]=0;}
return 0;
}
/////////////////////////
Cách
2: Không sử dụng map. VD file input: adsasd3243bvAB ghjgjg
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<algorithm>
using
namespace std;
int
main() {
cout << "Chuong trinh dem ki tu
trung\n";
ifstream fin("cb103c2.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file
cb103.txt\n";
return 0;
}
string s="",line;
while(fin >> line){
s+=line+" ";
}
fin.close();
if(s.empty()) {
cerr << "khong co phan tu
hop le trong file\n";
return 0;
}
line.clear();
for(char c:s){
if(c!='
'&&c!='\n') line+=c;
}
sort(line.begin(),line.end());
int n=line.size();
int d[n+1]={0};
for (int i=0;i<n; ){
int
dem=1;
while(i+1<n&&line[i]==line[i+1]){
i++;
dem++;
}d[i]=dem; i++;
}
for(auto c:s) cout<<c;
cout<<"\n\n";
for(int i=0;i<n;i++){
if(d[i]>0)
cout<<"Ki tu "<<line[i]<< " xuat hien
"<< d[i]<< " lan. \n";
}
ofstream
fout("Kqcb103b.txt");
for(auto c:s) fout<<c;
fout<<"\n\n";
for(int i=0;i<n;i++){
if(d[i]>0)
fout<<"Ki tu "<<line[i]<< " xuat hien
"<< d[i]<< " lan. \n";
}
return 0;
}
Chú
ý:
Khai
báo và tự động gán toàn bộ phần tử = 0
int
d[100] = {0};
Hoặc
int
d[100];
for(int
i = 0; i < 100; i++) d[i] = 0;
Hoặc
int
d[100];
memset(d,
0, sizeof(d));
hoặc
vector<int>
d(n+1, 0);
Cắt
khoảng trắng trong chuỗi:
for(char
c:s){
if(c!=' ' && c!='\n') line+=c;
}
Hoặc:
for(char
c:s){
if(!isspace(c)) line += c;
}
/////////////////////////////////////////////
Cách
3: Dùng mảng đếm 256 ký tự (nhanh nhất, đơn giản nhất)
#include
<iostream>
#include
<fstream>
using
namespace std;
int
main() {
ifstream fin("cb103c2.txt");
if(!fin){
cerr << "Khong mo duoc
file\n";
return 0;
}
int freq[256] = {0};
char c;
while(fin.get(c)){
if(!isspace(c)) freq[(unsigned
char)c]++;
}
ofstream fout("Kqcb103c3.txt");
for(int i=0;i<256;i++){
if(freq[i] > 0){
fout << "Ki tu '"
<< char(i)
<< "' xuat hien
" << freq[i] << " lan\n";
}
}
}
Chú
ý: Có thể sử dụng Vector:
vector<int>
freq(256, 0);
char
c;
while(fin.get(c)){
if(!isspace(c)) freq[(unsigned char)c]++;
}
Tham
khảo thêm:
string
s, line, tmp;
while(getline(fin,
tmp)) s += tmp;
line.reserve(s.size());
for(char
c : s){
if(!isspace(c)) line += c;
}
sort(line.begin(),
line.end());
for(int
i=0; i < line.size(); ){
int j = i + 1;
while(j < line.size() && line[j]
== line[i]) j++;
cout << "Ki tu '" <<
line[i] << "' xuat hien " << (j - i) << "
lan\n";
i = j;
}
Chú
ý: line.reserve(s.size()); // reserve(5)
Nó
chỉ đặt trước dung lượng bộ nhớ để chứa chuỗi, giúp chương trình chạy nhanh hơn
khi line được push thêm ký tự.
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love16.07.2026
///////////////////
Bài 105. Cho một xâu bất kỳ. Hãy xóa đi các kí tự trùng nhau theo trình tự của xâu và đưa ra xâu mới không
có kí tự trùng và xắp xếp tăng dần.
|
cb105.txt |
Kqcb105.txt |
|
23ads tr5AcfAgf 43 87truong 23ads 331 Nguyen Chi Thanh tr5AcfAgf 43 |
1234578ACNTacdefghinorstuy |
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
map<char, int>m;
string st,s;
int main() {
freopen("cb105.txt","r",stdin);
freopen("Kqcb105.txt","w",stdout);
while(getline(cin, st)){
s+=st;
};
int x=s.size();
for(int i=0; i<x;i++) {
m[s[i]]++;
}
string g;
for(int i=0; i<x; i++)
if(m[s[i]]!=0){
g+=s[i];
m[s[i]]=0;}
sort(g.begin(),g.end());
cout<<g;
return 0;
}
/////////////////////
Bài 105b. Cho xâu bất
kỳ. Hãy đưa ra xâu có các ký tự xuất hiện 1 lần
|
cb105b.inp |
Kq105b.out |
|
Pass:23ads tr5AcfAgf 43 87truong 23ads 331 Nguyen Chi Thanh tr5AcfAgf 43 |
P:87o1NyeCiT |
#include <bits/stdc++.h>
using namespace std;
map<char, int>m;
string st, s,g;
int main() {
freopen("cb105b.inp","r",stdin);
freopen("Kqcb105b.out","w",stdout);
while(getline(cin,st)){
s+=st;}
int x=s.size();
for(int i=0; i<x;i++) {
m[s[i]]++;
}
for(int i=0; i<x; i++)
if(m[s[i]]==1){
g+=s[i];
}
cout<<g;
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love17.07.2026
///////////////////
Bài 106. Cho một dãy các số nguyên trong khoảng [-100,100]. Hãy in ra số lượng các giá trị khác nhau dãy và các số đó sau đó in ra số lượng số có tần số xuất hiện trên 1
lần và các số đó.
File
input: cb106.txt : -26 -15 1 2 3 4 5 6 7 8 9 6 70 8 -15 -8 6
File
output: Kqcb106.txt
So
luong cac phan tu khac nhau la: 13 gom cac so:
-26 -15
1 2 3
4 5 6
7 8 9
70 -8
So
luong va gia tri so xuat hien tren 1 lan la:
2
lan: -15
3
lan: 6
2
lan: 8
Gợi
ý code:
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <map>
using namespace std;
int main() {
cout << "Chuong trinh cb106
\n";
ifstream fin("cb106.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file cb106.txt\n";
return 0;
}
vector<int> vo, tmp;
int x;
while(fin >> x){
if(abs(x) > 1e2) {
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;
}
map<int,int> m;
for(int c:vo) {
m[c]++;
if(m[c]==1)
tmp.push_back(c);
}
ofstream fout("Kqcb106.txt");
fout<<"So luong cac phan tu
khac nhau la: "<<tmp.size()<<" gom cac so: \n";
for(int i=0;i<tmp.size();i++){
fout<<tmp[i]<<"
";
}
fout<<"\n\n";
fout<<"So luong va gia tri
so xuat hien tren 1 lan la: \n";
for(int j:tmp){
if(m[j]>1){
fout<<m[j]<<"
lan: "<<j<<"\n";
}
}fout.close();
return 0;
}
//////////////////////////////
Cách 2
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
int main() {
cout << "Chuong trinh cb106
\n";
ifstream fin("cb106c2.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file cb106c2.txt\n";
return 0;
}
vector<int> vo;
int x;
while(fin >> x){
if(abs(x) > 1e2) {
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;
}
sort(vo.begin(),vo.end());
int tmp[vo.size()]={0};
int t=0;
for(int i=0;i<vo.size();i++ ) {
int
dem=1;
while(i<vo.size()&&vo[i]==vo[i+1])
{
dem++;
i++;
}
tmp[i]+=dem;
t++;
}
ofstream
fout("Kqcb106c2.txt");
fout<<"So luong cac phan tu
khac nhau la: "<<t<<" gom cac so: \n";
for(int i=0;i<vo.size();i++){
if(tmp[i]>0) fout<<vo[i]<<" ";
}
fout<<"\n\n";
fout<<"So luong va gia tri
so xuat hien tren 1 lan la: \n";
for(int j=0;j<vo.size();j++){
if(tmp[j]>1){
fout<<tmp[j]<<"
lan: "<<vo[j]<<"\n";
}
}fout.close();
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love18.07.2026
///////////////////ok/
BÀI 108. Cho dãy số. Hãy in ra số có tần
suất nhiều nhất và số lần xuất hiện.
Trường hợp có tần suất xuất hiện bằng nhau in ra số bé nhất
|
cb108.txt |
Kqcb108.txt |
|
10 1 2 3 3 3 3 6 9 9 9 9 8 |
3 4 |
Gợi
ý code
#include <bits/stdc++.h>
using namespace std;
int cnt[10002]={0};
int dem=0, res;
int main(){
freopen("cb108.txt","r",stdin);
freopen("Kqcb108.txt","w",stdout);
int n; cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++){
cnt[a[i]]++;
}
for(int i=0;i<n;i++){
if(cnt[a[i]]>dem){
dem=cnt[a[i]];
res=a[i];
}
else if(cnt[a[i]]==dem){
if(res >a[i]) res=a[i];
}
}
cout<<res<<"
"<<dem;
return 0;
}
//////////////////////
BÀI 109. Cho dãy số nguyên. Hãy tìm
tích a[i]*a[j] lớn nhất.
|
cb109.txt |
Kqcb109.txt |
|
10 1 2 3 -3 3 3 6 -9 9 9 -9 -8 |
81 |
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
int n,a[10000001];
int main(){
freopen("cb109.txt","r",stdin);
cin>>n;
for(int k=1;k<=n;k++)
cin>>a[k];
fclose(stdin);
sort(a+1,a+n+1);
long long k= a[1]*a[2];
long long h = a[n-1]*a[n];
if(k< h)
cout<<h;
else
cout<<k;
freopen("Kqcb109.txt","w",stdout);
if(k< h)
cout<<h;
else
cout<<k;
fclose(stdout);
}
///////////////////////////
Bài 110. Tính n!. Với n<= 100. Chú
ý: tích có thể là số rất lớn. Ví dụ:
|
cb110.txt |
Kqcb110.txt |
|
11 |
39916800 |
Gợi
ý code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<algorithm>
using
namespace std;
vector<int>
tich(vector<int> v,int n){
vector<int> tmp=v;
reverse(tmp.begin(),tmp.end());
int nho=0,j=0;
for(int
i=0;i<tmp.size();i++){
int
b=tmp[i]*n+nho;
if (b<10) {
tmp[i]=b;
nho=(int)b/10;
}
else
{tmp[i]=b%10;
nho=(int)b/10;
}
}while(nho!=0){
int a=nho%10;
tmp.push_back(a);
nho/=10;
}
reverse(tmp.begin(),tmp.end());
return tmp;
}
int
main() {
cout
<< "Chuong trinh cb110 tinh giai thua n \n";
ifstream
fin("cb110.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file
cb110.txt\n";
return 0;
}
vector<int>
vo;
int
x;
fin
>> x;
if(abs(x)
> 1e2&&x<1) {
cerr
<< "so " << x << " khong hop le \n";
return
0;
}
fin.close();
vo.push_back(1);
for(int
i=1;i<=x;i++){
vo=tich(vo,i);
}
for(int
c:vo) cout<<c;
cout<<"\n";
ofstream
fout("Kqcb110.txt");
for(int
c:vo) fout<<c;
cout<<"\n";
return
0;
}
/////////////////////////////////////
Cách
2: Tối ưu hơn:
#include
<iostream>
#include
<vector>
#include
<fstream>
using
namespace std;
//
Hàm nhân một số lớn (lưu trong vector) với số nguyên n
vector<int>
tich(const vector<int>& v, int n) {
vector<int> res;
int carry = 0;
for (int d : v) {
int val = d * n + carry;
res.push_back(val % 10);
carry = val / 10;
}
while (carry) {
res.push_back(carry % 10);
carry /= 10;
}
return res;
}
int
main() {
cout << "Chuong trinh cb110 tinh
giai thua n\n";
ifstream fin("cb110.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file
cb110.txt\n";
return 0;
}
int x;
fin >> x;
fin.close();
// Kiểm tra hợp lệ: 0 <= x <= 100
if (x < 0 || x > 100) {
cerr << "So " <<
x << " khong hop le\n";
return 0;
}
// Khởi tạo giai thừa = 1
vector<int> vo = {1};
// Tính giai thừa
for (int i = 2; i <= x; i++) {
vo = tich(vo, i);
}
// In ra màn hình (theo thứ tự ngược lại vì
vector lưu chữ số thấp trước)
for (auto it = vo.rbegin(); it !=
vo.rend(); ++it) {
cout << *it;
}
cout << "\n";
// Ghi ra file kết quả
ofstream fout("Kqcb110.txt");
for (auto it = vo.rbegin(); it !=
vo.rend(); ++it) {
fout << *it;
}
fout << "\n";
fout.close();
return 0;
}
///////////////
Chú
ý:
for
(auto it = vo.rbegin(); it != vo.rend(); ++it) {
cout << *it;
}
Ý
nghĩa từng phần
- vo
là một vector<int> chứa các chữ số của số lớn, nhưng bạn lưu ngược
(chữ số hàng đơn vị ở đầu vector).
- vo.rbegin()
trả về reverse iterator trỏ tới phần tử cuối cùng của vector (chữ số
cao nhất).
- vo.rend()
là reverse iterator trỏ tới vị trí trước phần tử đầu tiên (nghĩa là
kết thúc khi duyệt ngược).
- Vòng
for này sẽ duyệt từ cuối vector về đầu, tức là in ra các chữ số theo đúng
thứ tự tự nhiên của số.
Tại
sao dùng reverse iterator?
Vì
bạn lưu chữ số ngược để dễ tính toán (hàng đơn vị ở đầu). Khi in ra, bạn cần đảo
lại thứ tự. Thay vì gọi reverse lần nữa, bạn chỉ cần duyệt bằng reverse
iterator để in ngược.
Nói
ngắn gọn: auto it = vo.rbegin(); duyệt từ cuối vector về đầu, *it lấy giá trị tại
vị trí đó, và cout << *it; in ra từng chữ số theo đúng thứ tự của số.
Nếu
dùng chuỗi
Bạn
cũng có thể viết hàm nhân số lớn bằng chuỗi ký tự, ví dụ:
- Lưu
số trong string (chữ số cao nhất ở đầu).
- Viết
hàm nhân string * int.
- Kết
quả dễ in ra, không cần đảo.
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love18.07.2026
///////////////////oK///

Nhận xét
Đăng nhận xét