Thứ Hai, 27 tháng 7, 2026

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

 









Bài cb128. Công thức tổng bình phương:

Tổng bình phương của n số nguyên đầu tiên là:

Công thức này được chứng minh bằng quy nạp hoặc bằng cách biến đổi toán học. Nó cho ta một cách tính nhanh mà không cần cộng từng số.

Số nghịch đảo của 6 theo modulo 2027. Tức là tìm số sao cho: K6≡1  (mod 2027)

Hoặc:  6K=2027m+1 với m nguyên (m=1>>K=(2027m+1)/6

Tính tổng n số chính phương đầu tiên(ví dụ T= 1+4+9+16 =30). Với n là số nghịch đảo của 6 theo modulo2027 và m là các hệ số nhập từ file input( 1<=m<= 100).

File out cb128.txt  1 3 5 7 9 10 11 13 15 17 19 20

File out Kqcb128.txt

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

 

int main(int argc, char** argv){

cout << "Chuong trinh cb128 \n";

ifstream fin("cb128.txt");

if (!fin.is_open()) {

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

    return 0;

}

vector<int> vo;

int x;

while(fin >> x){

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

    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;

}

ofstream fout("Kqcb128.txt");

for(int i=0;i<vo.size();i++){

           if ((2027*vo[i]+1)%6==0) {

           int n=(2027*vo[i]+1)/6;

           int T=n*(n+1)*(2*n+1)/6;

           cout<<"Tong cac so chinh phuong thoa man he so "<<vo[i]<<" la: "<<T<<"\n";

           fout<<"Tong cac so chinh phuong thoa man he so "<<vo[i]<<" la: "<<T<<"\n";

} else {

cout<<"He so "<<vo[i]<<" khong co ket qua thoa dieu kien bai toan\n";

fout<<"He so "<<vo[i]<<" khong co ket qua thoa dieu kien bai toan\n";

}

} fout.close();

return 0;

}

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

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

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

Bài cb129. Công thức tổng bình phương:

Tổng bình phương của n số nguyên đầu tiên là:

Công thức này được chứng minh bằng quy nạp hoặc bằng cách biến đổi toán học. Nó cho ta một cách tính nhanh mà không cần cộng từng số.

Nếu uscln(a,mod)=1 thì tồn tại nghiệm K chính là nghịch đảo của a theo modulo mod. VD a=6, mod=2027 thì nghịch đảo của 6 theo modulo 2027 là K=338. Tức là (K*6)*m=338*6*m≡m  (mod 2027).

Tìm tổng các số chính phương từ 1 đến n với n =K*m (m là hệ số từ file input) và a, mod nhập từ bàn phím (ví dụ 6 2027)

File out cb129.txt  1 3 5 7 9 10 11 13 15 17 19 20

File out Kqcb129.txt

Thuật toán Euclid mở rộng:

Dùng Euclid mở rộng cho 6  và 2027:

gcd(6,2027)=1, nên tồn tại nghịch đảo.

2027 =6337+5

6=51+1

5=15+0

>>>> 1=6-51

5=2027−6337

1=6−(2027−6337)   = 6338−20271=a.t-2027

  𝑎⋅𝑡+mod%a-mod=gcd(𝑎,mod)

Mod%a=a-gcd(a,mod)

gcd(a,mod)=a- (Mod%a)

t= (gcd(𝑎,mod)+mod- (Mod%a)) /a= mod/a+(gcd(𝑎,mod)- (Mod%a))/a

a.t-mod= gcd(𝑎,mod)- (Mod%a)

a.t+mod%a-mod= gcd(𝑎,mod)

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

using namespace std;

 

long long tongBinhPhuong(long long n) {

    return n * (n + 1) * (2 * n + 1) / 6;

}

 

long long sndK(int a, int mod) {

    long long t = 0, newt = 1;

    long long r = mod, newr = a;

    while (newr != 0) {

        long long q = r / newr;

        long long tmp = t; t = newt; newt = tmp - q * newt;

        tmp = r; r = newr; newr = tmp - q * newr;

    }

    if (r > 1) return -1;

    if (t < 0) t += mod;

    return t;

}

 

int main() {

    cout << "Chuong trinh cb129\n";

    ifstream fin("cb129.txt");

    if (!fin.is_open()) {

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

        return 0;

    }

 

    vector<int> vo;

    int x;

    while (fin >> x) {

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

            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 a,b;

           cout<<"Ban hay nhap 2 so nguyen duong a va mod: ";

           cin>>a>>b;

    long long K = sndK(a,b);

    ofstream fout("Kqcb129.txt");

    if (K == -1) {

    cout << "Khong tim duoc nghich dao cua "<<a<<" va "<<b<<"\n";

    fout << "Khong tim duoc nghich dao cua "<<a<<" va "<<b<<"\n";

} else {

           for(auto m:vo){

    long long n = (K * m) % b;

    long long T = tongBinhPhuong(n);

    cout << "Tong cac so chinh phuong voi he so " << m << " la: " << T << "\n";

    fout << "Tong cac so chinh phuong voi he so " << m << " la: " << T << "\n";

    }}

    fout.close();

    return 0;

}

Chú ý: 

Phần r, newr chính là cặp số dư trong Euclid: mỗi vòng lặp thay thế

(𝑟,𝑛𝑒𝑤𝑟)  bằng (𝑛𝑒𝑤𝑟,𝑟𝑛𝑒𝑤𝑟).

Phần t, newt là hệ số đi kèm, để khi ta truy ngược lại, ta có thể biểu diễn gcd dưới dạng tổ hợp tuyến tính của 𝑎𝑚𝑜𝑑.

Nói nôm na: r, newr chạy giống Euclid thường.

t, newt chạy song song, nhưng giá trị có thể âm, để “cân bằng” phương trình. Cuối cùng, khi newr = 0, thì t chính là nghịch đảo modulo.

Minh họa với a=6, mod=2027

Vòng

q

r

newr

t

newt

Init

2027

6

0

1

1

337

6

5

1

-337

2

1

5

1

-337

338

3

5

1

0

338

-2027

 

Kết thúc: r = 1 (gcd = 1), t = 338.

→ Nghịch đảo của 6 mod 2027 là 338.

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

 

Cach 2: Phương trình trong Euclid mở rộng

Trong thuật toán, ta duy trì quan hệ: 𝑎⋅𝑡+𝑚𝑜𝑑⋅𝑟=gcd(𝑎,𝑚𝑜𝑑)

Nếu ucln(a,mod)=1 luôn tìm được số nghịch đảo t ngoài ra trả về -1 (không có số nghịch đảo)

Code gợi ý:

#include <iostream>

#include <vector>

#include <fstream>

using namespace std;

 

long long tongBinhPhuong(long long n) {

    return n * (n + 1) * (2 * n + 1) / 6;

}

 

long long extendedGCD(long long a, long long b, long long &x, long long &y) {

    if (b == 0) {

        x = 1; y = 0;

        return a;

    }

    long long x1, y1;

    long long g = extendedGCD(b, a % b, x1, y1);

    x = y1;

    y = x1 - (a / b) * y1;

    return g;

}

 

long long modInverse(long long a, long long mod) {

    long long x, y;

    long long g = extendedGCD(a, mod, x, y);

    if (g != 1) return -1;

    if (x < 0) x += mod;

    return x;

}

int main() {

    cout << "Chuong trinh cb129\n";

    ifstream fin("cb129.txt");

    if (!fin.is_open()) {

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

        return 0;

    }

 

    vector<int> vo;

    int x;

    while (fin >> x) {

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

            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 a,b;

           cout<<"Ban hay nhap 2 so nguyen duong a va mod: ";

           cin>>a>>b;

    long long K = modInverse(a,b);

    ofstream fout("Kqcb129.txt");

    if (K == -1) {

    cout << "Khong tim duoc nghich dao cua "<<a<<" va "<<b<<"\n";

    fout << "Khong tim duoc nghich dao cua "<<a<<" va "<<b<<"\n";

} else {

           for(auto m:vo){

    long long n = (K * m) % b;

    long long T = tongBinhPhuong(n);

    cout << "Tong cac so chinh phuong voi he so " << m << " la: " << T << "\n";

    fout << "Tong cac so chinh phuong voi he so " << m << " la: " << T << "\n";

    }}

    fout.close();

    return 0;

}

 

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

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

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

 

Bài cb130.Đếm số lượng phần tử của dãy con liên tiếp dài nhất có tổng chia hết cho k.

cb130.txt

Kqcb130.txt

18 8

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

16

3 4 5 6 7 8 8 8 9 4 4 3 3 8 8 8

Bài làm

#include <bits/stdc++.h>

using namespace std;

long long n,a[1000002],maxn=0,k,dau,cuoi;

long long  tong(int x,int y)

{long long t=0;

    for(int i=x;i<=y;i++)

        t=t+a[i];

return t;

}

int main(){

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

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

cin>>n>>k;

for(int i=1;i<=n;i++) cin>>a[i];

for(int i=1;i<=n;i++)

for(int j=i+1;j<=n;j++)

   if(tong(i,j)%k==0&&j-i+1>maxn)  {maxn=j-i+1;dau=i;cuoi=j;}

    cout <<maxn<< " " <<endl ;

    for(int i=dau;i<=cuoi;i++)

        cout<<a[i]<<" ";

    return 0;

}

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

Cách 2:

#include <bits/stdc++.h>

using namespace std;

long long n,a[1000002],maxn=0,k, dau,cuoi;

 long long tong=0;

int main(){

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

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

    cin>>n>>k;

    for(int i=1;i<=n;i++) cin>>a[i];

    for(int i=1;i<=n;i++){

        tong=a[i];

    for(int j=i+1;j<=n;j++){

        tong =tong +a[j];

       if(tong%k==0&&j-i+1>maxn){

          maxn=j-i+1;dau=i;cuoi=j;

          }

    }

    }

         cout <<maxn<< " " <<endl ;

         for(int i=dau;i<=cuoi;i++)

             cout<<a[i]<<" ";

    return 0;

}

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

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

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

Bài 131. Cho trước hai số nguyên dương m, n (m< n). Xác định tam giác vuông có diện tích lớn nhất với các cạnh a, b, c là các số dương thỏa mãn: m<a+ b+ c<=n.

File input gom cac bo test gom cap so nguyen m,n với 3<=m<n<10000.

File output thong bao ket qua do dai cac canh tim duoc diện tích của tam giác va dien tich lon nhat được định dạng 1 chữ số thập phân. Nếu không tìm được tam giác vuông thỏa mãn thì thong bao khong tim duoc tam giac thoa man dieu kien bai toan

cb131.txt

Kqcb131.txt

3 20

15 20

20 1000

do dai ba canh tam giac thoa dk la: 5 4 3

dien tich lon nhat tim duoc la: 6.0

 

Khong tim duoc tam giac thoa man dieu kien bai toan

 

do dai ba canh tam giac thoa dk la: 411 315 264

dien tich lon nhat tim duoc la: 41580.0

Gợi ý Code:

#include <bits/stdc++.h>

 

using namespace std;

bool check(int a, int b, int c){

    if(a*a + b*b == c*c|| a*a + c*c  == b*b || b*b + c*c == a*a)

        return true;

    else return false;

}

int main(){

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

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

int m, n;

while (cin>>m>>n){

int a,b,c;

double kq, maxx=0;

    for(int i=n-2; i>0; i-- ){

        for(int j=i-1; j>0; j--){

            for(int k=1; k<=n-i-j&&k<i&&k<=j;k++){

                if(check(i,j,k)==true &&(i+j+k)>m &&(i+j+k)<=n&&(k+j)>i){

                    kq= k*j*1.0/2;

                    if(maxx<=kq) {maxx=kq;

                     b=j; c=k;a=i;

                     }

                }

            }

        }

    }

if(maxx>0){

cout<<"do dai ba canh tam giac thoa dk la: "<<a<<" "<<b<<" "<<c<<" \n";

cout <<"dien tich lon nhat tim duoc la: "<< fixed<<setprecision(1)<<maxx <<"\n\n";

} else cout<<"Khong tim duoc tam giac thoa man dieu kien bai toan \n\n";

}

    return 0;

}

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

Cách 2: Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

#include <iomanip> //dinh dang so thap phan

using namespace std;

bool TGV(int a, int b, int c){

           if(a<1||b<1||c<1) return false;

           if ((a+b<c)||(a+c)<b||(b+c)<a) return false;

if((a*a+b*b==c*c)||(c*c+b*b==a*a)||(a*a+c*c==b*b))return true;

           return false;

}

bool dk(int m, int n,int a,int b, int c){

           return (a+b+c>m&&a+b+c<=n&& m<n);

}

int main(int argc, char** argv){

cout << "Chuong trinh cb131 \n";

ifstream fin("cb131.txt");

ofstream fout("Kqcb131");

if (!fin.is_open()) {

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

    return 0;

}

int m, n;

while(fin >> m>>n){

    if(m>=n||m<3||n>1e9) {

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

    continue;

           }

vector<vector<double>> vo;

double maxx=0.0;

for(int i=2;i<n-1;i++){

           for(int j=1;j<n-i&&j<i;j++){

                     for(int k=1;k<=n-i-j&&k<=j;k++){

                                if(dk(m,n,i,j,k)&&TGV(i,j,k)){

                                vector<double> tm;

                                tm.push_back(i);

                                tm.push_back(j);

                                tm.push_back(k);

                                tm.push_back(j*k*1.0/2);

                                vo.push_back(tm);

                                if(j*k*1.0/2>maxx) maxx=j*k*1.0/2;

                     }

           }

}}

if(maxx==0.0) {

cout<<"Khong co tam giac thoa man dieu kien bai toan.\n\n";

fout<<"Khong co tam giac thoa man dieu kien bai toan.\n\n";

} else {

           for(auto c:vo){

           if(c[3] == maxx) {

            cout << "Ba canh tam giac la: " << c[0] << "   " << c[1] << "  " << c[2]

                 << " co dien tich la: " << fixed << setprecision(1) << c[3] << "\n\n";

            fout << "Ba canh tam giac la: " << c[0] << "   " << c[1] << "  " << c[2]

                 << " co dien tich la: " << fixed << setprecision(1) << c[3] << "\n\n";

        }

           }

}}

fin.close();

fout.close();

return 0;

}

Chú ý:

#include <iomanip> // thư viện này để định dạng số thập phân

Khi in ra dùng fixed << setprecision(1) để hiện số thập phân (ví dụ 6.0 thay vì 6) với kiểu dữ liệu double.

 

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

Cách 3: Gợi ý code (Dùng struct)

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

#include <iomanip>

using namespace std;

 

struct Triangle {

    int a, b, c;   // ba cạnh

    double area;   // diện tích

};

 

bool TGV(int a, int b, int c){

    if(a<1||b<1||c<1) return false;

    if ((a+b<=c)||(a+c<=b)||(b+c<=a)) return false;

    if((a*a+b*b==c*c)||(c*c+b*b==a*a)||(a*a+c*c==b*b)) return true;

    return false;

}

 

bool dk(int m, int n,int a,int b, int c){

    return (a+b+c>m && a+b+c<=n && m<n);

}

 

int main(int argc, char** argv){

    cout << "Chuong trinh cb131 \n";

    ifstream fin("cb131.txt");

    ofstream fout("Kqcb131");

    if (!fin.is_open()) {

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

        return 0;

    }

    int m, n;

    while(fin >> m>>n){

        if(m>=n||m<3||n>1e9) {

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

            continue;

        }

        vector<Triangle> vo;

        double maxx=0.0;

        for(int i=2;i<n-1;i++){

            for(int j=1;j<n-i && j<i;j++){

                for(int k=1;k<=n-i-j && k<=j;k++){

                    if(dk(m,n,i,j,k) && TGV(i,j,k)){

                        Triangle tm;

                        tm.a=i; tm.b=j; tm.c=k;

                        tm.area = j * k * 1.0 / 2;

                        vo.push_back(tm);

                        if(tm.area > maxx) maxx = tm.area;

                    }

                }

            }

        }

        if(maxx==0.0) {

            cout<<"Khong co tam giac thoa man dieu kien bai toan.\n\n";

            fout<<"Khong co tam giac thoa man dieu kien bai toan.\n\n";

        } else {

            for(auto c:vo){

                if(c.area==maxx) {

                    cout<<"Ba canh tam giac la: "<<c.a<<"   "<<c.b<<"  "<<c.c

                        <<" co dien tich la: "<<fixed<<setprecision(1)<<c.area<<"\n\n";

                    fout<<"Ba canh tam giac la: "<<c.a<<"   "<<c.b<<"  "<<c.c

                        <<" co dien tich la: "<<fixed<<setprecision(1)<<c.area<<"\n\n";

                }

            }

        }

    }

    fin.close();

    fout.close();

    return 0;

}

Giải thích:

Dùng struct Triangle để chứa cả int (cạnh) và double (diện tích).

Vector chính là vector<Triangle> vo;.

Khi thêm phần tử, chỉ cần tạo Triangle tm; rồi vo.push_back(tm);.

Không thể viết vo={0,0.0} hay vo.push_back(0,0.0) trực tiếp, vì vector chỉ nhận một kiểu duy nhất. Với struct thì bạn có thể viết vo.push_back({i,j,k,area});

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

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

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

Bài cb132: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13 15 17 19 20 22 26 28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải đếm số phần tử từ đầu đến B[i]>A[i] và ghi vào vị trí C[i]. Em hãy viết chương trình giúp bạn Truong giải quyết bài toán này.

File input là tập B tên cb132.txt  1 22 3 26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20

File output là tập C tên Kqcb132.txt  Tap C ma hoa cua tap B theo quy tac bai toan la:

0 1 1 2 2 3 3 4 4 5 5 6 5 5 4 4 4 4 4 3 2 1 0

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

 

int main(int argc, char** argv){

cout << "Chuong trinh cb132 \n";

ifstream fin("cb132.txt");

if (!fin.is_open()) {

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

    return 0;

}

vector<int> vo;

int x;

while(fin >> x){

    if(x > 1e9||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;

}

vector<int>v=vo,vc;

sort(v.begin(),v.end());

for(int i=0;i<v.size();i++){

           int dem=0;

           for(int j=0;j<=i;j++){

                     if(vo[j]>v[i]) dem++;

           }vc.push_back(dem);

}

ofstream fout("Kqcb132.txt");

cout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

fout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

for(auto c:vc){

           cout<<c<<" ";

           fout<<c<<" ";

}fout.close(); return 0;

}

 

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

Bài cb133: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13 15 17 19 20 22 26 28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải đếm số phần tử từ đầu đến B[i]>B[i] và ghi vào vị trí C[i]. Em hãy viết chương trình giúp bạn Truong giải quyết bài toán này.

File input là tập B tên cb133.txt  1 22 3 26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20

File output là tập C tên Kqcb133.txt  Tap C ma hoa cua tap B theo quy tac bai toan la:

0 0 1 0 2 0 3 0 4 1 5 2 6 0 7 0 8 2 9 4 10 6 11

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

 

int main(int argc, char** argv){

cout << "Chuong trinh cb133 \n";

ifstream fin("cb133.txt");

if (!fin.is_open()) {

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

    return 0;

}

vector<int> vo;

int x;

while(fin >> x){

    if(x > 1e9||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;

}

vector<int>vc;

for(int i=0;i<vo.size();i++){

           int dem=0;

           for(int j=0;j<=i;j++){

                     if(vo[j]>vo[i]) dem++;

           }vc.push_back(dem);

}

ofstream fout("Kqcb133.txt");

cout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

fout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

for(auto c:vc){

           cout<<c<<" ";

           fout<<c<<" ";

}fout.close(); return 0;

}

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

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

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

Bài cb134: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13 15 17 19 20 22 26 28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải phần tử C[i]= B[i]-A[i]. Em hãy viết chương trình giúp bạn Truong giải quyết bài toán này.

File input là tập B tên cb134.txt  1 22 3 26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20

File output là tập C tên Kqcb134.txt  Tap C ma hoa cua tap B theo quy tac bai toan la:

0 19 -2 19 -4 18 -4 57 -6 33 -9 10 -11 64 -15 65 -30 25 -48 -5 -56 -45 -75

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

 

int main(int argc, char** argv){

cout << "Chuong trinh cb134 \n";

ifstream fin("cb134.txt");

if (!fin.is_open()) {

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

    return 0;

}

vector<int> vo;

int x;

while(fin >> x){

    if(x > 1e9||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;

}

vector<int>va,vc;

va=vo;

sort(va.begin(),va.end());

for(int i=0;i<vo.size();i++){

     int ma=vo[i]-va[i];     

     vc.push_back(ma);

}

ofstream fout("Kqcb134.txt");

cout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

fout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

for(auto c:vc){

           cout<<c<<" ";

           fout<<c<<" ";

}fout.close(); return 0;

}

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

Bài cb135: Tập hợp A gồm N phần tử nguyên dương (VD: 95 90 75 70 65 50 45 30 28 26 22 20 19 17 15 13 11 10 9 7 5 3 1) sắp xếp giảm dần (không trùng nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải phần tử C[i]= vị trí A[j]=B[i]=j-i+A[i]. Em hãy viết chương trình giúp bạn Truong giải quyết bài toán này.

File input là tập B tên cb135.txt  1 22 3 26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20

File output là tập C tên Kqcb135.txt  Tap C ma hoa cua tap B theo quy tac bai toan la:

117 99 94 76 81 53 58 26 38 22 29 16 23 5 16 -2 9 -5 4 -8 -3 -12 -10

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

 

int main(int argc, char** argv){

cout << "Chuong trinh cb135 \n";

ifstream fin("cb135.txt");

if (!fin.is_open()) {

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

    return 0;

}

vector<int> vo;

int x;

while(fin >> x){

    if(x > 1e9||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;

}

vector<int>va,vc;

va=vo;

sort(va.begin(),va.end(),greater<int>());

for(int i=0;i<vo.size();i++){

           int j=0;

           while(va[j]!=vo[i]&&j<va.size()){

                     j++;

           }if(va[j]=vo[i]) vc.push_back(j-i+va[i]);

}

ofstream fout("Kqcb135.txt");

cout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

fout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

for(auto c:vc){

           cout<<c<<" ";

           fout<<c<<" ";

}fout.close(); return 0;

}

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

Bài cb136: Tập hợp A gồm N phần tử nguyên dương (VD: 95 90 75 70 65 50 45 30 28 26 22 20 19 17 15 13 11 10 9 7 5 3 1) sắp xếp giảm dần (không trùng nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải phần tử C[i]= vị trí A[j]=B[i]=j-i+A[i]. Bạn Nhat nhận được tập mã hóa là tap C và tập A của bạn Truong và muốn giải mã tìm tập B. Em hãy viết chương trình giúp bạn Nhat giải quyết bài toán này.

File input là tập A tên cb136.txt  95 90 75 70 65 50 45 30 28 26 22 20 19 17 15 13 11 10 9 7 5 3 1 và tập C tên cb136ma.txt  117 99 94 76 81 53 58 26 38 22 29 16 23 5 16 -2 9 -5 4 -8 -3 -12 -10

File output là tập B tên Kqcb136.txt  1 22 3 26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20

Gợi ý code:

#include <bits/stdc++.h>

using namespace std;

 

int main() {

// /*ios::sync_with_stdio(false);  cin.tie(nullptr);*/

ifstream fa("cb136.txt");

    vector<int> A;

    int x;

    while (fa >> x) A.push_back(x);

fa.close();

ifstream fc("cb136ma.txt");

    vector<int> C;

    while (fc >> x) C.push_back(x);

fc.close();

    if(A.size()!=C.size()) {cout<<"Khoa giai ma khong khop \n";

    return 0;

}

int N = A.size();

vector<int> B(N);

for (int i = 0; i < N; i++) {

int j=(C[i]-A[i]+i);

    if(j>=0&&j<N){

           B[i] = A[j];

}

    else {cout<<"Khoa giai ma khong khop \n";

    return 0;

}

}

ofstream fo("Kqcb136.txt");

for (int i = 0; i < N; i++) {

    fo << B[i];

    if (i < N - 1) fo << " ";

}

fo.close();

return 0;

}

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

Bài cb137: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13 15 17 19 20 22 26 28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải đếm số phần tử từ đầu đến A[i] >B[i] và ghi vào vị trí C[i]. Em hãy viết chương trình giúp bạn Truong giải quyết bài toán này.

File input là tập B tên cb137.txt  1 22 3 26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20

File output là tập C tên Kqcb137.txt  Tap C ma hoa cua tap B theo quy tac bai toan la:

0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 10 5 11

Gợi ý code:

#include <iostream>

#include <vector>

#include <fstream>

#include <cstdlib>

#include <algorithm>

using namespace std;

 

int main(int argc, char** argv){

cout << "Chuong trinh cb137 \n";

ifstream fin("cb137.txt");

if (!fin.is_open()) {

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

    return 0;

}

vector<int> vo;

int x;

while(fin >> x){

    if(x > 1e9||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;

}

vector<int>A=vo,C;

sort(A.begin(),A.end());

for(int i=0;i<vo.size();i++){

           int dem=0;

           for(int j=0;j<=i;j++){

                     if(A[j]>vo[i]) dem++;

           }vc.push_back(dem);

}

ofstream fout("Kqcb137.txt");

cout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

fout<<"Tap C ma hoa cua tap B theo quy tac bai toan la: \n";

for(auto c:vc){

           cout<<c<<" ";

           fout<<c<<" ";

}fout.close(); return 0;

}

Chú ý:

Lệnh vo.erase(vo.begin() + pos); xóa phần tử thứ pos+1;

  • vo.begin() là iterator trỏ đến phần tử đầu tiên.
  • vo.begin() + pos trỏ đến phần tử thứ pos (tính từ 0).
  • Khi gọi erase, phần tử đó sẽ bị xóa, và các phần tử phía sau sẽ tự động dịch trái để lấp chỗ trống.

 Ví dụ minh họa:

#include <iostream>

#include <vector>

using namespace std;

 

int main() {

    vector<int> vo = {10, 20, 30, 40, 50};

 

    int pos = 2; // muốn xóa phần tử thứ 3 (giá trị 30)

    vo.erase(vo.begin() + pos);

 

    for (int x : vo) cout << x << " ";

    return 0;

}

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

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

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

Bai cb138. Trên một con đường có bố trí sẵn một số bóng đèn. Sơ đồ bố trí các bóng đèn trên con đường được biểu diễn bằng một xâu kí tự gồm kí tự chữ cái D đại diện cho bóng đèn và giữa hai kí tự chữ cái D có một vài kí tự chữ số biểu diễn cho một số nguyên dương là khoảng cách giữa hai bóng đèn này (đơn vị mét).

Yêu cầu: xác định khoảng cách (đơn vị mét) giữa bóng đèn đầu tiên và bóng đèn cuối cùng trên con đường.

File input: cb138.txt   VD: D3D2D10D200D500D

File Output: Kqcb138.txt  Tong khoang cach giua bong den dau tien va cuoi cung tren duong la: 715 met

Gợi ý code:

#include <bits/stdc++.h>

using namespace std;

int main(){

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

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

string s;

cin>>s;

long long T=0,num=0;

for(int i=0;i<s.size();i++){

if(s[i]=='D'){

T = T+ num;

num=0;

} else{

    num=num*10+(int(s[i]-48));

}}

cout<<"Tong khoang cach giua bong den dau tien va cuoi cung tren duong la: "<<T<<" met \n";

return 0;

}

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

Bài 139. Một số nguyên gọi là không chứa chính phương nếu nó không chia hết cho bất kỳ số nguyên nào dạng x 2  với x>1. Hãy tìm ước lớn nhất không chưa chính phương của số nguyên n.

Gợi ý code:

#include <bits/stdc++.h>

using namespace std;

int main(){

cout<<"Ban hay nhap so nguyen duong n=";

int n;

cin>>n;

int uln=1;

for(int i=sqrt(n)-1;i>=2;i--){

if(n%i==0) uln=n/i;

}

cout<<"Uoc lon nhat khong phai la chinh phuong cua "<<n<<" la: "<<uln;

return 0;

}

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

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

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

Không có nhận xét nào:

Đăng nhận xét

sunrise.tqb@gmail.com