You are on page 1of 373

ĐẾM SỐ PHẦN TỬ LỚN HƠN SỐ ĐỨNG TRƯỚC

Bài làm tốt nhất


Cho một dãy số nguyên dương có n phần tử (2<=n<=50). Hãy liệt kê số các phần tử trong dãy
không nhỏ hơn các số đứng trước nó (tính cả phần tử đầu tiên).

Input: Dòng 1 ghi số bộ test. Mỗi bộ test ghi ra 2 dòng: dòng 1 là số phần tử, dòng thứ 2 ghi
dãy số.

Output: ghi ra số phần tử thỏa mãn.

Ví dụ:

Input Output
1 5

3568429

#include <stdio.h>
int main(){

int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
int n,i;
scanf("%d", &n);
int a[n];
int d=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int max=a[0];
for(i=0;i<n;i++){
if(a[i]>= max){
d++;
max=a[i];
}
}
printf("%d",d);
printf("\n");
}
return 0;
}

ĐẾM SỐ LẦN XUẤT HIỆN 2

Bài làm tốt nhất


Cho dãy số A có n phần tử chỉ bao gồm các số nguyên dương (không quá 105). Hãy đếm xem mỗi số
xuất hiện bao nhiêu lần.

Input: Dòng đầu tiên ghi số bộ test. Với mỗi bộ test: dòng đầu ghi số n (không quá 100); dòng tiếp
theo ghi n số của dãy.

Output: Với mỗi bộ test ghi ra thứ tự bộ test, sau đó lần lượt là các số nguyên tố trong dãy theo thứ
tự xuất hiện trong dãy và số lần xuất hiện của nó.

Ví dụ:

Input Output
1 Test 1:

10 1 xuat hien 2 lan

1728332132 7 xuat hien 1 lan

2 xuat hien 3 lan

8 xuat hien 1 lan

3 xuat hien 3 lan

#include<stdio.h>
int b[10001];
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){

int n,i,d=0,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}
printf("Test %d:\n",k+1);
for(i=0;i<n;i++){
int kt=0;

for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;

}
}
if(kt==0) printf("%d xuat hien %d lan\n",a[i],b[a[i]]);
}
for(i=0;i<n;i++){
b[a[i]]=0;
}
printf("\n");
}
}

ĐẾM CÁC SỐ NGUYÊN TỐ TRONG DÃY

Bài làm tốt nhất


Cho dãy số A có n phần tử chỉ bao gồm các số nguyên dương (không quá 105). Hãy xác định các số
nguyên tố trong dãy và đếm xem mỗi số xuất hiện bao nhiêu lần.

Input: Dòng đầu tiên ghi số bộ test. Với mỗi bộ test: dòng đầu ghi số n (không quá 100); dòng tiếp
theo ghi n số của dãy.

Output: Với mỗi bộ test ghi ra thứ tự bộ test, sau đó lần lượt là các số nguyên tố trong dãy theo thứ
tự từ nhỏ đến lớn và số lần xuất hiện của nó.
Ví dụ:

Input Output
1 Test 1:

10 2 xuat hien 3 lan

1728332132 3 xuat hien 3 lan

7 xuat hien 1 lan

#include<stdio.h>
#include<math.h>
int b[10001];
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){

int n,i,d=0,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
if(nt(a[i])==1) b[a[i]]++;
}
printf("Test %d:\n",k+1);
int kt;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
int z=a[j];
a[j]=a[i];
a[i]=z;
}
}
}
for(i=0;i<n;i++){

if(nt(a[i])==1){
kt=0;
for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;

}
}

if(kt==0) printf("%d xuat hien %d lan\n",a[i],b[a[i]]);


}

}
for(i=0;i<n;i++){
b[a[i]]=0;
}
printf("\n");
}
}

SỐ CẶP BẰNG NHAU TRONG DÃY


Bài làm tốt nhất
Viết chương trình đếm các cặp số bằng nhau liên tiếp trong dãy số nguyên.

Input: Dòng đầu tiên ghi số bộ test. Mỗi bộ test có hai dòng:

 Dòng đầu ghi số phần tử của dãy, không quá 30


 Dòng tiếp theo ghi các phần tử của dãy, mỗi phần tử cách nhau một khoảng trống. Các phần tử
không quá 100.

Output: Mỗi bộ test viết ra trên một dòng giá trị tổng chữ số tương ứng

Ví dụ:

Input Output
2 1

4 6

1 3 3 4

12

1 2 3 3 3 3 4 4 5 5 5 1

#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){

int n,i,d=0,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]==a[i+1]) d++;

}
printf("%d",d);
printf("\n");
}
}

MA TRẬN CHUYỂN VỊ

Bài làm tốt nhất


Viết chương trình nhập một ma trận số nguyên dương cỡ M*N với 2<N,M<10, các số không
quá 100. Hãy in ra chuyển vị của ma trận đó.

Dữ liệu vào

Mỗi bộ test viết trên một dòng hai số N và M lần lượt là số hàng và số cột của ma trận
(2<N,M<10). Tiếp thep là N dòng ghi các số của ma trận.

Kết quả

In ra ma trận chuyển vị tương ứng.

Ví dụ

Input Output
2 3 1 3
1 2 4 2 4
3 4 0
4 0

#include<stdio.h>
int main(){
int n,m,i,j;
scanf("%d %d",&m,&n);
int a[m][n];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%d ",a[j][i]);
}
printf("\n");
}
}

LOẠI BỎ HÀNG VÀ CỘT ĐẦU TIÊN RA KHỎI MA TRẬN

Bài làm tốt nhất


Cho một ma trận cấp M*N chỉ bao gồm các số nguyên dương không quá 1000. Hãy viết
chương trình trước hết loại bỏ hàng đầu tiên sau đó loại bỏ cột đầu tiên ra khỏi ma trận.

Input: Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng hai số N và M lần lượt là
số hàng và số cột của ma trận (2<N,M<10). Tiếp thep là N dòng ghi các số của ma trận.

Output:Mỗi bộ test viết ra thứ tự bộ test, sau đó là ma trận sau khi xử lý.

Ví dụ

Input Output
1 Test 1:
3 3
1 2 4 4 0
3 4 0 3 5
6 3 5

#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){

int n,m,i,j;
scanf("%d %d",&m,&n);
int a[m][n];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
printf("Test %d:\n",k+1);
for(i=1;i<m;i++){
for(j=1;j<n;j++){
printf("%d ",a[i][j]);

}
printf("\n");
}
}
printf("\n");
}

ĐẾM SỐ TỪ TRONG XÂU

Bài làm tốt nhất


Một từ trong xâu ký tự được định nghĩa là một dãy ký tự liên tiếp không có khoảng trống.
Hãy đếm số từ của xâu và in kết quả ra màn hình.

Dữ liệu vào: Dòng đầu ghi số bộ test. Mỗi bộ test có một xâu không quá 200 ký tự.

Kết quả: Ghi ra số từ đếm được.

Ví dụ:

Input Output
2 5

Lap trinh C va C++ 2

ACBDSDS kdfjdkgfdgkhfgjlfgdkjfdgdgfdgfd

#include<stdio.h>
#include<string.h>
int main(){
int t,k;
char a[1000];
scanf("%d",&t);
scanf("\n");
for(k=0;k<t;k++){
gets(a);
int d;
if(a[0]==' ') d=0;
else d=1;
int l=strlen(a);
while(a[l-1]==' '){
l--;
}
for(int i=0;i<l;i++){
if(a[i]==' ' && a[i+1]!=' ') d++;
}
printf("%d",d);
printf("\n");
}
}

SỐ ĐẸP 1

Bài làm tốt nhất


Một số được coi là đẹp nếu đó là số thuận nghịch và chỉ toàn các chữ số chẵn. Viết chương
trình đọc vào các số nguyên dương có không quá 500 chữ số và kiếm tra xem số đó có đẹp
hay không.

Input:

Dòng đầu tiên ghi số bộ test.

Mỗi bộ test viết trên một dòng số nguyên dương n không quá 500 chữ số.

Output:

Mỗi bộ test viết ra trên một dòng chữ YES nếu đó là số đẹp, chữ NO nếu ngược lại

Ví dụ

Input Output
4 NO

123456787654321 YES
86442824468 YES

8006000444422220000222244440006008 NO

235365789787654324567856578654356786556

#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
char a[501];
gets(a);
int i,l=strlen(a);
int n=l/2;
int kt=1;
for(i=0;i<=n;i++){
if(a[i]%2!=0 || a[l-1-i]%2!=0 || a[i]!=a[l-1-i]){
printf("NO");
kt=0;
break;
}
}
if(kt==1) printf("YES");

printf("\n");
}
}

SỐ ĐẸP 2

Bài làm tốt nhất


Một số được coi là đẹp nếu đó là số thuận nghịch, bắt đầu và kết thúc bằng chữ số 8 và tổng
chữ số chia hết cho 10. Viết chương trình đọc vào các số nguyên dương có không quá 500
chữ số và kiếm tra xem số đó có đẹp hay không.
Input:

Dòng đầu tiên ghi số bộ test.

Mỗi bộ test viết trên một dòng số nguyên dương n không quá 500 chữ số.

Output:

Mỗi bộ test viết ra trên một dòng chữ YES nếu đó là số đẹp, chữ NO nếu ngược lại

Ví dụ

Input Output
4 NO

123456787654321 NO

8644281154664511824468 YES

8006000444400000000000044440006008 YES

82123400000000000000000000000432128

#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
char m[501];
gets(m);
int i,l=strlen(m);
int n=(l-1)/2;
int kt=1;
int s=0;
int a[strlen(m)];
for(i=0;i<l;i++){
a[i]=m[i]-48;
s=s+a[i];

}
for(i=0;i<=n;i++){

if(a[0]!=8 || a[l-1]!=8 || a[i]!=a[l-1-i]||s%10!=0){


printf("NO");
kt=0;
break;
}
}

if(kt==1 ) printf("YES");

printf("\n");
}
}

SỐ ĐẸP 3

Bài làm tốt nhất


Một số được coi là đẹp nếu đó là số thuận nghịch và chỉ toàn các chữ số nguyên tố. Viết
chương trình đọc vào các số nguyên dương có không quá 500 chữ số và kiếm tra xem số đó
có đẹp hay không.

Input:

Dòng đầu tiên ghi số bộ test.

Mỗi bộ test viết trên một dòng số nguyên dương n không quá 500 chữ số.

Output:

Mỗi bộ test viết ra trên một dòng chữ YES nếu đó là số đẹp, chữ NO nếu ngược lại

Ví dụ

Input Output
3 NO

123456787654321 YES
235755557532 YES

2222333355557777235775327777555533332222

#include<stdio.h>
#include<string.h>
#include<math.h>
int b[10001];
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
char m[501];
gets(m);
int i,l=strlen(m);
int n=(l-1)/2;
int kt=1,d=1;
int s=0;
int a[strlen(m)];
for(i=0;i<l;i++){
a[i]=m[i]-48;
if(nt(a[i])==0){
d=0;
break;
}

}
if(d==0) printf("NO");
else{
for(i=0;i<=n;i++){

if( a[i]!=a[l-1-i]){
printf("NO");
kt=0;
break;
}
}

if(kt==1 ) printf("YES");
}
printf("\n");
}
}

TÁCH TỪ

Bài làm tốt nhất


Nhập xâu ký tự S có độ dài không quá 100. Một từ được định nghĩa là một dãy ký tự
không có khoảng trống.

Hãy tách xâu S thành các từ, mỗi từ in trên một dòng.

Input:

Chỉ có một dòng ghi xâu S (độ dài không quá 100)

Output:

Ghi ra kết quả.

Ví dụ:
Input Output
Tin hoc co so 2 Tin

hoc

co

so

#include<stdio.h>
#include<string.h>
int main(){
char a[100];
gets(a);
int l=strlen(a);
for(int i=0;i<l;i++){
if(a[i]==' ') {
a[i]='\n';
}
printf("%c",a[i]);
}
}

ƯỚC SỐ CHUNG LỚN NHẤT

Bài làm tốt nhất


Viết chương trình tính ước số chung lớn nhất của 2 số nguyên dương (không quá 6 chữ số).

Input

Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng hai số nguyên dương.

Output

Mỗi bộ test ghi ra kết quả tính được trên một dòng.

Ví dụ

Input Output
2 2

24 14 25

75 125

#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d %d",&a,&b);
while(a%b!=0){
int d=a%b;
a=b;
b=d;
}
printf("%d\n",b);
}
}

SỐ CHẴN ĐẶC BIỆT

Bài làm tốt nhất


Một số gọi là số chẵn đặc biệt nếu nó là số chẵn và tất cả các chữ số đều chẵn. Viết
chương trình kiểm tra xem số đã cho có phải là số chẵn đặc biệt hay không.

Input

 Dòng đầu ghi số bộ test


 Mỗi bộ test ghi số N không quá 18 chữ số

Output

 Với mỗi bộ test, nếu N là số chẵn đặc biệt thì ghi ra YES, ngược lại ghi ra NO
trên một dòng

Ví dụ
Input Output
2 NO

123456 YES

22446688000000

#include<stdio.h>
int kt(long long a){
if(a%2==1) return 0;
else {
while(a>0){
int d=a%10;
if(d%2==1) return 0;
a=a/10;
}
return 1;
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long long n;
scanf("%lld",&n);
if(kt(n)==1) printf("YES\n");
else printf("NO\n");
}
}

SỐ KHÔNG GIẢM

Bài làm tốt nhất


Một số gọi là số không giảm nếu các chữ số từ trái qua phải tạo thành dãy không giảm
(tức là không có chữ số nào phía sau nhỏ hơn chữ số ngay trước nó). Viết chương trình
liệt kê các số không giảm có N chữ số (1<N<7).
Input

 Dòng đầu ghi số bộ test


 Mỗi bộ test ghi số N

Output

 Với mỗi bộ test, ghi ra lần lượt các số không giảm có N chữ số, các số cách
nhau một khoảng trống.
 Hết một bộ test thì xuống dòng.

Ví dụ

Input Output
1 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28
29 33 34 35 36 37 38 39 44 45 46 47 48 49 55 56
2 57 58 59 66 67 68 69 77 78 79 88 89 99

#include<stdio.h>
int nt(long a){
int e=a%10;
a=a/10;
while(a>0){
int d=a%10;
if(e<d) return 0;
e=d;
a/=10;
}
return 1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long n;
scanf("%ld",&n);
long x=1,y,i;
while(n--){
x=x*10;
}
y=x/10;
for(i=y;i<x;i++){
if(nt(i)==1) printf("%ld ",i);
}
printf("\n");
}

CẶP SỐ

Bài làm tốt nhất


Cho hai cặp số (a,b) và (c,d). Hãy tính toán xem ước số chung lớn nhất của hai cặp số
này có bằng nhau hay không.

Input

 Dòng đầu ghi số bộ test


 Mỗi bộ test ghi số 4 số a, b, c, d. Các số không quá 109

Output

 Với mỗi bộ test, ghi ra YES nếu 2 cặp số (a,b) và (c,d) có ước chung lớn nhất
bằng nhau, ngược lại ghi ra NO trên một dòng.

Ví dụ

Input Output
2 NO

2 4 4 8 YES

3 5 7 9

#include<stdio.h>
long ucln(long a, long b){
long d;
while(a%b!=0){
d=a%b;
a=b;
b=d;
}
return b;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long a,b,c,d;
scanf("%ld %ld %ld %ld",&a,&b,&c,&d);
if(ucln(a,b)==ucln(c,d)) printf("YES");
else printf("NO");

printf("\n");
}
}

ĐẾM SỐ NGUYÊN TỐ

Bài làm tốt nhất


Viết chương trình đếm xem trong đoạn [a,b] có bao nhiêu số là số nguyên tố và tất cả
các chữ số của nó cũng là số nguyên tố.

Input

 Dòng đầu ghi số bộ test


 Mỗi bộ test ghi 2 số a, b (1<a<b<106)

Output

 Với mỗi bộ test, ghi ra số lượng số thỏa mãn trên một dòng.

Ví dụ

Input Output
2 4
10 100 26

1234 5678

#include<stdio.h>
#include<math.h>
int nt(int a){
if(a<2) return 0;
else{
for(int i=2;i<=sqrt(a);i++){
if(a%i==0) return 0;
}
return 1;
}
}
int ktsnt(int a){
if(nt(a)==0) return 0;
else{
while(a>0){
int d=a%10;
if(nt(d)==0) return 0;
a=a/10;
}
return 1;
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b;
int d=0;
scanf("%d %d",&a,&b);
for(int i=a;i<=b;i++){
if(ktsnt(i)==1) d++;
}
printf("%d",d);
printf("\n");
}
}

PHÂN TÍCH THỪA SỐ NGUYÊN TỐ

Bài làm tốt nhất


Hãy phân tích một số nguyên dương thành tích các thừa số nguyên tố.

Input

Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng số nguyên dương n không
quá 9 chữ số.

Output

Mỗi bộ test viết ra kết quả phân tích theo mẫu như trong ví dụ (chú ý: giữa các số với
dấu * có một khoảng trống.

Ví dụ

Input Output
3 60 = 2^2 * 3^1 * 5^1

60 128 = 2^7

128 10000 = 2^4 * 5^4

10000

#include<stdio.h>
#include<math.h>
void nt(long a){
for(int i=2;i<=sqrt(a);i++){
int d=0;
while(a%i==0){
d++;
if(i==a) printf(" %d^%d\n",i,d);
a=a/i;
if(a%i!=0 && a!=1) printf(" %d^%d *",i,d);

}
}
if(a>1) printf(" %d^1\n",a);
}

int main(){
int t;
scanf("%d",&t);
while(t--){
long a;
scanf("%ld",&a);
printf("%ld =",a);
nt(a);
}
}

SỐ SMITH

Bài làm tốt nhất


Một số Smith là một số tự nhiên thỏa mãn tổng các chữ số của nó bằng với tổng các
chữ số của các thừa số nguyên tố của nó.

Nhiệm vụ của bạn là hãy xác định xem số nguyên N đã cho có là số Smith hay không?

Ví dụ 1:

378 = 2 x 3 x 3 x 3 x 7

Tổng các chữ số là 3 + 7 + 8 = 18.

Tổng các chữ số của các nhân tử là 2 + 3 + 3 + 3 + 7 = 18.

Ví dụ 2:

4937775 = 3 x 5 x 5 x 65837.

Ta có 4+9+3+7+7+7+5 = 42 = 3+5+5+6+5+8+3+7.
Input

 Chỉ có một số nguyên dương N không quá 9 chữ số.

Output

 In ra “YES” nếu số đã cho là số Smith, in ra “NO” trong trường hợp ngược lại.

Ví dụ:

Input Output
378 YES
120 NO

#include <stdio.h>
#include<stdio.h>
#include<math.h>
long tong1(long n){
long s=0;
while(n>0){
s=s+n%10;
n=n/10;
}
return s;
}
long tong2(long n){
long s=0;
for(int i=2;i<=sqrt(n);i++){
while(n%i==0){
int j=i;
while(j>0){
s=s+j%10;
j=j/10;
}
n=n/i;
}
}
if(n>1){
while(n>0){
s=s+n%10;
n=n/10;
}
}
return s;
}
int main(){
long a;
scanf("%ld",&a);
if(tong1(a)!=tong2(a) || a<2) printf("NO\n");
else printf("YES\n");

HÌNH VUÔNG

Bài làm tốt nhất


Cho 2 đỉnh là góc dưới bên trái và góc trên bên phải của hình chữ nhật trong hệ tọa độ
Oxy. Hãy kiểm tra xem đó có phải là hình vuông hay không.

Input

Dòng đầu ghi số bộ test

Mỗi test có 4 số nguyên a,b,c,d.

Trong đó (a,b) là tọa độ điểm góc dưới bên trái, (c,d) là tọa độ góc trên bên phải (-
1000 <a<c<1000; -1000<b<d<1000)

(a luôn nhỏ hơn c; b luôn nhỏ hơn d).

Output

Ghi ra YES hoặc NO tương ứng với kết quả kiểm tra

Ví dụ

Input Output
2 YES
1 1 3 3 NO

1 2 3 7

#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){

int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(x2-x1==y2-y1) printf("YES\n");
else printf("NO\n");
}
}

SỐ GIẢM

Bài làm tốt nhất


Một số gọi là số giảm nếu các chữ số từ trái qua phải tạo thành dãy giảm (tức là chữ số
phía sau nhỏ hơn chữ số ngay trước). Viết chương trình đếm các số giảm có trong
đoạn [a,b].

Input

 Dòng đầu ghi số bộ test


 Mỗi bộ test ghi 2 số a,b (1<a<b<108)

Output

 Với mỗi bộ test, ghi ra số lượng các số giảm đếm được.

Ví dụ

Input Output
1 45

10 100
#include<stdio.h>
int kt(long long a){
int e=a%10;
a=a/10;
int d=a%10;
while(a>0){
if(e>=d) return 0;
e=d;
a=a/10;
d=a%10;
}
return 1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){

long a,b,dem=0;
scanf("%ld %ld",&a,&b);
for(long i=a;i<=b;i++){
if(kt(i)==1) dem++;
}
printf("%ld\n",dem);
}
}

CHỮ SỐ 4

Bài làm tốt nhất


Nam rất ghét chữ số 4 nên không muốn xuất hiện chữ số 4 trong các số may mắn của
mình. Dãy số may mắn của Nam có N chữ số và phải thỏa mãn tính chất thuận nghịch,
tổng chữ số phải chia hết cho 10.

Cho số N, hãy liệt kê các số may mắn của Nam với đúng N chữ số.

Input
 Dòng đầu ghi số bộ test
 Mỗi bộ test ghi số N (1<N<7)

Output

 Với mỗi bộ test, ghi ra lần lượt các số may mắn có N chữ số, các số cách nhau
một khoảng trống.
 Hết một bộ test thì xuống dòng.

Ví dụ

Input Output
2 55

2 181 262 505 686 767 929

#include<stdio.h>
int kt(long a){
long s=0,m=a,b=0;
while(a>0){
int d=a%10;
if(d==4) return 0;
s=s+d;
b=b*10+d;
a=a/10;
}
if(s%10==0 && b==m) return 1;
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
long a,b=1;
while(n--){
b*=10;
}
a=b/10;

for(long i=a;i<b;i++){
if(kt(i)==1) printf("%ld ",i);
}
printf("\n");
}
}

CÂN BẰNG CHẴN LẺ

Bài làm tốt nhất


Một số được gọi là “cân bằng chẵn lẻ” nếu số chữ số chẵn và số chữ số lẻ là bằng
nhau. Tất nhiên khi đó số chữ số của nó phải là chẵn.

Cho số N là một số chẵn (1<N<7). Hãy liệt kê các số cân bằng chẵn lẻ có N chữ số.
Mỗi dòng ghi ra 10 số thỏa mãn.

Input

Chỉ có duy nhất số N (chẵn)

Output

Ghi ra các số cân bằng chẵn lẻ có N chữ số theo thứ tự từ nhỏ đến lớn. Mỗi dòng ghi
10 số.

Ví dụ

Input Output
2 10 12 14 16 18 21 23 25 27 29

30 32 34 36 38 41 43 45 47 49

50 52 54 56 58 61 63 65 67 69

70 72 74 76 78 81 83 85 87 89

90 92 94 96 98

#include<stdio.h>
#include<math.h>
int kt(long a){
long l=0,c=0;
while(a>0){
int d=a%10;
if(d%2==1) l++;
if(d%2==0) c++;
a=a/10;
}
if(l==c) return 1;
return 0;
}
int main(){
int n;
scanf("%d",&n);
long a,b=1;
while(n--){
b=b*10;
}
a=b/10;
int dem=0;
for(long i=a;i<b;i++){
if(kt(i)==1){
dem++;
printf("%ld ",i);
}
if(dem==10){
printf("\n");
dem=0;
}

}
}

SỐ ƯU THẾ CHẴN

Bài làm tốt nhất


Một số được gọi là số ưu thế chẵn nếu nó là số chẵn và số chữ số chẵn nhiều hơn số
chữ số lẻ. Hãy viết chương trình kiểm tra một số có phải ưu thế chẵn hay không.

Input

 Dòng đầu ghi số bộ test


 Mỗi dòng tiếp theo ghi một số nguyên dương không quá 18 chữ số

Output

 Ghi ra YES hoặc NO tùy thuộc kết quả kiểm tra

Ví dụ

Input Output
2 NO

12345 YES

22566678800

#include<stdio.h>
#include<math.h>
int kt(long long a){
long long l=0,c=0;
if(a%2==1) return 0;
while(a>0){
int d=a%10;
if(d%2==1) l++;
if(d%2==0) c++;
a=a/10;
}
if(l<c) return 1;
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long long n;
scanf("%lld",&n);
if(kt(n)==1) printf("YES\n");
else printf("NO\n");
}
}

SỐ ƯU THẾ LẺ

Bài làm tốt nhất


Một số được gọi là số ưu thế lẽ nếu nó là số lẻ và số chữ số lẻ nhiều hơn số chữ số
chẵn. Hãy viết chương trình kiểm tra một số có phải ưu thế lẻ hay không.

Input

 Dòng đầu ghi số bộ test


 Mỗi dòng tiếp theo ghi một số nguyên dương không quá 18 chữ số

Output

 Ghi ra YES hoặc NO tùy thuộc kết quả kiểm tra

Ví dụ

Input Output
2 YES

12345 NO

22566678801

#include<stdio.h>
#include<math.h>
int kt(long long a){
long long l=0,c=0;
if(a%2==0) return 0;
while(a>0){
int d=a%10;
if(d%2==1) l++;
if(d%2==0) c++;
a=a/10;
}
if(l>c) return 1;
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long long n;
scanf("%lld",&n);
if(kt(n)==1) printf("YES\n");
else printf("NO\n");
}
}

KHOẢNG CÁCH

Bài làm tốt nhất


Cho 2 điểm A trong không gian Oxy. Hãy tính khoảng cách giữa hai điểm đó.

Input

 Dòng đầu ghi số bộ test, không quá 20.


 Mỗi bộ test có 4 số thực lần lượt là tọa độ của 2 điểm A và B, giá trị tuyệt đối
không quá 1000.

Ouput

Với mỗi bộ test, viết ra khoảng cách giữa 2 điểm với 4 chữ số sau dấu phẩy.

Ví dụ

Input Output
2 5.0000

0 0 0 5 193.0648

0 199 5 6

#include<stdio.h>
#include<math.h>
main(){
int t;
scanf("%d",&t);
while(t--){
float x1,y1,x2,y2;
scanf("%f %f %f %f",&x1,&y1,&x2,&y2);
/* float kc=(float) sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));*/
printf("%.4f\n",sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)));
}
}

ĐIỂM TRUNG TÂM

Bài làm tốt nhất


Trên tờ giấy A4, Nam đã đánh dấu sẵn N điểm từ 1 đến N và liệt kê danh sách N-1 đoạn
thẳng nối các điểm với nhau. Nam nhờ Bình kiểm tra giúp xem với danh sách N-1 đoạn thẳng
đó thì có điểm nào là điểm trung tâm hay không.

Một điểm được coi là trung tâm nếu nó có đoạn thẳng nối với tất cả N-1 điểm còn lại.

Input

 Dòng đầu tiên ghi số N (1 ≤ N ≤ 105).


 N-1 dòng tiếp theo, mỗi dòng ghi ra một đoạn thẳng.

Kết quả

 Ghi ra trên một dòng chữ “Yes” nếu tồn tại điểm trung tâm; chữ “No” trong trường
hợp ngược lại.

Ví dụ

Input Output
5 Yes
1 2
1 3
1 4
1 5

#include<stdio.h>
int c[1000000];
int main(){
int n,a,b;
scanf("%d",&n);
for(int i=0;i<n-1;i++){
scanf("%d %d",&a,&b);
c[a]++;
c[b]++;
}int kt=0;
for(int i=1;i<=n;i++){
if(c[i]>=n-1){
kt=1;break;
}
}
if(kt==0)printf("No");
else printf("Yes");

CẶP SỐ NGUYÊN TỐ

Bài làm tốt nhất


Cho số nguyên dương chẵn N>2. Hãy liệt kê các cặp số nguyên tố p, q có tổng đúng bằng N.
Ví dụ N = 6 ta có 1 cặp số nguyên tố là 3 + 3 =6.

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào các bộ test. Mỗi bộ test là một số chẵn N.
 T, N thỏa mãn ràng buộc : 1≤T≤100; 4≤N≤10000.

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input Output
2
33
6
3 29 13 19
32
#include<stdio.h>
#include<math.h>
int b[10099];
main(){
int t;
scanf("%d",&t);
for(int i=2;i<10009;i++){
if(b[i]==0){
for(int j=i*2;j<10009;j=j+i){
b[j]=1;
}
}
}
while(t--){
int n;
scanf("%d",&n);
int k=0;
int a[10001];
for(int i=2;i<=n;i++){
if(b[i]==0){
a[k++]=i;
}
}
for(int i=0;i<k;i++){
for(int j=i;j<k;j++){
if(a[i]+a[j]==n){
printf("%d %d ",a[i],a[j]);
}
}
}
printf("\n");
}
}
Giá trị trung bình của một mảng

Bài làm tốt nhất


Cho một dãy N các phần tử nguyên. Tính giá trị trung bình (để sau dấu phẩy đúng 3 chữ số)

Input:

Hai dòng, dòng đầu là số phần tử; dòng tiếp theo sau là dòng các phần tử

Output:

Giá trị trung bình của dãy với 3 chữ số sau dấu phảy

Ví dụ minh họa
Input Output
4
2.250
2 4 1 2

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int i;
int a[n];
long s=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
s=s+a[i];
}
float d=(float) s/n;
printf("%.3f",d);
}

CẮT ĐÔI

Bài làm tốt nhất

Với một vài số nguyên dương có 1 chữ số, khi cắt đôi số đó theo chiều ngang và lấy
nửa phía trên thì ta vẫn có một số nguyên. Cụ thể:
 Số 0 cắt đôi vẫn ra số 0
 Số 1 cắt đôi vẫn ra số 1
 Số 8 cắt đôi ra số 0
 Số 9 cắt đôi ra số 0
 Các số khác cắt đôi sẽ không hợp lệ.

Cho một số nguyên dương không quá 18 chữ số. Hãy in ra kết quả “cắt đôi” của số đó.

Nếu không hợp lệ thì ghi ra INVALID. Chú ý: nếu cắt đôi ra một dãy toàn 0 thì cũng
được coi là không hợp lệ. Kết quả cắt đôi thì không tính chữ số 0 ở đầu.

Input

Dòng đầu ghi số bộ test. Mỗi bộ test ghi một số nguyên dương không quá 18 chữ số.

Output

Ghi ra kết quả tính toán

Ví dụ

Input Output
3 1000

1890 INVALID

3681 10

8919

#include<stdio.h>
main(){
int t;
scanf("%d",&t);
while(t--){
long long n;
scanf("%lld",&n);
long long x=1,kt=0,e,s=0;
while(n>0){
int d=n%10;
if(d!=1 && d!=0 && d!=8 && d!=9){
kt=1;
break;
}
if(d==1) e=1;
if(d==0 || d==8 || d==9) e=0;

s=e*x+s;
x=x*10;
n=n/10;
}
if(kt==1 || s==0) printf("INVALID\n");
else printf("%lld\n",s);
}
}

MÃ SỐ QUỐC GIA

Bài làm tốt nhất

Trong mã hàng hóa người ta thường ghi kèm theo mã số quốc gia sản xuất. Nếu sản
xuất tại Việt Nam thì mã tương ứng là 084. Bài toán đặt ra là cho một dãy mã dạng số
nguyên không quá 18 chữ số. Hãy loại bỏ đoạn mã 084 ra khỏi mã ban đầu.

Dữ liệu đảm bảo dãy mã luôn có duy nhất một lần cụm 084.

Input

Dòng đầu ghi số bộ test. Mỗi test là một số nguyên có ít nhất 4 chữ số nhưng không
quá 18 chữ số.

Output

Ghi ra kết quả sau khi loại bỏ 084

Ví dụ

Input Output
3 123567

123084567 3300478845

3300478808445 1

1084
#include<stdio.h>
#include<string.h>
int b[1000];
main(){
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
char a[20];
gets(a);
int n=strlen(a);
for(int i=0;i<n;i++){
if(a[i]=='0' && a[i+1]=='8'&& a[i+2]=='4'){
b[i]=1;
b[i+1]=1;
b[i+2]=1;
}
}
for(int i=0;i<n;i++){
if(b[i]!=1) printf("%c",a[i]);
}
for(int i=0;i<n;i++){
b[i]=0;
}
printf("\n");

}
}

SỐ ĐẸP

Bài làm tốt nhất


Một số được coi là đẹp nếu chữ số đầu gấp đôi chữ số cuối hoặc ngược lại; đồng thời
các chữ số từ vị trí thứ 2 đến gần cuối thỏa mãn là một số thuận nghịch.

Ví dụ: các số 36788766; 12345654322 là các số đẹp.

Viết chương trình kiểm tra số đẹp theo tiêu chí trên.

Input

 Dòng đầu ghi số bộ test


 Mỗi test là một số nguyên dương không quá 18 chữ số

Output

 Ghi ra YES tương ứng với số đẹp, NO trong trường hợp ngược lại

Ví dụ

Input Output
3 YES

36788766 YES

22345654321 NO

12345654321

#include<stdio.h>
#include<string.h>
int b[1000];
int kt(char a[]){
int l=strlen(a);
for(int i=0;i<l;i++){
a[i]=a[i]-48;
}
if(a[0]!=2*a[l-1] && a[0]*2!=a[l-1]) return 0;
for(int i=1;i<l/2;i++){
if(a[i]!=a[l-1-i]) return 0;
}
return 1;
}
main(){
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
char a[20];
gets(a);
if(kt(a)==1) printf("YES");
else printf("NO");
printf("\n");

}
}

MA TRẬN XOẮN ỐC 1

Bài làm tốt nhất

Ma trận xoắn ốc cấp N là một ma trận vuông cấp N*N trong đó ghi các số nguyên
dương tăng dần từ 1 đến N*N được điền theo thứ tự xoắn ốc từ ngoài vào trong.

Hãy viết chương trình in ra ma trận xoắn ốc cấp N.

Input:

Chỉ có một dòng ghi số N (1 ≤ N ≤ 100)

Ouput:

Ghi ra ma trận kết quả có N dòng, mỗi giá trị số cách nhau một khoảng trống.

Ví dụ:

Input Output
5 1 2 3 4 5

16 17 18 19 6
15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int m=n,p=n*n;
int x=1,k=0,i,j;
int a[n][n];
while(x<=p){
for(j=k;j<m;j++){
a[k][j]=x++;
}
for(i=k+1;i<m;i++){
a[i][m-1]=x++;
}
for(j=m-2;j>=k;j--){
a[m-1][j]=x++;
}
for(i=m-2;i>k;i--){
a[i][k]=x++;
}
m--;
k++;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}

TẬP TỪ RIÊNG CỦA HAI XÂU 1

Bài làm tốt nhất

Cho hai chuỗi ký tự S1 và S2 độ dài không quá 100.

Hãy viết chương trình tìm các từ chỉ xuất hiện trong S1 mà không xuất hiện trong S2.
Chú ý: mỗi từ chỉ liệt kê 1 lần và sắp xếp theo thứ tự xuất hiện trong từ điển
Input:

Có hai dòng, dòng thứ nhất ghi xâu S1, dòng thứ 2 ghi xâu S2.

Output:

Ghi lần lượt các từ thỏa mãn trên một dòng.

Ví dụ:

Input Output
abc ab ab ab abcd abcd

ab abc

#include<stdio.h>
#include<string.h>
int main(){
char a[101],b[101],s1[101][101],s2[101][101], t[101];
gets(a);
gets(b);
int la=strlen(a), lb=strlen(b), i, j=0,k=0,n=0,m=0;
for(i=0;i<la;i++){
if(a[i]!=' ') s1[n][j++]=a[i];
if(a[i]==' ' || i==la-1) {
n++;
j=0;
}
}
for(i=0;i<lb;i++){
if(b[i]!=' ') s2[m][k++]=b[i];
if(b[i]==' ' || i==lb-1) {
m++;
k=0;
}
}
for(i=0; i<n-1; i++){
for(j=i+1; j<n; j++){
if(strcmp(s1[i],s1[j])>0){
strcpy(t,s1[j]);
strcpy(s1[j],s1[i]);
strcpy(s1[i],t);
}
}
}
for(i=0;i<n;i++){
int kt=0;
for(j=0;j<i;j++){
if(strcmp(s1[i],s1[j])==0){
kt=1;
break;
}
}
for(j=0;j<m;j++){
if(strcmp(s1[i],s2[j])==0){
kt=1;
break;
}
}
if(kt==0) printf("%s ",s1[i]);
}

}
SỐ ĐẸP 3

Bài làm tốt nhất

Một số được coi là số đẹp nếu nó là số thuận nghịch, có chứa ít nhất một chữ số 6, và
tổng các chữ số của nó có chữ số cuối cùng là 8.

Viết chương trình liệt kê trong một đoạn giữa hai số nguyên [a,b] cho trước có bao
nhiêu số đẹp như vậy

Input:

Chỉ có một dòng ghi hai số a,b.

Output:

Ghi ra kết quả tính toán trên một dòng

Ví dụ:

Input Output
1 500 161

#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
if(m>n){
int z=m;
m=n;
n=z;
}

for(int i=m;i<=n;i++){
int x=i,s=0,k=0,kt=0;
while(x>0){

int d=x%10;
if(d==6){
kt++;
}
s=s*10+d;
k=k+d;
x=x/10;
}
if(kt>0 && k%10==8 && s==i) printf("%d ",i);
}
}

TAM GIÁC PASCAL

Bài làm tốt nhất

Tam giác Pascal là tam giác có công thức tính giá trị một vị trí bất kỳ như sau
(n,k) = n!/k!(n-k)!
Trong đó: n là hàng và k là cột.

Người ta thường tận dụng hàm đệ quy để điền các giá trị cho tam giác Pascal.

Viết chương trình sử dụng đệ quy nhập vào số nguyên dương n không quá 10 và in ra tam
giác Pascal tương ứng (lưu ý mỗi phần tử cách nhau 1 khoảng trắng)

Ví dụ:

Input Output
5 1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

#include<stdio.h>
int gt(int a){
int i,s=1;
for(i=1;i<=a;i++){
s=s*i;
}
return s;
}
int main(){
int n,i,j,x;
scanf("%d",&n);
int a[10][10];
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
if(j==0 || j==i) {
x=1;

}
else
{
x=gt(i)/(gt(j)*gt(i-j));

}
printf("%d ",x);
}
printf("\n");
}

HÌNH VUÔNG

Bài làm tốt nhất

Nhập vào kích thước hình vuông (không quá 9). Vẽ hình vuông số theo nguyên tắc
tương ứng theo mẫu trong ví dụ dưới đây.
Input

Chỉ có một số dòng ghi kích thước hình vuông (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

4 4444444

4333334

4322234

4321234

4322234

4333334

4444444

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int m=2*n-1;
int x=n,k=0,i,j;
int a[2*n-1][2*n-1];

while(x>0){
for(j=k;j<m;j++){
a[k][j]=x;
}
for(i=k+1;i<m;i++){
a[i][m-1]=x;
}
for(j=m-2;j>=k;j--){
a[m-1][j]=x;
}
for(i=m-2;i>k;i--){
a[i][k]=x;
}
m--;
k++;
x--;
}
for(i=0;i<2*n-1;i++){
for(j=0;j<2*n-1;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
}

TỔNG CHỮ SỐ CHIA HẾT CHO 5

Bài làm tốt nhất

Viết chương trình nhập vào số nguyên dương n không quá 5 chữ số. Thực hiện liệt kê
các số nguyên tố nhỏ hơn n và thỏa mãn có tổng các chữ số chia hết cho 5. Có bao
nhiêu số như vậy.

Input

Chỉ có một dòng ghi số n.

Output

Gồm hai dòng: dòng đầu liệt kê các số thỏa mãn, dòng thứ 2 ghi số lượng các số tìm
được.

Ví dụ:
Input Output
100 5 19 23 37 41 73

#include<stdio.h>
#include<math.h>
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int tcn(int a){
int s=0;
while(a>0){
s=s+a%10;
a=a/10;
}
return s;
}

int main(){
int n,d=0;
scanf("%d",&n);
for(int i=5;i<n;i++){
if(nt(i)==1 && tcn(i)%5==0){
d++;
printf("%d ",i);}
}
printf("\n%d",d);
}

SỐ THUẬN NGHỊCH KHÔNG CÓ CHỮ SỐ 9

Bài làm tốt nhất

Viết chương trình nhập vào số N không quá 4 chữ số, thực hiện liệt kê các số thuận nghịch
lớn hơn 1 và nhỏ hơn N thỏa mãn không chứa chữ số 9. Có bao nhiêu số như vậy.

Input

Chỉ có một dòng ghi số n.

Output

Gồm hai dòng: dòng đầu liệt kê các số thỏa mãn, dòng thứ 2 ghi số lượng các số tìm được.

Ví dụ:

Input Output
100 2 3 4 5 6 7 8 11 22 33 44 55 66 77 88
15

#include<stdio.h>
int sothuannghich(int a){
int s=0,d;
int x=a;
while(a>0){

if(a%10==9) {
return 0;
break;
}
else s=s*10+a%10;
a=a/10;
}
if(s==x) return 1;
else return 0;
}
int main(){
int n,d=0;
scanf("%d",&n);
for(int i=2;i<n;i++){
if(sothuannghich(i)==1) {
printf("%d ",i);
d++;
}
}
printf("\n%d",d);
}

TAM GIÁC SỐ - 1

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output
5 1

123

12345

1234567

123456789

#include<stdio.h>
int main(){
int n,d=1;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=1;j<=2*d-1;j++){
printf("%d",j);
}
d++;
printf("\n");
}
}

TAM GIÁC SỐ - 2

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ
Input Output

5 1

24

135

2468

13579

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
if(i%2==0){
for(int j=1;j<=2*i+1;j++){
if(j%2==1) printf("%d",j);
}
}
else {
for(int j=2;j<=2*i+2;j++){
if(j%2==0) printf("%d",j);
}
}

printf("\n");
}
}

TAM GIÁC SỐ - 3
Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

5 1

131

13531

1357531

135797531

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
int d=-1;
for(j=1;j<=i+1;j++){
d=d+2;
printf("%d",d);

}
for(j=i+2;j<=2*i+1;j++){
d=d-2;
printf("%d",d);
}
printf("\n");
}
}

TAM GIÁC SỐ - 4

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

5 ~~~~1

~~~131

~~13531

~1357531

135797531

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=n-1-i;j>=1;j--){
printf("~");
}

int d=-1;
for(j=1;j<=i+1;j++){
d=d+2;
printf("%d",d);

}
for(j=i+2;j<=2*i+1;j++){
d=d-2;
printf("%d",d);
}

printf("\n");
}
}

TAM GIÁC SỐ - 5

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output
5 2

242

24642

2468642

2468108642

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){

int d=0;
for(j=1;j<=i+1;j++){
d=d+2;
printf("%d",d);

}
for(j=i+2;j<=2*i+1;j++){
d=d-2;
printf("%d",d);
}

printf("\n");
}
}

TAM GIÁC SỐ - 6

Bài làm tốt nhất


Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

5 ~~~~2

~~~242

~~24642

~2468642

2468108642

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=n-1-i;j>=1;j--){
printf("~");
}

int d=0;
for(j=1;j<=i+1;j++){
d=d+2;
printf("%d",d);
}
for(j=i+2;j<=2*i+1;j++){
d=d-2;
printf("%d",d);
}

printf("\n");
}
}

TAM GIÁC SỐ - 7

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

5 1

26

3 7 10

4 8 11 13

5 9 12 14 15
#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);int m=1;

for(i=1;i<=n;i++){
int e=n-1,d=m;

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

printf("%d ",d);
d=d+e;
e--;
}
m++;
printf("\n");
}
}

TAM GIÁC SỐ - 8

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 9).

Vẽ hình tam giác số theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 9).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output
4 1

32

456

10 9 8 7

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
int d=0,m,a,x;
for(i=1;i<=n;i++){
if(i%2==1){
for(j=1;j<=i;j++){
d++;
printf("%d ",d);
}
x=d;
}
else {
m=x+i;
a=m;
for(j=1;j<=i;j++){

printf("%d ",m);
m--;
}
}
d=a;
printf("\n");
}
}

SẮP XẾP CHẴN LẺ

Bài làm tốt nhất

Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Thực hiện sắp xếp tăng dần
các phần tử chẵn và lẻ của mảng và In ra.
Trong đó:
INPUT
Hàng thứ nhất là số phần tử n của mảng A
Hàng thứ hai là các phần tử của mảng A
OUTPUT
Mảng kết quả in lần lượt dãy số chẵn sau đó đến dãy số lẻ.

Ví dụ:
INPUT
8
13829765
OUTPUT
26813579

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
long long a[100];
for(i=0;i<n;i++){
scanf("%lld",&a[i]);
}
long long tg;
for( i = 0; i < n - 1; i++){
for( j = i + 1; j < n; j++){
if(a[i] > a[j]){
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
}
for(i=0;i<n;i++){
if(a[i]%2==0) printf("%lld ",a[i]);
}
for(i=0;i<n;i++){
if(a[i]%2!=0) printf("%lld ",a[i]);
}

TÌM HÀNG NHIỀU SỐ NGUYÊN TỐ NHẤT

Bài làm tốt nhất

Viết chương trình nhập vào ma trận vuông cấp n (1 < n < 30) chỉ bao gồm các số nguyên
dương không quá 1000.

Thực hiện tìm hàng có nhiều phần tử là số nguyên tố nhất. Nếu có nhiều hơn một hàng thỏa
mãn thì in ra hàng đầu tiên.

INPUT
- Dòng đầu tiên là cấp của ma trận
- Các dòng tiếp theo là các phần tử của ma trận
OUTPUT
- Dòng đầu tiên là số thứ tự hàng thỏa mãn
- Dòng thứ hai liệt kê các phần tử thỏa mãn

Ví dụ:
INPUT
4
8234
5678
9 10 11 12
13 14 15 16
OUTPUT
1
23

#include<stdio.h>
#include<math.h>
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}

int main(){
int n;
scanf("%d",&n);
int a[n][n];
int i,j,d,max=0,vt;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
scanf("\n");
}
for(i=0;i<n;i++){
d=0;
for(j=0;j<n;j++){
if(nt(a[i][j])==1){
d++;
}
}
if(d>max){
max=d;
vt=i;
}
}
printf("%d\n",vt+1);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i==vt && nt(a[i][j])==1) printf("%d ",a[i][j]);
}
}
}

TỔNG CÁC SỐ NGUYÊN TỐ THUỘC TAM GIÁC TRÊN

Bài làm tốt nhất

Viết chương trình nhập ma trận A là ma trận vuông cấp n (không quá 50). Tìm tổng các phần
tử là số nguyên tố thuộc tam giác trên.

INPUT
- Dòng đầu tiên là cấp của ma trận
- Các dòng tiếp theo là các phần tử của ma trận
OUTPUT
- Ghi ra kết quả của chương trình

Ví dụ:

INPUT
4
1234
5678
9 10 11 12
13 14 15 16
OUTPUT
23

#include<stdio.h>
#include<math.h>
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int main(){
int n,i,j,s=0;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
for(j=i;j<n;j++){
if(nt(a[i][j])==1) {
s+=a[i][j];
}
}
}
printf("%d",s);
}

MA TRẬN XOẮN ỐC FIBONACCI

Bài làm tốt nhất

Ma trận xoáy ốc Fibonacci cấp N là ma trận vuông có N*N phần tử. Các số được điền vào ma
trận theo chiều kim đồng hồ đều là các số thuộc dãy Fibonacci từ nhỏ đến lớn (tính từ số 0).

Viết chương trình nhập N (không quá 9) và in ra ma trận xoắn ốc Fibonacci tương ứng.

Ví dụ:

INPUT
3
OUTPUT
011
13 21 2
853

#include<stdio.h>
int fb(int a){
if(a==0 ) return 0;
else if (a==1||a==2) return 1;
else{
int x=1;
int y=1;
int z=0;
int d=3;
while(d<=a){
z=x+y;
x=y;
y=z;
d++;
}
return z;
}
}
int main(){
int n;
scanf("%d",&n);
int p=n*n;
int m=n;
int k=0,i,j;
int a[n][n];
int d=0;
while(d<p){
for(j=k;j<m;j++){
a[k][j]=fb(d);
d++;
}
for(i=k+1;i<m;i++){
a[i][m-1]=fb(d);
d++;

}
for(j=m-2;j>=k;j--){
a[m-1][j]=fb(d);
d++;
}
for(i=m-2;i>k;i--){
a[i][k]=fb(d);
d++;
}
m--;
k++;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}

PHÂN TÍCH THỪA SỐ NGUYÊN TỐ 2

Bài làm tốt nhất

Viết chương trình phân tích một số nguyên dương (không quá 6 chữ số) thành tích các
thừa số nguyên tố.

Kết quả được viết theo mẫu trong Ví dụ (có chữ x giữa các thừa số)

Input:

Chỉ có một dòng ghi số n.

Output:

Ghi ra kết quả tính toán

Ví dụ:

Input Output
28 2x2x7

#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
for(i=2;i<=n;i++){
if(n%i==0) printf("%d",i);
n=n/i;
break;
}
for(i=2;i<=n;i++){
while(n%i==0){
printf("x%d",i);
n=n/i;
}
}
}

TAM GIÁC KÝ TỰ - 1

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 20).

Vẽ hình tam giác ký tự theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

4 a

cb

def

jihg
#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
int d=0,m,a,x;
for(i=1;i<=n;i++){
if(i%2==1){
for(j=1;j<=i;j++){
d++;
printf("%c ",d+96);
}
x=d;
}
else {
m=x+i;
a=m;
for(j=1;j<=i;j++){

printf("%c ",m+96);
m--;
}
}
d=a;
printf("\n");
}
}

TAM GIÁC KÝ TỰ - 3

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 20).

Vẽ hình tam giác ký tự theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.
Input

Chỉ có một số dòng ghi chiều cao (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

4 A

BE

CFH

DGIJ

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);int m=1;

for(i=1;i<=n;i++){
int e=n-1,d=m;

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

printf("%c ",d+64);
d=d+e;
e--;
}
m++;
printf("\n");
}
}
TAM GIÁC KÝ TỰ - 4

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 20).

Vẽ hình tam giác ký tự theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

5 @

@B@

@BDB@

@BDFDB@

@BDFHFDB@

#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
int d=0;
for(j=1;j<=i+1;j++){
d=d+2;
printf("%c",d+62);

}
for(j=i+2;j<=2*i+1;j++){
d=d-2;
printf("%c",d+62);
}

printf("\n");
}
}

CHUYỄN ĐỔI HAI HÀNG TRONG MA TRẬN

Bài làm tốt nhất

Viết chương trình nhập vào ma trận nguyên dương cấp M*N (không quá 50). Chuyển đổi hai
hàng a và b trong ma trận và in ra kết quả.

INPUT
- Hàng thứ nhất là cấp m,n của ma trận
- m hàng tiếp theo là các phần tử của ma trận
- Hàng cuối cùng là giá trị a,b. Là các hàng cần chuyển đổi
OUTPUT
- Ma trận kết quả

Ví dụ:

INPUT
33
123
456
789
13

OUTPUT
789
456
123

#include<stdio.h>
int main(){
int n,m,i,j;
int x,y;
scanf("%d %d",&m,&n);
int a[m][n];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d %d",&x,&y);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i==x-1) printf("%d ",a[y-1][j]);
else if(i==y-1) printf("%d ",a[x-1][j]);
else printf("%d ",a[i][j]);
}
printf("\n");
}
}

CHUYỂN ĐỔI HAI CỘT TRONG MA TRẬN

Bài làm tốt nhất


Viết chương trìnhnhập vào ma trận nguyên dương cấp M*N (không quá 50). Chuyển đổi hai
cột a và b trong ma trận và in ra kết quả.

INPUT
- Hàng thứ nhất là cấp m,n của ma trận
- m hàng tiếp theo là các phần tử của ma trận
- Hàng cuối cùng là vị trí cột cần chuyển đổi
OUTPUT
- Ma trận kết quả

Ví dụ:

INPUT
33
123
456
789
13
OUTPUT
321
654
987

#include<stdio.h>
int main(){
int n,m,i,j;
scanf("%d %d",&m,&n);
int a[m][n];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int x,y;
scanf("%d %d",&x,&y);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(j==x-1) printf("%d ",a[i][y-1]);
else if(j==y-1) printf("%d ",a[i][x-1]);
else printf("%d ",a[i][j]);
}
printf("\n");
}
}

CHUYỂN ĐỔI HAI ĐƯỜNG CHÉO

Bài làm tốt nhất

Viết chương trình nhập vào ma trận vuông các số nguyên dương cấp M (không quá 50). Thực
hiện chuyển đổi hai đường chéo của ma trận và in ra ma trận kết quả.

INPUT
- Hàng thứ nhất là cấp m của ma trận
- m hàng tiếp theo là các phần tử của ma trận
OUTPUT
- Ma trận kết quả

Ví dụ:

INPUT
3
123
456
789
OUTPUT
321
456
987

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int i,j,a[n][n];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i==j) printf("%d ",a[i][n-1-j]);
else if(j==n-1-i) printf("%d ",a[i][i]);
else printf("%d ",a[i][j]);
}
printf("\n");
}
}

ĐẾM SỐ LẦN XUẤT HIỆN CÁC TỪ TRONG XÂU

Bài làm tốt nhất

Tìm số lần xuất hiện các từ trong xâu S (không phân biệt chữ hoa chữ thường). Kết
quả in ra từ (ở dạng in thường) và số lần xuất hiện của chúng

Input:

Chỉ có một dòng ghi xâu S.

Output:

Ghi ra kết quả đếm từng từ theo thứ tự xuất hiện.

Ví dụ:

Input Output
aaa bbb ccc AA bb aa ccc aa aaa 1

bbb 1

ccc 2

aa 3
bb 1

#include<stdio.h>
#include<string.h>
int main(){
char a[10001];
gets(a);
int l=strlen(a);
int i,j,x,y,k,e;
for(i=0;i<l;i++){
if(a[i]>=65 && a[i]<=90) a[i]=a[i]+32;
}
for(i=0;i<l;i++){

if(a[i]!=' ' && a[i]!='\0' && (i==0 || a[i-1]==' ' || a[i-1]=='\0')){


x=i;
e=1;
for(j=x;j<=l;j++){
y=j;
if(a[j]==' '|| a[j]=='\0') break;

}
k=x;
for(j=y+1;j<l;j++){
if(a[j]!=' ' && a[j]!='\0' && (a[j-1]==' ' || a[j-1]=='\0')){
int z=j;
while(a[j]==a[k] && (x==0 || a[x-1]==' ' || a[x-1]=='\0')
&& k<y){
j++;
k++;
}
if((a[j]==' ' || a[j]=='\0') && (a[k]==' ' || a[k]=='\0')){
e++;
for(int d=z;d<j+1;d++){
a[d]='\0';
}
}
k=x;
}

}
for(j=x;j<y;j++){
printf("%c",a[j]);
if(j==y-1) printf(" %d\n",e);

}
}

}
}

CHÈN XÂU

Bài làm tốt nhất

Cho xâu S1 và xâu S2, độ dài không quá 100.

Hãy chèn xâu S2 vào vị trí p trong xâu S1 (vị trí ký tự đầu tiên là vị trí 1).

Input:

Dòng thứ nhất ghi xâu S1

Dòng thứ hai ghi xâu S2

Dòng thứ ba ghi số p (giá trị p đảm bảo nằm trong phạm vi xâu S1)

Output:
Ghi ra kết quả.

Ví dụ:

Input Output
mon thcs2 hoc de ngon ngu C.mon thcs2 hoc de

ngon ngu C.

#include<stdio.h>
#include<string.h>

int main()
{
char str1[255], str2[255];
int k;
gets(str1);
gets(str2);
scanf("%d",&k);
for(int i=0;i<k-1;i++)
{
printf("%c",str1[i]);
}
for(int i=0;i<strlen(str2);i++)
{
printf("%c",str2[i]);
}

for(int i=k-1;i<strlen(str1);i++)
{
printf("%c",str1[i]);
}
}
ĐỊA CHỈ EMAIL PTIT - 1

Bài làm tốt nhất

Địa chỉ email của cán bộ PTIT được cấp theo nguyên tắc ghép tên với chữ cái đầu tiên
của họ và tên đệm. Viết chương trình cho phép tạo các địa chỉ email theo tên cán bộ(có
thể không chuẩn).

Input:

Chỉ có một dòng ghi xâu họ tên (độ dài không quá 50)

Output:

Ghi ra kết quả.

Ví dụ:

Input Output
ngUYEN van nam nvnam@ptit.edu.vn

#include<stdio.h>
#include<string.h>
int main(){
char a[51];
gets(a);
int d=0,i,vt,l=strlen(a);

while(a[d]==' '){
d++;
}
while(a[l-1]==' '){
l--;
}
if(a[d]>='A' && a[d]<='Z'){
a[d]=a[d]+32;
}
printf("%c",a[d]);
for(i=d;i<l;i++){
if(a[i]==' ' && a[i+1]!=' ') {
if(a[i+1]>='A' && a[i+1]<='Z'){
a[i+1]=a[i+1]+32;
}
printf("%c",a[i+1]);
vt=i;
}
}
for(i=vt+2;i<l;i++){
if(a[i]>='A' && a[i]<='Z'){
a[i]=a[i]+32;
}
printf("%c",a[i]);
}
printf("@ptit.edu.vn");
}

ĐẾM CHỮ SỐ NGUYÊN TỐ

Bài làm tốt nhất

Viết chương trình nhập vào một số n, không quá 10 chữ số.

Hãy thực hiện đếm số lần xuất hiện của các chữ số nguyên tố trong n và in ra màn
hình. (Liệt kê theo thứ tự xuất hiện các chữ số)

Input

Chỉ có một số nguyên dương N không quá 10 chữ số.

Output
Ghi ra kết quả, mỗi dòng ghi một số nguyên tố và số lần xuất hiện theo thứ tự xuất
hiện.

Ví dụ

Input Output
112345 21

31

51

#include<stdio.h>
#include<math.h>
int b[1001];
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int main(){
long n;
scanf("%ld",&n);
long x=n;
int m=0,i;
while(n>0){
m++;
n=n/10;
}
int a[m],j;
for(i=m;i>0;i--){
a[i]=x%10;
x=x/10;
if(nt(a[i])==1){
b[a[i]]++;
}
}
int kt;
for(i=1;i<=m;i++){

if(nt(a[i])==1){
kt=0;
for(j=1;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;

}
}

if(kt==0) printf("%d %d\n",a[i],b[a[i]]);


}

}
}

SẮP XẾP CHỌN - 2

Bài làm tốt nhất

Viết chương trình C cho phép nhập vào mảng A gồm n phần tư (1<n<100). Thực hiện sắp xếp
tăng dần các phần tử của mảng theo thuật toán chọn và In ra.
Trong đó:
INPUT
Hàng thứ nhất là số phần tử n của mảng A
Hàng thứ hai là các phần tử của mảng A
OUTPUT
Kết quả các bước sắp xếp theo thuật toán
INPUT
5
64 25 12 22 11
OUTPUT
11 25 12 22 64
11 12 25 22 64
11 12 22 25 64
11 12 22 25 64

#include<stdio.h>
int main(){

int n,i,j,k;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int x;
for(i=0;i<n-1;i++){
int m=a[i],vt=i;
for(j=i;j<n;j++){
if(a[j]<m){
m=a[j];
vt=j;
}
}
a[vt]=a[i];
a[i]=m;

for(k=0;k<n;k++){
printf("%d ",a[k]);
}
printf("\n");
}

ƯỚC SỐ CHIA HẾT CHO 2

Bài làm tốt nhất

Cho số nguyên dương N.

Nhiệm vụ của bạn là hãy xác định xem có bao nhiêu ước số của N chia hết cho 2?

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 100).

Mỗi bộ test gồm một số nguyên N (1 ≤ N ≤ 109)

Output:

Với mỗi test, in ra đáp án tìm được trên một dòng.

Ví dụ:

Input: Output:
2 0

9 3

#include<stdio.h>
#include<math.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,d=0,i;
scanf("%ld",&n);

for(i=1;i<=sqrt(n);i++){
if(n%i==0 ){
if(i%2==0) d++;
if((n/i)%2==0 && i*i!=n) d++;

}
}
printf("%ld\n",d);

}
}

ƯỚC SỐ NGUYÊN TỐ LỚN NHẤT

Bài làm tốt nhất

Cho số nguyên dương N. Hãy đưa ra ước số nguyên tố lớn nhất của N.

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào T bộ test. Mỗi bộ test ghi số nguyên dương N.
 T, N thỏa mãn ràng buộc: 1≤T≤100; 2≤N≤10 . 10

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input: Output:
2 7

315 31

31

#include<stdio.h>
#include<math.h>
int nt(long a){
long i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,i,max=0;
scanf("%ld",&n);
for(i=1;i<=sqrt(n);i++){
if(n%i==0){
if (nt(i)==1){
if(i>max)
max=i;
}
if(nt(n/i)==1){
if(n/i>max) max=n/i;
}
}
}
printf("%ld\n",max);

}
}

KIỂM TRA SỐ FIBONACCI 2

Bài làm tốt nhất

Cho số nguyên dương n. Hãy kiểm tra xem n có phải là số trong dãy Fibonacci hay
không?

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào các bộ test. Mỗi bộ test là một số nguyên dương n.
 T, n thỏa mãn ràng buộc :1 ≤ T ≤ 100; 1≤n≤10 . 18

Output:

 Đưa ra “YES” hoặc “NO” tương ứng với n là số Fibonacci hoặc không phải số
Fibonacci của mỗi test theo từng dòng.

Ví dụ:

Input Output
2 YES

8 NO

15

#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long long n;
scanf("%lld",&n);
long long i,kt=0,x,y,z;
if(n==0 || n==1) printf("YES");
else{
x=0;
y=1;
z=0;
while(z<n){

z=x+y;
x=y;
y=z;
}
if(z==n) printf("YES");
else printf("NO");

}
printf("\n");
}
}

TỔNG ƯỚC SỐ

Bài làm tốt nhất

Cho N số nguyên. Nhiệm vụ của bạn là phân tích các số nguyên đã cho dưới dạng tích của các
thừa số nguyên tố, sau đó tính tổng các ước số nguyên tố này.

Input:

 Dòng đầu tiên số nguyên N (1 ≤ N ≤ 10 ).


6
 N dòng tiếp theo, mỗi dòng gồm một số nguyên có giá trị không vượt quá
2*10 . 6

Output:

In ra một số nguyên là đáp án tìm được.

Ví dụ:

Input: Output:
5 47

10

13

100

#include<stdio.h>
#include<math.h>
int b[2*1000000+9]={0};
int a[1000009];
void sangnt(){
int i,j;
for(i=2;i<=2*1000000;i++){
if(b[i]==0){
b[i]=i;
for(j=i;j<=2*1000000;j=j+i){
b[j]=i;
}
}
}
}
int main(){
int t;
scanf("%d",&t);
sangnt();
long s=0;
while(t--){
long n;
scanf("%ld",&n);
while(n>1){
s=s+b[n];
n=n/b[n];
}
}
printf("%ld",s);
}

SỐ TĂNG GIẢM

Bài làm tốt nhất

Một số được gọi là số tăng giảm nếu số đó có các chữ số thỏa mãn hoặc tăng dần, hoặc giảm
dần từ trái qua phải. Hãy đếm các số nguyên tố là số tăng giảm với số chữ số cho trước.

Dữ liệu vào: Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng số chữ số tương ứng
cần kiểm tra (lớn hơn 1 và nhỏ hơn 10)

Kết quả: Ghi ra số lượng các số thỏa mãn điều kiện.

Input Output
2 20

2 50

#include<stdio.h>
#include<math.h>
int snt(long a){
if(a<2) return 0;
else {
int kt=1;
for(long i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=0;
break;
}
}
if(kt==1) return 1;
else return 0;
}
}
int stg(long a){

int k=1,e,d=a%10;
a=a/10;
e=a%10;
int n=d,m,x=d,y;
long b=a;
if(d<e){
while(a>0){
m=a%10;;
if(n>=m){
k=0;
break;
}
n=m;
a=a/10;
}
}
else {
while(b>0){
y=b%10;
if(x<=y){
k=0;
break;
}
x=y;
b=b/10;
}
}

if(k==1) return 1;
else return 0;

}
int main(){
int x;
scanf("%d",&x);
while(x--){
int t;
scanf("%d",&t);
long n=1,m;
while(t--){
n=n*10;
}
m=n/10;
long d=0,i;
for(i=m;i<n;i++){

if(stg(i)==1){
if(snt(i)==1)
d++;
}

}
printf("%ld\n",d);
}
}
SỐ ĐẸP 2

Bài làm tốt nhất

Một số được coi là đẹp nếu nếu nó có tính chất thuận nghịch và tổng chữ số chia hết cho 10.
Bài toán đặt ra là cho trước số chữ số. Hãy đếm xem có bao nhiêu số đẹp với số chữ số như
vậy.

Dữ liệu vào: Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng số chữ số tương ứng
cần kiểm tra (lớn hơn 1 và nhỏ hơn 10).

Kết quả: Mỗi bộ test viết ra số lượng số đẹp tương ứng.

Ví dụ:

Input Output
2 1

2 90

#include<stdio.h>
int stn(long a){
int d=0,s=0,m=a;
while(a>0){
d=d*10+a%10;
s=s+a%10;
a=a/10;
}
if(d==m && s%10==0) return 1;
else return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a;
scanf("%d",&a);
long n=1,m;
while(a--){
n=n*10;
}
m=n/10;
long d=0;
for(long i=m;i<n;i++){
if(stn(i)==1) d++;
}
printf("%ld\n",d);
}
}

SỐ XUẤT HIỆN NHIỀU LẦN NHẤT TRONG DÃY

Bài làm tốt nhất

Cho một dãy số nguyên dương không quá 100 phần tử, các giá trị trong dãy không quá 30000. Hãy
xác định xem số nào là số xuất hiện nhiều lần nhất trong dãy. Chú ý: trong trường hợp nhiều số khác
nhau cùng xuất hiện số lần bằng nhau và là lớn nhất thì in ra tất cả các số đó theo thứ tự xuất hiện
trong dãy ban đầu.

Input: Dòng đầu là số bộ test, không quá 20. Mỗi bộ test gồm hai dòng. Dòng đầu ghi số phần tử của
dãy, dòng tiếp theo ghi các phần tử của dãy.

Output: Với mỗi bộ test, đưa ra số xuất hiện nhiều lần nhất trong dãy đã cho.

Ví dụ:

Input Output
2 1

10 1 2 3 4 5 6 7 8 9 0

1 2 3 1 2 3 1 2 3 1
10

1 2 3 4 5 6 7 8 9 0

#include<stdio.h>
int b[40000];
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
int n;
scanf("%d",&n);
int a[1000],i,j,max=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
if(b[a[i]]>max){
max=b[a[i]];
}
}
int kt;
for(i=0;i<n;i++){
if(b[a[i]]==max){
kt=1;
for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=0;
break;
}
}
}
if(b[a[i]]==max && kt==1) printf("%d ",a[i]);
}
for(i=0;i<n;i++){
b[a[i]]=0;
}
printf("\n");

}
}

ĐOẠN TĂNG DÀI NHẤT

Bài làm tốt nhất

Một đoạn tăng trong một dãy số nguyên là một đoạn liên tiếp trong dãy sao cho phần từ phía
sau lớn hơn phần từ phía trước. Cho dãy số với n phần tử (n không quá 100, các phần tử đều
không quá 1000). Viết chương trình tìm các đoạn tăng liên tiếp trong dãy mà số phần tử là
nhiều nhất.

Input: Dòng đầu ghi số bộ test. Mỗi test gồm 2 dòng, dòng đầu ghi số N là số phần tử của
dãy. Dòng sau ghi N số của dãy. N không quá 100, các số trong dãy đều nguyên dương và
không quá 1000.

Output: Với mỗi bộ test, ghi ra thứ tự bộ test. Sau đó là 1 dòng ghi độ dài của đoạn tăng dài
nhất. Tiếp theo là một số dòng ghi lần lượt các đoạn tăng dài nhất, từ trái qua phải trong dãy
ban đầu.

Ví dụ:

Input Output
2 Test 1:

16 4

2 3 5 7 4 5 8 9 7 11 8 9 6 7 10 12 2357

12 4589

232323222341 6 7 10 12

Test 2:

234
#include<stdio.h>
int b[100001]={0};
int main(){
int t,k=1;
scanf("%d",&t);
while(t--){
int n,d=1,max=1;
scanf("%d",&n);
int a[n+1],i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=1;
}
for(i=1;i<n;i++){
if(a[i-1]<a[i]) d++;
else {
d=1;
}
b[i]=d;

if(b[i]>max) max=b[i];

printf("Test %d:\n%d\n",k,max);
for(i=0;i<n;i++){
if(b[i]==max){
for(int j=i-max+1;j<=i;j++){
printf("%d ",a[j]);
if(j==i) printf("\n");
}
}
}
k++;
}
}

TRỘN HAI DÃY VÀ SẮP XẾP

Bài làm tốt nhất

Cho hai dãy số nguyên dương A và B không quá 100 phần tử, các giá trị trong dãy không quá 30000
và số phần tử của hai dãy bằng nhau. Hãy trộn hai dãy với nhau sao cho dãy A được đưa vào các vị trí
có chỉ số chẵn, dãy B được đưa vào các vị trí có chỉ số lẻ. Đồng thời, dãy A được sắp xếp tăng dần,
còn dãy B được sắp xếp giảm dần. (Chú ý: chỉ số tính từ 0)

Input: Dòng 1 ghi số bộ test. Với mỗi bộ test: dòng đầu tiên ghi số n. Dòng tiếp theo ghi n số nguyên
dương của dãy A. Dòng tiếp theo ghi n số nguyên dương của dãy B

Output: Với mỗi bộ test, đưa ra thứ tự bộ test và dãy kết quả.

Ví dụ:

Input Output
2 Test 1:

5 1 3 1 3 2 2 2 1 3 1

1 2 3 1 2 Test 2:

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

4 2 7 1

5 6 2 8

#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
int k=0;
while(t--){
k++;
int n,i,j;
scanf("%d",&n);
long a[n],b[n],min,max;
for(i=0;i<n;i++){
scanf("%ld",&a[i]);
}
for(i=0;i<n;i++){
scanf("%ld",&b[i]);
}
long d,e;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[j]<a[i]){
d=a[j];
a[j]=a[i];
a[i]=d;
}
if(b[i]<b[j]){
e=b[j];
b[j]=b[i];
b[i]=e;
}
}
}
printf("Test %d:\n",k);
for(i=0;i<n;i++){
printf("%ld %ld ",a[i],b[i]);
}
printf("\n");
}
}
SẮP XẾP ĐỔI CHỖ TRỰC TIẾP

Bài làm tốt nhất

Hãy thực hiện thuật toán sắp xếp đổi chỗ trực tiếp trên dãy N số nguyên. Ghi ra các bước thực
hiện thuật toán.

Input: Dòng 1 ghi số N (không quá 100). Dòng 2 ghi N số nguyên dương (không quá 100).

Output:Ghi ra màn hình từng bước thực hiện thuật toán. Mỗi bước trên một dòng, các số
trong dãy cách nhau đúng một khoảng trống.

Ví dụ:

Input Output
4 Buoc 1: 2 7 5 3

5 7 3 2 Buoc 2: 2 3 7 5

Buoc 3: 2 3 5 7

#include<stdio.h>
int main(){

int n,i,j,k;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int x;
for(i=0;i<n-1;i++){
printf("Buoc %d: ",i+1);
for(j=i+1;j<n;j++){
if(a[j]<a[i]){
int d=a[j];
a[j]=a[i];
a[i]=d;
}
}
for(k=0;k<n;k++){
printf("%d ",a[k]);
}

printf("\n");
}

SẮP XẾP CHỌN

Bài làm tốt nhất

Hãy thực hiện thuật toán sắp xếp chọn trên dãy N số nguyên. Ghi ra các bước thực hiện thuật
toán.

Input: Dòng 1 ghi số N (không quá 100). Dòng 2 ghi N số nguyên dương (không quá 100).

Output:Ghi ra màn hình từng bước thực hiện thuật toán. Mỗi bước trên một dòng, các số
trong dãy cách nhau đúng một khoảng trống.

Ví dụ:

Input Output
4 Buoc 1: 2 7 3 5

5 7 3 2 Buoc 2: 2 3 7 5

Buoc 3: 2 3 5 7
#include<stdio.h>
int main(){

int n,i,j,k;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int x;
for(i=0;i<n-1;i++){
int m=a[i],vt=i;
printf("Buoc %d: ",i+1);
for(j=i+1;j<n;j++){
if(a[j]<m){
m=a[j];
vt=j;
}
}
a[vt]=a[i];
a[i]=m;

for(k=0;k<n;k++){
printf("%d ",a[k]);
}

printf("\n");
}

}
SẮP XẾP CHÈN

Bài làm tốt nhất

Hãy thực hiện thuật toán sắp xếp chèn trên dãy N số nguyên. Ghi ra các bước thực hiện thuật
toán.

Input: Dòng 1 ghi số N (không quá 100). Dòng 2 ghi N số nguyên dương (không quá 100).

Output:Ghi ra màn hình từng bước thực hiện thuật toán. Mỗi bước trên một dòng, các số
trong dãy cách nhau đúng một khoảng trống.

Ví dụ:

Input Output
4 Buoc 0: 5

5 7 3 2 Buoc 1: 5 7

Buoc 2: 3 5 7

Buoc 3: 2 3 5 7

#include<stdio.h>
int main(){

int n,i,j,k;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int x;
for(i=0;i<n;i++){
printf("Buoc %d: ",i);
for(j=0;j<=i;j++){
if(a[j]>a[i]){
int d=a[j];
a[j]=a[i];
a[i]=d;
}
}
for(j=0;j<=i;j++){
printf("%d ",a[j]);
}

printf("\n");
}

ĐỔI TIỀN

Bài làm tốt nhất

Tại ngân hàng có các mệnh giá bằng 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, số lượng tờ tiền
mỗi mệnh giá là không hạn chế. Một người cần đổi số tiền có giá trị bằng N. Hãy xác định
xem số tờ tiền ít nhất sau khi đổi là bao nhiêu?

Input: Dòng đầu tiên là số lượng bộ test T (T ≤ 50). Mỗi test gồm 1 số nguyên N ( 1 ≤ N ≤
100000).

Output: Với mỗi test, in ra đáp án trên một dòng.

Test ví dụ:

Input Output
2 2

70 3

121
#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,d=0;
scanf("%d",&n);
d=n/1000;
n=n-(n/1000)*1000;
d=d+n/500;
n=n-(n/500)*500;
d=d+n/200;
n=n-(n/200)*200;
d=d+n/100;
n=n-(n/100)*100;
d=d+n/50;
n=n-(n/50)*50;
d=d+n/20;
n=n-(n/20)*20;
d=d+n/10;
n=n-(n/10)*10;
d=d+n/5;
n=n-(n/5)*5;
d=d+n/2;
n=n-(n/2)*2;
d=d+n;
printf("%d\n",d);
}
}
TÍCH THỪA SỐ NGUYÊN TỐ

Bài làm tốt nhất

Cho một số nguyên dương không quá 9 chữ số. Người ta phân tích số đó thành tích các
thừa số nguyên tố sau đó tính lại một giá trị mới bằng cách nhân các thừa số nguyên tố
khác nhau của số đó.

Ví dụ: Số 72 được phân tích thành 23 * 32. Giá trị tính được sẽ lã 2 * 3 = 6

Dữ liệu vào

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi bộ test là một số nguyên dương không quá 109

Kết quả

 Với mỗi bộ test, ghi ra kết quả tính được.

Ví dụ

Input Output
3 6

72 10

1000 997

997

#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){

long i, n,s=1;
scanf("%ld",&n);
for(i=2;i<=n;i++){
if(n%i==0) s=s*i;
while(n%i==0){
n=n/i;
}

}
printf("%ld",s);
printf("\n");
}

LOẠI BỎ HÀNG VÀ CỘT CÓ TỔNG LỚN NHẤT RA KHỎI MA TRẬN

Bài làm tốt nhất

Cho một ma trận cấp M*N chỉ bao gồm các số nguyên dương không quá 1000. Hãy viết
chương trình trước hết loại bỏ hàng có tổng lớn nhất sau đó tính toán lại để loại tiếp cột có
tổng lớn nhất ra khỏi ma trận.

Input: Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng hai số N và M lần lượt là
số hàng và số cột của ma trận (2<N,M<10). Tiếp thep là N dòng ghi các số của ma trận.

Output:Mỗi bộ test viết ra thứ tự bộ test, sau đó là ma trận sau khi tính toán.

Ví dụ

Input Output
1 Test 1:
3 3
1 2 4 1 4
3 4 0 3 0
6 3 5
#include<stdio.h>
int main(){
int t,x=1;
scanf("%d",&t);
while(t--){

int m,n,i,j;
scanf("%d %d",&m,&n);
int a[m][n];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int max=a[0][0],k=a[0][0];
int s,ss,vt,d;
for(i=0;i<m;i++){
s=0;
for(j=0;j<n;j++){
s=s+a[i][j];
}
if(s>max){
max=s;
vt=i;
}
}
for(j=0;j<n;j++){
ss=0;
for(i=0;i<m;i++){
if(i!=vt){

ss=ss+a[i][j];
}
}
if(ss>k){
k=ss;
d=j;
}

}
printf("Test %d:\n",x);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i!=vt && j!=d){
printf("%d ",a[i][j]);
}
}
printf("\n");
}

x++;
}
}

TÍCH MA TRẬN VỚI CHUYỂN VỊ CỦA NÓ

Bài làm tốt nhất

Cho ma trận A chỉ gồm các số nguyên dương cấp N*M. Hãy viết chương trình tính tích của A
với ma trận chuyển vị của A.

Input: Dòng đầu tiên ghi số bộ test. Với mỗi bộ test: Dòng đầu tiên ghi hai số n và m là bậc
của ma trân a; n dòng tiếp theo, mỗi dòng ghi m số của một dòng trong ma trận A.

Output:Với mỗi bộ test ghi ra thứ tự bộ test, sau đó đến ma trận tích tương ứng, mỗi số cách
nhau đúng một khoảng trống.

Ví dụ

Input Output
1 Test 1:

2 2 5 11
1 2 11 25

3 4

#include<stdio.h>
int main(){
int t,x=1;
scanf("%d",&t);
while(t--){
int n,m,i,j,k;
scanf("%d %d",&n,&m);
int a[n][m];
int b[m][n];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
b[i][j]=a[j][i];

}
}
printf("Test %d:\n",x);
int c[n][n];
for( i = 0; i<n ; i++){
for( k = 0; k<n ; k++)
{
c[i][k] = 0;
for( j = 0; j<m ; j++){
c[i][k] = c[i][k] + a[i][j]*b[j][k];
}
printf("%d ",c[i][k]);
}
printf("\n");
}
x++;
}
}

TÍCH MA TRẬN CHÉO

Bài làm tốt nhất

Cho một số nguyên dương N không quá 20. Ma trận vuông A cấp N*N được tạo theo mẫu
trong bảng dưới. Viết chương trình tính tích của A với chuyển vị của A.

Với N = 4 Với N = 5
1 0 0 0 1 0 0 0 0
1 2 0 0 1 2 0 0 0
1 2 3 0 1 2 3 0 0
1 2 3 4 1 2 3 4 0
1 2 3 4 5

#include<stdio.h>
int main(){
int t,x=1;
scanf("%d",&t);
while(t--){
int n,i,j,k;
scanf("%d",&n);
int a[n][n];
int b[n][n];
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
a[i][j]=j+1;
}
for(j=i+1;j<n;j++){
a[i][j]=0;
}
}

for(i=0;i<n;i++){
for(j=0;j<n;j++){
b[i][j]=a[j][i];

}
}
printf("Test %d:\n",x);
int c[n][n];
for( i = 0; i<n ; i++){
for( k = 0; k<n ; k++)
{
c[i][k] = 0;
for( j = 0; j<n ; j++){
c[i][k] = c[i][k] + a[i][j]*b[j][k];
}
printf("%d ",c[i][k]);
}
printf("\n");
}
x++;
}
}

MA TRẬN XOÁY ỐC NGƯỢC

Bài làm tốt nhất

Ma trận xoáy ốc ngược cấp N là ma trận vuông có N*N phần tử. Các số được điền vào ma
trận trận theo chiều kim đồng hồ theo thứ tự giảm dần về 1.

Dữ liệu vào

 Dòng 1 ghi số bộ test


 Mỗi bộ test ghi số N (1<N<20).

Kết quả

Ghi ra thứ tự bộ test và ma trận xoáy ốc ngược tương ứng

Ví dụ:

Input Output
1 Test 1:

3 9 8 7

2 1 6

3 4 5

#include<stdio.h>
int main(){
int t,y=1;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int m=n;
int x=n*n,k=0,i,j;
int a[n][n];
while(x>0){
for(j=k;j<m;j++){
a[k][j]=x--;
}
for(i=k+1;i<m;i++){
a[i][m-1]=x--;
}
for(j=m-2;j>=k;j--){
a[m-1][j]=x--;
}
for(i=m-2;i>k;i--){
a[i][k]=x--;
}
m--;
k++;
}
printf("Test %d:\n",y);

for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
y++;
}

MA TRẬN XOÁY ỐC NGUYÊN TỐ

Bài làm tốt nhất

Ma trận xoáy ốc nguyên tố cấp N là ma trận vuông có N*N phần tử. Các số được điền vào ma
trận theo chiều kim đồng hồ đều là các số nguyên tố từ nhỏ đến lớn.

Dữ liệu vào

 Dòng 1 ghi số bộ test


 Mỗi bộ test ghi số N (1<N<20).

Kết quả

Ghi ra thứ tự bộ test và ma trận xoáy ốc nguyên tố tương ứng

Ví dụ:

Input Output
1 Test 1:
3 2 3 5

19 23 7

17 13 11

#include<stdio.h>
#include<math.h>
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int ntt(int n){
int i=1;
int d=0,x;
while(i++){
if(nt(i)==1){
d++;
x=i;
}
if(d==n){
break;
}
}
return x;
}
int main(){
int t;
scanf("%d",&t);
int o=1;
while (t--){

int n;
scanf("%d",&n);
int m=n,p=n*n;
int x=1,k=0,i,j;
int a[n][n];
printf("Test %d:\n",o);
while(x<=p){
for(j=k;j<m;j++){
a[k][j]=ntt(x);
x++;
}
for(i=k+1;i<m;i++){
a[i][m-1]=ntt(x);
x++;
}
for(j=m-2;j>=k;j--){
a[m-1][j]=ntt(x);
x++;
}
for(i=m-2;i>k;i--){
a[i][k]=ntt(x);
x++;
}
m--;
k++;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
o++;
printf("\n");
}
}

CHUẨN HÓA XÂU HỌ TÊN 2

Bài làm tốt nhất

Các cán bộ, giảng viên PTIT khi tham gia hội nghị quốc tế sẽ được viết lại xâu họ tên theo
dạng chuẩn trong đó họ được viết sau cùng, phân tách với phần tên đệm và tên bởi dấu phẩy.
Các chữ cái của họ đều viết hoa.

Cho trước các xâu họ tên (có thể không chuẩn). Hãy đưa về dạng chuẩn tương ứng.

Input:

 Dòng 1 ghi số N là xâu họ tên trong danh sách


 N dòng tiếp theo ghi lần lượt các xâu họ tên (không quá 50 ký tự)

Output: Ghi ra các xâu chuẩn.

Ví dụ:

Input Output
4 Quang Vinh, NGUYEN

nGUYEn quaNG vInH Thi Thu Huong, TRAN

tRan thi THU huOnG Quoc Vinh, NGO

nGO quoC VINH Tuan Anh, LE

lE tuAn aNH
#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
char a[50];
scanf("\n");
gets(a);
int x=0 ,j=0 , l=strlen(a), vt ,i ;
while(a[x]==' ') {
x++;
j++;
}

while(a[l-1]==' '){
l--;
}

while(x<l){
if(a[x]==' ') {
vt=x;
break;
}
x++;
}
for(i=x;i<l;i++){
if(a[i-1]==' ' && a[i]!=' '){
if(a[i]>=97 && a[i]<=122) {

a[i]=a[i]-32;
}
printf("%c",a[i]);
}
else if(a[i-1]!=' ' && a[i]!=' ' && a[i+1]!=' '){
if(a[i]>=65 && a[i]<=90) {
a[i]=a[i]+32;
}
printf("%c",a[i]);
}
else if( a[i-1]!=' ' && a[i]!=' ' && a[i+1]==' '){
if(a[i]>=65 && a[i]<=90){
a[i]=a[i]+32;
}
if(i!=l-1) {
printf("%c",a[i]);
printf(" ");
}
else printf("%c",a[i]);
}

}
printf(", ");
for(i=j;i<vt;i++){
if(a[i]>=97 && a[i]<=122){
a[i]=a[i]-32;
}
printf("%c",a[i]);
}
printf("\n");
}
}

TẬP TỪ RIÊNG CỦA HAI XÂU 2


Bài làm tốt nhất

Cho hai xâu ký tự S1 và S2. Hãy viết chương trình tìm các từ chỉ xuất hiện trong S1 mà
không xuất hiện trong S2. Chú ý: mỗi từ chỉ liệt kê 1 lần.

Input: Dòng 1 ghi số bộ test. Mỗi bộ test gồm 2 dòng, mỗi dòng ghi một xâu ký tự độ dài
không quá 200, chỉ bao gồm các ký tự viết thường và các khoảng trống.

Output: Với mỗi bộ test ghi ra các từ có trong S1 mà không có trong S2. Các từ được
ghi theo thứ tự từ điển.

Ví dụ:

Input Output
2 abcd

abc ab ab ab abcd aaa ab abc zzz

ab abc

aaa xyz ab zzz abc dd dd abc

xyz dd ttt sas cdc

#include<stdio.h>
#include<string.h>
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("\n");
char a[202],b[202],s1[202][50],s2[202][50];
gets(a);
scanf("\n");
gets(b);
int la=strlen(a), lb=strlen(b), i, j,n=0,m=0;
char *p1=strtok(a," ");
while(p1!=NULL){
strcpy(s1[n],p1);
n++;
p1=strtok(NULL," ");
}
char *p2=strtok(b," ");
while(p2!=NULL){
strcpy(s2[m],p2);
m++;
p2=strtok(NULL," ");
}

/*for(i=0;i<la;i++){
if(a[i]!=' ') s1[n][j++]=a[i];
if(a[i]==' ' || i==la-1) {
n++;
j=0;
}
}
for(i=0;i<lb;i++){
if(b[i]!=' ') s2[m][k++]=b[i];
if(b[i]==' ' || i==lb-1) {
m++;
k=0;
}
}*/
char t[50];
for(i=0; i<n-1; i++){
for(j=i+1; j<n; j++){
if(strcmp(s1[i],s1[j])>0){
strcpy(t,s1[j]);
strcpy(s1[j],s1[i]);
strcpy(s1[i],t);
}
}
}
for(i=0;i<n;i++){
int kt=0;
for(j=0;j<i;j++){
if(strcmp(s1[i],s1[j])==0){
kt=1;
break;
}
}
for(j=0;j<m;j++){
if(strcmp(s1[i],s2[j])==0){
kt=1;
break;
}
}
if(kt==0) printf("%s ",s1[i]);
}
printf("\n");
}

XÓA TỪ TRONG XÂU

Bài làm tốt nhất

Cho trước một xâu ký tự S1 chỉ bao gồm các chữ cái và khoảng trống cùng một từ S2. Hãy
tìm xem S2 có xuất hiện trong S1 hay không. Nếu có loại bỏ tất cả những lần xuất hiện của S2
trong S1. Chú ý: tìm S2 trong S1 theo kiểu không phân biệt chữ hoa chữ thường

Input: Dòng 1 ghi số bộ test. Mỗi bộ test ghi trên hai dòng: Dòng đầu ghi xâu ký tự S1, độ dài không
quá 200. Dòng thứ 2 ghi từ S2 (không quá 20 ký tự)

Output: Với mỗi bộ test ghi ra thứ tự bộ test và xâu kết quả sau khi đã xóa.

Ví dụ:

Input Output
2 Test 1: ddd abdc aaa bbb ddD XY
Test 2: ACHDNC YYYY ABC ABC
Abc ddd abdc aaa bbb abc ddD XY
aBc
ACHDNC XXXX YYYY ABC ABC XXXX
XxXx

#include<stdio.h>
#include<string.h>
int main(){
int t,o=1;
scanf("%d",&t);
while(t--){
scanf("\n");
char a[1000],b[1000];
gets(a);
scanf("\n");
gets(b);
int m=strlen(a), n=strlen(b),i,j;
for(i=0;i<m;i++){
int k=1;
while(k!=0){
if((a[i+k-1]!=b[k-1]) && (a[i+k-1]!=b[k-1]+32) && (a[i+k-1]!
=b[k-1]-32)) break;

else k++;

if(k==n+1){
for(j=i;j<k+i;j++){
a[j]='\0';
}
k=0;
}
}
}
printf("Test %d: ",o);
for(i=0;i<m;i++){
if(a[i]!='\0') printf("%c",a[i]);
}
printf("\n");
o++;
}
}

XÂU ĐỐI XỨNG

Bài làm tốt nhất

Cho trước một xâu S. Bạn hãy thay đổi đúng 1 kí tự, sao cho xâu mới thu được là một xâu
đối xứng.

Input: Dòng đầu tiên là số lượng bộ test T (T ≤ 20). Mỗi test ghi trên một dòng 1 xâu S có độ
dài không quá 20 kí tự.

Output: Với mỗi test, in ra “YES” nếu có thể biến đổi xâu S thành xâu đối xứng, in ra “NO”
trong trường hợp ngược lại.

Ví dụ:

Input: Output
3 YES

abccaa NO

abbcca YES

abcda
#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
char a[21];
scanf("\n");
gets(a);
int i=0,l=strlen(a);
int d=0,n=l/2;
if(l%2==0){
while(i<n){
if(a[i]!=a[l-1]) {
d++;
}
l--;
i++;

}
if(d==1) printf("YES\n");
else printf("NO\n");
}
else {
while(i<n){
if(a[i]!=a[l-1]) {
d++;
}
l--;
i++;

}
if(d<=1) printf("YES\n");
else printf("NO\n");
}
}
}

CHUẨN HÓA XÂU HỌ TÊN 1

Bài làm tốt nhất

Một xâu họ tên được coi là viết chuẩn nếu chữ cái đầu tiên mỗi từ được viết hoa, các
chữ
cái khác viết thường. Các từ cách nhau đúng một dấu cách và không có khoảng trống
thừa ở đầu và cuối xâu. Hãy viết chương trình đưa các xâu họ tên về dạng chuẩn.
Input:
Dòng 1 ghi số bộ test. Mỗi bộ test ghi trên một dòng xâu ký tự họ tên, không quá
80 ký tự.
Output:
Với mỗi bộ test ghi ra xâu ký tự họ tên đã chuẩn hóa.
Ví dụ:

Input Output
3 Nguyen Van Nam
nGuYEN vAN naM Tran Trung Hieu
tRan TRUNG hiEU Vo Le Hoa Binh
vO le hOA bINh

#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
char a[50];
scanf("\n");
gets(a);
int x=0 ,j=0 , l=strlen(a), vt ,i ;
while(a[x]==' ') {
x++;
j++;
}

while(a[l-1]==' '){
l--;
}
if(a[x]>=97 && a[x]<=122){
a[x]=a[x]-32;
printf("%c",a[x]);
}
for(i=x+1;i<l;i++){
if(a[i-1]==' ' && a[i]!=' '){
if(a[i]>=97 && a[i]<=122) {

a[i]=a[i]-32;
}
printf("%c",a[i]);

}
else if(a[i-1]!=' ' && a[i]!=' ' && a[i+1]!=' '){
if(a[i]>=65 && a[i]<=90) {
a[i]=a[i]+32;
}
printf("%c",a[i]);
}
else if( a[i-1]!=' ' && a[i]!=' ' && a[i+1]==' '){
if(a[i]>=65 && a[i]<=90){
a[i]=a[i]+32;
}
if(i!=l-1) {
printf("%c",a[i]);
printf(" ");
}
else printf("%c",a[i]);
}

}
printf("\n");
}
}

TÌM TỪ THUẬN NGHỊCH DÀI NHẤT

Bài làm tốt nhất

Cho một văn bản. Hãy tìm ra từ thỏa mãn tính chất thuận nghịch có độ dài lớn
nhất trong và cho biết từ đó xuất hiện bao nhiêu lần. Nếu có nhiều từ cùng có độ dài
lớn nhất thì in ra tất cả các từ đó theo thứ tự xuất hiện.

Input: Văn bản không quá 1000 từ.

Output:

Ghi ra trên một dòng từ thuận nghịch có độ dài lớn nhất và số lần xuất hiện của nó.
Nếu có nhiều từ cùng có độ dài lớn nhất thì các từ được liệt kê theo thứ tự xuất hiện
ban đầu.
Ví dụ:

Input Output
AAA BAABA HDHDH ACBSD SRGTDH DDDDS HDHDH 3
DUAHD AAA AD DA HDHDH AAA AAA AAA AAA
DDDAS HDHDH HDH AAA AAA AAA AAA AAA
AAA AAA AAA
DHKFKH DHDHDD HDHDHD DDDHHH HHHDDD
TDTD

#include<stdio.h>
#include<string.h>
int ktra(char a[]){
int l=strlen(a);
for(int i=0;i<l/2;i++){
if(a[i]!=a[l-1-i]) return 0;
}
return 1;
}
struct chuoi{
char xau[101];
};
int main(){
struct chuoi s[8000];
scanf(" ");
int n=0;
while(scanf("%s",s[n].xau)==1) {
n++;
}
int max=0;
for(int i=0;i<n;i++){
int l=strlen(s[i].xau);
if(l>max && ktra(s[i].xau) )max=l;
}
for(int i=0;i<n;i++){
int kt=0,dem=1;
int l=strlen(s[i].xau);
if(l==max && ktra(s[i].xau)==1){
for(int j=0;j<i;j++){
if(strcmp(s[i].xau,s[j].xau)==0){
kt=1;
break;
}
}
if(kt==0){
for(int j=i+1;j<n;j++){
if(strcmp(s[i].xau,s[j].xau)==0) dem++;
}
printf("%s %d\n",s[i].xau,dem);
}
}
}
}

SỐ ĐẦY ĐỦ

Bài làm tốt nhất

Cho một số nguyên dương lớn có nhiều hơn 20 chữ số nhưng không quá 1000 chữ số.
Hãy kiểm tra xem số đó có đầy đủ tất cả các chữ số từ 0 đến 9 hay không.
Dữ liệu vào

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi bộ test là một dãy ký tự có độ dài không quá 1000, không có khoảng trống

Kết quả

 Nếu dữ liệu vào không phải là một số nguyên hợp lệ (có ký tự không phải số
hoặc bắt đầu bằng chữ số 0) thì in ra INVALID
 Nếu dữ liệu vào thỏa mãn đầy đủ thì in ra YES, nếu không in ra NO

Ví dụ

Input Output
3 INVALID

01234aa32432432432534545b987978 YES

123444444444444566666666667890 NO

324562783924723543243243242354354354333234324

#include<stdio.h>
#include<string.h>
int main(){
char a[1001];
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
gets(a);
int
i,l=strlen(a),d0=0,d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0,kt=1,d=0;
while(a[d]==' '){
d++;
}
while(a[l-1]==' '){
l--;
}
for(i=d;i<l;i++){
if((a[i]<'0' || a[i] > '9') || a[d]=='0') {
printf("INVALID");
kt=0;
break;
}
else
{
if(a[i]=='0') d0++;
else if(a[i]=='1') d1++;
else if(a[i]=='2') d2++;
else if(a[i]=='3') d3++;
else if(a[i]=='4') d4++;
else if(a[i]=='5') d5++;
else if(a[i]=='6') d6++;
else if(a[i]=='7') d7++;
else if(a[i]=='8') d8++;
else d9++;
}

}
if(kt==1){
if( d0>0 && d1>0 && d2>0 && d3>0 && d4>0 && d5>0 &&
d6>0 && d7>0 && d8>0 && d9>0) printf("YES");
else printf("NO");
}
printf("\n");

}
}

SỐ ƯU THẾ
Bài làm tốt nhất

Cho một số nguyên dương lớn có nhiều hơn 20 chữ số nhưng không quá 1000 chữ số.
Một số nguyên dương được coi là “số ưu thế chẵn” nếu số chữ số của nó là chẵn và số
chữ số chẵn nhiều hơn số chữ số lẻ.

Một số nguyên dương được coi là “số ưu thế lẻ” nếu số chữ số của nó là lẻ và số chữ
số lẻ nhiều hơn số chữ số chẵn.

Hãy kiểm tra xem số đó có phải là số ưu thế (chẵn hoặc lẻ) hay không. Chú ý: trường
hợp số lượng chữ số chẵn và số lượng chữ số lẻ bằng nhau thì không được coi là số ưu
thế.

Dữ liệu vào

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi bộ test là một dãy ký tự có độ dài không quá 1000, không có khoảng trống

Kết quả

 Nếu dữ liệu vào không phải là một số nguyên hợp lệ (có ký tự không phải số
hoặc bắt đầu bằng chữ số 0) thì in ra INVALID
 Nếu dữ liệu vào thỏa mãn là số ưu thế thì in ra YES, nếu không in ra NO

Ví dụ

Input Output
3 INVALID

01234aa32432432432534545b987978 YES

1234567890123456789000 NO

999999999999999999999999999999

#include<stdio.h>
#include<string.h>
int main(){
char a[1001];
int t;
scanf("%d",&t);
while(t--){
scanf("\n");
gets(a);
int i,l=strlen(a),d0=0,d1=0,kt=1,d=0;
while(a[d]==' '){
d++;
}
while(a[l-1]==' '){
l--;
}
for(i=d;i<l;i++){
if((a[i]<'0' || a[i] > '9') || a[d]=='0') {
printf("INVALID");
kt=0;
break;
}
else
{
if((l-d)%2!=0) {
printf("NO");
kt=0;
break;
}
else {
if(a[i]=='0' || a[i]=='2' || a[i]=='4'|| a[i]=='6' || a[i]=='8') d0+
+;
else d1++;
}
}
}
if(kt==1){
if( d0>d1) printf("YES");
else printf("NO");
}
printf("\n");

}
}

BIỂN SỐ ĐẸP

Bài làm tốt nhất

Biển số xe máy được quy định gồm các thành phần:

 Hai chữ số đầu là mã quản lý theo tỉnh – thành phố (ví dụ mã của Hà Nội là 29
đến 31)
 Tiếp theo là dấu gạch ngang, sau đó là một chữ cái in hoa (từ A đến Z) và một
chữ số. Cặp chữ cái và chữ số này được cấp theo khu vực quận – huyện.
 Tiếp theo là một dãy 5 số gồm 2 cụm: 3 chữ số đầu và hai chữ số sau, phân tách
bởi dấu chấm.

Thông thường, người ta chỉ quan tâm đến 5 chữ số cuối. Giả sử các trường hợp sau
được coi là đẹp:

 Cả 5 chữ số được sắp theo thứ tự tăng chặt từ trái qua phải.
 Cả 5 chữ số đều bằng nhau
 Ba chữ số đầu bằng nhau và hai chữ số cuối bằng nhau
 Cả 5 chữ số đều là 6 và/hoặc 8 (số lộc phát).

Theo quy tắc trên, các biển số sau được coi là đẹp:

 29-T1 123.79
 29-T1 555.55
 29-T1 222.33
 29-T1 686.88

Và các biển số sau không đẹp:

 29-T1 123.33
 29-T1 555.54
 29-T1 606.88

Viết chương trình kiểm tra xem các biển số xe có đẹp hay không.

Dữ liệu vào
 Dòng đầu ghi số bộ test, không quá 50
 Mỗi bộ test là một biển số. Dữ liệu vào đảm bảo biển số được viết đúng quy
định.

Kết quả

 In ra kết quả kiểm tra với từng bộ test

Ví dụ

Input Output
7 YES

29-T1 123.45 YES

29-T1 555.55 YES

29-T1 222.33 YES

29-T1 686.88 NO

29-T1 123.33 NO

29-T1 555.54 NO

29-T1 606.88

#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
char a[100];
scanf("\n");
gets(a);
int l=strlen(a);
int i;
int kt=0;
if(a[6]<a[7] && a[7]<a[8] &&
a[8]<a[10] && a[10]<a[11]){
kt=1;
}
else if(a[6]==a[7] &&
a[7]==a[8] && a[8]==a[10] && a[10]==a[11]){
kt=1;
}
else if(a[6]==a[7] &&
a[7]==a[8] && a[10]==a[11]){
kt=1;
}
else if( (a[6]==54 || a[6]==56)
&& (a[7]==54 || a[7]==56) && (a[8]==54 || a[8]==56) && (a[10]==54 || a[10]==56)
&& (a[11]==54 || a[11]==56)){
kt=1;
}
else {
kt=0;
}
if(kt!=1) printf("NO\n");
else printf("YES\n");

}
}
DÃY ƯU THẾ

Bài làm tốt nhất

Cho dãy A[] chỉ bao gồm các số nguyên dương không quá 10 5 nhưng không biết trước
số phần tử của dãy. Người ta gọi dãy A[] là dãy ưu thế nếu thỏa mãn 1 trong 2 điều
kiện sau đây:

 Dãy gọi là ưu thế chẵn nếu số phần tử của dãy là chẵn và số lượng số chẵn
trong dãy nhiều hơn số lượng số lẻ.
 Dãy gọi là ưu thế lẻ nếu số phần tử của dãy là lẻ và số lượng số lẻ trong dãy
nhiều hơn số lượng số chẵn.

Hãy kiểm tra xem dãy A[] có phải là dãy ưu thế hay không.

Dữ liệu vào

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi bộ test là một dãy các số nguyên dương (không quá 104) và có không quá
200 số, các số cách nhau 1 khoảng trống, không biết trước số lượng phần tử.

Kết quả

 Nếu dãy A[] thỏa mãn là dãy ưu thế thì in ra YES, nếu không in ra NO

Ví dụ

Input Output
2 YES

11 22 33 44 55 66 77 NO

23 34 45 56 67 78 89 90 121 131 141 151 161 171

#include<stdio.h>
#include<string.h>
int main(){
int t;
char a[10001];
scanf("%d",&t);
while(t--){
scanf("\n");

gets(a);
int l=strlen(a),i;
int d=0,e=0,x=1;
for(i=0;i<l;i++){
if(a[i+1]==' '){
x++;
if(a[i]%2==0) d++;
else e++;
}
}
if(a[l-1]%2==0) d++;
else e++;
if(x%2==0 && d>e) printf("YES\n");
else if(x%2!=0 && d<e) printf("YES\n");
else printf("NO\n");

}
}

PHÂN SỐ

Bài làm tốt nhất

Cho hai phân số p và q với tử số và mẫu số không quá 10000. Hãy viết chương trình thực
hiện:

a. Rút gọn sau đó Quy đồng hai phân số


b. Tính tổng hai phân số và rút gọn
c. Tính thương hai phân số và rút gọn

Input: Dòng 1 ghi số bộ test. Mỗi bộ test ghi trên một dòng 4 số nguyên dương lần lượt là tử
số của p, mẫu số của p, tử số của q, mẫu số của q. Mỗi số cách nhau 1 khoảng trống

Output: Dòng đầu ghi dòng chữ Case và thứ tự bộ test (theo mẫu trong ví dụ). Tiếp theo là 3
dòng:

 Dòng 1 ghi 2 phân số sau khi quy đồng


 Dòng 2 ghi phân số tổng
 Dòng 3 ghi phân số thương

Ví dụ:

Input Output
2 Case #1:

2 3 4 5 10/15 12/15

1 4 7 8 22/15

5/6

Case #2:

2/8 7/8

9/8

2/7

#include<stdio.h>
int uoc(int a,int b){
while(a%b!=0){
int d=a%b;
a=b;
b=d;
}
return b;
}
int boi(int a,int b){
return (a*b)/(uoc(a,b));
}
int main(){
int t,a,b,c,d;
scanf("%d",&t);
int l=1;
while(t--){
scanf("%d %d %d %d",&a,&b,&c,&d);
int x=uoc(a,b),y=uoc(c,d);
a=a/x;
b=b/x;
c=c/y;
d=d/y;
int e=boi(b,d);
int x1=a*(e/b),x2=c*(e/d);
printf("Case #%d:\n",l);
printf("%d/%d %d/%d\n",x1,e,x2,e);
int st=(x1+x2)/uoc(x1+x2,e),sm=e/uoc((x1+x2),e);
printf("%d/%d\n",st,sm);
int tt=x1/(uoc(x1,x2)),tm=(x2/uoc(x1,x2));
printf("%d/%d\n",tt,tm);
l++;
}
}

SẮP XẾP DANH SÁCH MẶT HÀNG


Bài làm tốt nhất

Hãy sắp xếp danh sách các mặt hàng theo lợi nhuận giảm dần. Mỗi mặt hàng gồm các thông
tin: Mã mặt hàng (là một số nguyên, tự động tăng, tính từ 1); Tên mặt hàng, nhóm hàng: là
các xâu ký tự; Giá mua, giá bán: là các số thực (không quá 9 chữ số)

Input:

Dòng đầu chứa số mặt hàng. Mỗi mặt hàng viết trên 4 dòng: Dòng 1: Tên mặt hàng. Dòng 2:
Nhóm hàng. Dòng 3: Giá mua. Dòng 4: Giá bán

Output: Ghi ra danh sách mặt hàng đã sắp xếp theo lợi nhuận giảm dần (lợi nhuận tính bằng
giá bán trừ đi giá mua). Mỗi mặt hàng viết trên một dòng gồm: mã, tên, nhóm hàng và lợi
nhuận. Các thông tin cách nhau đúng 1 khoảng trống. Lợi nhuận viết với 2 chữ số sau dấu
phẩy.

Ví dụ:

Input Output
3 2 Tu lanh Side by Side Dien lanh 7699.00

May tinh SONY VAIO 1 May tinh SONY VAIO Dien tu 1299.00

Dien tu 3 Banh Chocopie Tieu dung 9.50

16400

17699

Tu lanh Side by Side

Dien lanh

18300

25999

Banh Chocopie

Tieu dung

27.5
37

#include<stdio.h>
#include<string.h>
struct bh{
int mmh;
char mh[1001];
char nh[1001];
float gm;
float gb;
float ln;
};

int main(){
int t,i,j;
scanf("%d",&t);
struct bh b[t+1],x;
for(i=1;i<=t;i++){
scanf("\n");
gets(b[i].mh);
scanf("\n");
gets(b[i].nh);
scanf("\n");
scanf("%f",&b[i].gm);
scanf("%f",&b[i].gb);
b[i].ln=b[i].gb-b[i].gm;
b[i].mmh=i;
}
for(i=1;i<t;i++){
for(j=i+1;j<=t;j++){
if(b[j].ln>b[i].ln){
x=b[j];
b[j]=b[i];
b[i]=x;
}
}
}
for(i=1;i<=t;i++){
printf("%d %s %s %.2f\n",b[i].mmh,b[i].mh,b[i].nh,b[i].ln);
}
}

TÌM THỦ KHOA CỦA KỲ THI

Bài làm tốt nhất

Cho danh sách thí sinh gồm các thông tin: Mã thí sinh: là một số nguyên, tự động tăng, tính từ
1; Tên thí sinh, ngày sinh, điểm môn 1, điểm môn 2, điểm môn 3. Hãy tìm thủ khoa trong
danh sách đó. Nếu có nhiều thí sinh có điểm bằng nhau và đều cao nhất thì in ra tất cả thí sinh
đó theo mã tăng dần.

Input:

Dòng đầu chứa số thí sinh. Mỗi thí sinh viết trên 3 dòng: Dòng 1: Tên thí sinh, Dòng 2: Ngày
sinh, Dòng 3,4,5: 3 điểm thi tương ứng. Các điểm thi đều đảm bảo hợp lệ (từ 0 đến 10).

Output: In ra các thủ khoa của kỳ thi, mỗi thí sinh 1 dòng, gồm mã, tên, ngày sinh và tổng
điểm. Chú ý: nếu có nhiều thí sinh bằng điểm nhau và cao nhất thì in ra tất cả thí sinh đó theo
thứ tự mã thí sinh tăng dần.

Ví dụ:

Input Output
3 2 Nguyen Van B 1/9/1994 26.5
Nguyen Van A 3 Nguyen Van C 6/7/1994 26.5
12/12/1994
3.5
7.0
5.5
Nguyen Van B
1/9/1994
7.5
9.5
9.5
Nguyen Van C
6/7/1994
8.5
9.5
8.5
#include<stdio.h>
struct sv{
int stt;
char ten[1001];
int ngay;
int thang;
int nam;
float d1;
float d2;
float d3;
float tong;
};
int main(){
int t,i,j;
scanf("%d",&t);
struct sv a[t+1];
float max=0;
for(i=1;i<=t;i++){
scanf("\n");
gets(a[i].ten);
scanf("\n");
scanf("%d/%d/%d",&a[i].ngay,&a[i].thang,&a[i].nam);
scanf("%f",&a[i].d1);
scanf("%f",&a[i].d2);
scanf("%f",&a[i].d3);
a[i].stt=i;
a[i].tong=a[i].d1+a[i].d2+a[i].d3;
if(a[i].tong>max) max=a[i].tong;
}
for(i=1;i<=t;i++){
if(a[i].tong==max){
printf("%d %s %d/%d/%d %g\
n",a[i].stt,a[i].ten,a[i].ngay,a[i].thang,a[i].nam,a[i].tong);
}
}
}

SẮP XẾP THÍ SINH

Bài làm tốt nhất

Hãy sắp xếp danh sách thí sinh theo tổng điểm giảm dần.

Mỗi thí sinh gồm các thông tin:

 Mã thí sinh: là một số nguyên, tự động tăng. Tính từ 1.


 Tên thí sinh, ngày sinh
 Điểm môn 1, điểm môn 2, điểm môn 3

Input:

Dòng đầu chứa số thí sinh. Mỗi thí sinh viết trên 3 dòng:

 Dòng 1: Tên thí sinh


 Dòng 2: Ngày sinh
 Dòng 3,4,5: 3 điểm thi tương ứng. Các điểm thi đều đảm bảo hợp lệ (từ 0 đến
10).

Output:

In ra danh sách thí sinh đã sắp xếp theo tổng điểm giảm dần. Nếu 2 thí sinh bằng điểm
nhau thì thí sinh nào xuất hiện trước sẽ viết trước. Mỗi thí sinh viết trên một dòng
gồm: mã, tên, ngày sinh và tổng điểm. Các thông tin cách nhau đúng 1 khoảng trống.
Điểm tổng được làm tròn đến 1 số sau dấu phẩy.

Ví dụ
Input Kết quả
3 2 Nguyen Van B 1/9/1994 26.5

Nguyen Van A 1 Nguyen Van A 12/12/1994 16.0

12/12/1994 3 Nguyen Van C 6/7/1994 14.0

3.5

7.0

5.5

Nguyen Van B

1/9/1994

7.5

9.5

9.5

Nguyen Van C

6/7/1994

4.5

4.5

5.0

#include<stdio.h>
#include<string.h>
struct sv{
int stt;
char ten[1001];
char sinh[1001];
float d1;
float d2;
float d3;
float tong;
};
int main(){
int t,i,j;
scanf("%d",&t);
struct sv a[t+1],x;
float max=0;
for(i=1;i<=t;i++){
scanf("\n");
gets(a[i].ten);
scanf("\n");
gets(a[i].sinh);
scanf("\n");
scanf("%f",&a[i].d1);
scanf("%f",&a[i].d2);
scanf("%f",&a[i].d3);
a[i].stt=i;
a[i].tong=a[i].d1+a[i].d2+a[i].d3;
}
for(i=1;i<t;i++){
for(j=i+1;j<=t;j++){
if(a[j].tong>a[i].tong){
x=a[j];
a[j]=a[i];
a[i]=x;
}
}
}
for(i=1;i<=t;i++){

printf("%d %s %s %.1f\n",a[i].stt,a[i].ten,a[i].sinh,a[i].tong);
}
}
TIẾN HÓA POKEMON

Bài làm tốt nhất


Rảnh rỗi, Tí đang ngồi chơi Pokemon Go, một game đã không còn mấy thịnh hành. Vì
vậy, bắt pokemon dễ như ăn kẹo. Tí bắt được rất nhiều con pokemon và đầu tư mua
được một số ít viên đá tiến hóa. Tuy nhiên, mỗi loại đá chỉ dùng được cho một loại
pokemon. Với một con pokemon chủng P[i], Tí cần dùng K[i] viên đá để tiến hóa cho
nó. Sau khi tiến hóa xong, Tí sẽ thu lại được thêm 2 viên đá nữa.

Không có việc gì làm nên Tí cho đống pokemon của mình tiến hóa hết một lượt. Các
bạn hãy tính xem Tí có thể tiến hóa được bao nhiêu con, và loại pokemon nào được
tiến hóa nhiều nhất?

Input

Dòng đầu tiên là N (N ≤ ≤ 70), số lượng loại pokemon mà Tí bắt được. Giả sử rằng Tí
có vô hạn các con pokemon trong mỗi loại.

2N dòng tiếp theo, mỗi dòng gồm một xâu P[i], là loại pokemon mà Tí có. Tiếp theo là
2 số nguyên K[i] (10 ≤ K[i] ≤ 400) và M[i] (1 ≤ M[i] ≤ 10 000), lần lượt là số lượng
viên đá cần để tiến hóa cho một con pokemon loại P[i], và số lượng viên đá loại i mà
Tí có.

Output

Dòng đầu tiên in ra tổng số lượng các con pokemon được tiến hóa.

Dòng thứ hai in ra loại pokemon nào được tiến hóa nhiều nhất. Nếu có nhiều đáp án,
hãy in ra tên loại pokemon xuất hiện sớm hơn trong danh sách.

Test ví dụ:

Input: Output
5 15

Pidgey Ivysaur

12 36

Ivysaur

10 63

Charmander

35 96
Pikachu

12 32

Squirtle

15 10

#include<stdio.h>
#include<string.h>
int b[10000]={0};
int main(){
int n,m,k;
char a[1001][1001];
scanf("%d",&n);
int i,max=0,s=0;
for(i=1;i<=n;i++){
scanf("\n");
gets(a[i]);
scanf("%d %d",&k,&m);
int e=0;
while(m>=k){
int d=m/k;
e=e+d;
m=m%k+2*d;
}
b[i]=e;
if(b[i]>max) max=b[i];
s=s+b[i];
}
printf("%d\n",s);
for(i=1;i<=n;i++){
if(b[i]==max){
puts(a[i]);
break;
}
}

ƯỚC SỐ NGUYÊN TỐ LỚN NHẤT

Bài làm tốt nhất


Cho số nguyên dương N. Hãy đưa ra ước số nguyên tố lớn nhất của N.

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào T bộ test. Mỗi bộ test ghi số nguyên dương N.
 T, N thỏa mãn ràng buộc: 1≤T≤100; 2≤N≤1010.

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input: Output:
2 7

315 31

31

#include<stdio.h>
#include<math.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
long long n,x,i;
scanf("%lld",&n);
for(i=2;i<=sqrt(n);i++){
while(n%i==0){
x=i;
n=n/i;
}
}
if(n>1) x=n;
printf("%lld\n",x);
}
}

TÍNH TỔNG NHỎ NHẤT VÀ LỚN NHẤT

Bài làm tốt nhất


Cho hai số nguyên dương X1, X2. Ta chỉ được phép thay đổi chữ số 5 thành 6 và ngược lại
chữ số 6 thành chữ số 5 của các số X1 và X2. Hãy đưa ra tổng nhỏ nhất và tổng lớn nhất các
số X1 và X2 được tạo ra theo nguyên tắc kể trên.

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào T bộ test. Mỗi bộ test là cặp các số X1, X2.
 T, X1, X2 thỏa mãn ràng buộc: 1≤ T ≤100; 0≤ X1, X2 ≤1018.

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Input: Output:
2 1100 1312
645 666 10010 11132
5466 4555
#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
long long a,b;
scanf("%lld %lld",&a,&b);
long long s=a+b,x=1,y=1,s1=0,s2=0;
int d,e;
while(a>0){
d=a%10;
if(d==6) {s1=s1+x;}
if(d==5) {s2=s2+x;}
a=a/10;
x=x*10;
}
while(b>0){
e=b%10;
if(e==6) {s1=s1+y;}
if(e==5) {s2=s2+y;}
b=b/10;
y=y*10;
}
long long sl=s+s2,sn=s-s1;
printf("%lld %lld\n",sn,sl);
}
}

QUẢN LÝ SINH VIÊN - 1

Bài làm tốt nhất


Thông tin về sinh viên gồm có:

1. mã sinh viên là số nguyên tự động tăng;

2. tên sinh viên;

3. điểm sinh viên là số thực gồm điểm môn A, môn B, môn C.

Viết chương trình thực hiện 3 chức năng:

1. thêm mới

2. cập nhật điểm theo mã sinh viên

3. hiển thị danh sách sinh viên theo tổng điểm tăng dần

Input:

- Dòng thứ nhất là lựa chọn chức năng thực hiện

- Dòng thứ hai

+ Nếu lựa chọn ở dòng thứ nhất là 1 thì nhập số sinh viên sẽ thêm mới

+ Nếu lựa chọn ở dòng thứ nhất là 2 thì nhập mã sinh viên sẽ sửa đổi

- Dòng tiếp theo là thông tin sinh viên

Chức năng 3 cũng là kết thúc của luồng input


Output:

- Nếu lựa chọn là 1 thì in ra số sinh viên được thêm

- Nếu lựa chọn là 2 thì in ra mã sinh viên được sửa

- Nếu lựa chọn là 3 thì in ra danh sách theo mô tả dưới đây (các thông tin cách nhau
một khoảng trắng)

Ví dụ:

Input Output
1 2

2 2

nguyen van hai 2 tran van nam 5.5 5.0 6.0

8.5 5.5 7.5 1 nguyen van hai 8.5 5.5 7.5

tran van tuan

8.5 .50 9.0

tran van nam

5.5 5.0 6.0

3
#include<stdio.h>
#include<string.h>
struct sv{
int stt;
char ten[1001];
float d1,d2,d3;
float tong;
};
int main(){
int p=1,b[1001];
int t,kt=1;
struct sv a[1001],x;
while(kt!=0){
scanf("%d",&b[p]);
if(b[p]==1){
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("\n");
gets(a[i].ten);
scanf("\n");
scanf("%f %f %f",&a[i].d1,&a[i].d2,&a[i].d3);
a[i].stt=i;
a[i].tong=a[i].d1+a[i].d2+a[i].d3;
}
printf("%d\n",t);
}
else if(b[p]==2){
scanf("%d",&x.stt);
scanf("\n");
gets(x.ten);
scanf("\n");
scanf("%f %f %f",&x.d1,&x.d2,&x.d3);
x.tong=x.d1+x.d2+x.d3;
printf("%d\n",x.stt);
for(int i=1;i<=t;i++){
if(a[i].stt==x.stt ) a[i]=x;
}
for(int i=1;i<t;i++){
for(int j=i+1;j<=t;j++){
if(a[j].tong<a[i].tong){
struct sv tg=a[j];
a[j]=a[i];
a[i]=tg;
}
}
}

}
else break;
p++;
}
for(int i=1;i<=t;i++){
printf("%d %s %.1f %.1f %.1f\n",a[i].stt,a[i].ten,a[i].d1,a[i].d2,a[i].d3);

}
QUẢN LÝ SINH VIÊN - 2

Bài làm tốt nhất


Thông tin về sinh viên gồm có:

1. mã sinh viên là số nguyên tự động tăng;

2. tên sinh viên;

3. điểm sinh viên là số thực gồm điểm môn A, môn B, môn C.

Viết chương trình thực hiện 3 chức năng:

1. thêm mới

2. cập nhật điểm theo mã sinh viên

3. hiển thị danh sách các sinh viên có điểm 3 môn tăng dần (theo thứ tự xuất hiện)

Input:

- Dòng thứ nhất là lựa chọn chức năng thực hiện

- Dòng thứ hai

+ Nếu lựa chọn ở dòng thứ nhất là 1 thì nhập số sinh viên sẽ thêm mới

+ Nếu lựa chọn ở dòng thứ nhất là 2 thì nhập mã sinh viên sẽ sửa đổi

- Dòng tiếp theo là thông tin sinh viên

Chức năng 3 cũng là kết thúc của luồng input

Output:

- Nếu lựa chọn là 1 thì in ra số sinh viên được thêm

- Nếu lựa chọn là 2 thì in ra mã sinh viên được sửa

- Nếu lựa chọn là 3 thì in ra danh sách theo mô tả dưới đây (các thông tin cách nhau
một khoảng trắng)

Ví dụ:
Input Output
1 2

2 2

nguyen van hai 2 tran van nam 5.5 6.0 7.0

8.5 5.5 7.5

tran van tuan

8.5 6.5 9.0

tran van nam

5.5 6.0 7.0

#include<stdio.h>
#include<string.h>
struct sv{
int stt;
char ten[1001];
float d1,d2,d3;
float tong;
};
int main(){
int p=1,b[1001];
int t,kt=1;
struct sv a[1001],x;
while(kt!=0){
scanf("%d",&b[p]);
if(b[p]==1){
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("\n");
gets(a[i].ten);
scanf("\n");
scanf("%f %f %f",&a[i].d1,&a[i].d2,&a[i].d3);
a[i].stt=i;
a[i].tong=a[i].d1+a[i].d2+a[i].d3;
}
printf("%d\n",t);
}
else if(b[p]==2){
scanf("%d",&x.stt);
scanf("\n");
gets(x.ten);
scanf("\n");
scanf("%f %f %f",&x.d1,&x.d2,&x.d3);
x.tong=x.d1+x.d2+x.d3;
printf("%d\n",x.stt);
for(int i=1;i<=t;i++){
if(a[i].stt==x.stt ) a[i]=x;
}
for(int i=1;i<t;i++){
for(int j=i+1;j<=t;j++){
if(a[j].tong<a[i].tong){
struct sv tg=a[j];
a[j]=a[i];
a[i]=tg;
}
}
}

}
else break;
p++;
}
for(int i=1;i<=t;i++){
if(a[i].d1<a[i].d2 && a[i].d2<a[i].d3){

printf("%d %s %.1f %.1f %.1f\n",a[i].stt,a[i].ten,a[i].d1,a[i].d2,a[i].d3);


}

CHIA HẾT

Bài làm tốt nhất


Cho hai số nguyên dương n và k. Hãy kiểm tra xem giai thừa của n (n!) có chia hết cho
2k hay không.

Input

Có một dòng ghi 2 số n và k (1 ≤ n, k ≤ 100).

Output

Nếu n! chia hết cho 2k thì in ra “Yes”, ngược lại in ra “No”.

Ví dụ

Input Output
5 3 Yes
Input Output
1 1 No
#include<stdio.h>
int main(){
int n,k,dem=0;
scanf("%d %d",&n,&k);
for(int i=2;i<=n;i++){
int x=i;
while(x%2==0){
dem++;
x/=2;
}
}
if(dem>=k)printf("Yes");
else printf("No");
}

SỐ THUẦN NGUYÊN TỐ

Bài làm tốt nhất


Một số được coi là thuần nguyên tố nếu nó là số nguyên tố, tất cả các chữ số là nguyên tố và
tổng chữ số của nó cũng là một số nguyên tố. Bài toán đặt ra là đếm xem trong một đoạn giữa
hai số nguyên cho trước có bao nhiêu số thuần nguyên tố.

Input: Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng hai số nguyên dương
tương ứng, cách nhau một khoảng trống. Các số đều không vượt quá 9 chữ số.

Output: Mỗi bộ test viết ra số lượng các số thuần nguyên tố tương ứng.

Ví dụ:

Input Ouput
2 1
23 199 15

2345 6789

#include<stdio.h>
#include<math.h>

int snt(long a){


int kt=0;
if(a<2) return 0;
for(long i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1 ) return 0;
else return 1;
}
int ktcsnt(long a){
int d,kt=0;
while(a>0){
d=a%10;
a=a/10;
if(d!=2 && d!=3 && d!=5 && d!=7){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int kttongsnt(long a){
long long s=0,d;
while(a>0){
d=a%10;
s=s+d;
a=a/10;
}
if(snt(s)==0) return 0;
else return 1;
}
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,m,i,d=0;
scanf("%ld %ld",&n,&m);
for(i=n;i<=m;i++){

if( ktcsnt(i)==1 ){

if( kttongsnt(i)==1){

if(snt(i)==1){

d++;
}
}
}

}
printf("%ld\n",d);
}
return 0;
}

GHÉP HÌNH

Bài làm tốt nhất


Cho ba hình chữ nhật. Các bạn được phép xoay hình nhưng không được phép xếp chồng lấn
lên nhau, hỏi 3 hình chữ nhật đó có thể ghép thành một hình vuông được hay không

Input: Có ba dòng, mỗi dòng ghi hai số nguyên dương là chiều rộng và chiều cao của hình
chữ nhật (các số đều không quá 100).

Output: Ghi ra YES nếu có thể tạo thành hình vuông, NO nếu không thể.

Ví dụ:

Input Output
8 2 YES

1 6

7 6

#include<stdio.h>

int main(){
int a,b,m,n,x,y;
scanf("%d%d%d%d%d%d",&a,&b,&m,&n,&x,&y);
if(m+x==a && b+n==a && y+b==a) printf("YES");
else if(a+x==m && b+n==m && y+n==m) printf("YES");
else if(a+m==x && b+y==x && n+y==x) printf("YES");
else if(b==n && n==y && a+m+x==b) printf("YES");
else if(a+x==y && m+x==y && b+n==y ) printf("YES");
else if(x+a==b && m+a==b && y+n==b) printf("YES");
else if(x+m==n && a+m==n && y+b==n) printf("YES");
else if(a==x && m==x && b+y+n==a) printf("YES");

else if(m+x==b && a+n==b && y+a==b) printf("YES");


else if(b+x==m && a+n==m && y+n==m) printf("YES");
else if(b+m==x && a+y==x && n+y==x) printf("YES");
else if(a==n && n==y && b+m+x==a) printf("YES");
else if(b+x==y && m+x==y && a+n==y ) printf("YES");
else if(x+b==a && m+b==a && y+n==a) printf("YES");
else if(x+m==n && b+m==n && y+a==n) printf("YES");
else if(b==x && m==x && a+y+n==b) printf("YES");

else if(n+x==a && b+m==a && y+b==a) printf("YES");


else if(a+x==n && b+m==n && y+m==n) printf("YES");
else if(a+n==x && b+y==x && m+y==x) printf("YES");
else if(b==m && m==y && a+n+x==b) printf("YES");
else if(a+x==y && n+x==y && b+m==y ) printf("YES");
else if(x+a==b && n+a==b && y+m==b) printf("YES");
else if(x+n==m && a+n==m && y+b==m) printf("YES");
else if(a==x && n==x && b+y+m==a) printf("YES");

else if(m+y==a && b+n==a && x+b==a) printf("YES");


else if(a+y==m && b+n==m && x+n==m) printf("YES");
else if(a+m==y && b+x==y && n+x==y) printf("YES");
else if(b==n && n==x && a+m+y==b) printf("YES");
else if(a+y==x && m+y==x && b+n==x ) printf("YES");
else if(y+a==b && m+a==b && x+n==b) printf("YES");
else if(y+m==n && a+m==n && x+b==n) printf("YES");
else if(a==y && m==y && b+x+n==a) printf("YES");

else printf("NO");
}
LIỆT KÊ VÀ ĐẾM

Bài làm tốt nhất


Cho một dãy các số nguyên dương không quá 9 chữ số, mỗi số cách nhau vài khoảng trống, có thể
xuống dòng. Hãy tìm các số không giảm (các chữ số theo thứ tự từ trái qua phải tạo thành dãy không
giảm) và đếm số lần xuất hiện của các số đó.

Input: Gồm các số nguyên dương không quá 9 chữ số. Không quá 100000 số.

Kết quả Ghi ra các số không giảm kèm theo số lần xuất hiện. Các số được liệt kê theo thứ tự sắp xếp
số lần xuất hiện giảm dần.

Ví dụ:

Input Output
123 321 23456 123 123 23456 3523 123 321 8988 123 5
7654 9899 3456 123 999 3456 987654321 4546
63543 4656 13432 4563 123471 659837 454945 3456 3
34355 9087 9977 98534 3456 23134 23456 2
999 1

#include<stdio.h>
int thuannghich(int n){
int a,b;
while(n>=10){
a=n%10; b=(n/10)%10;
if(a<b) return 0;
n=n/10;
}
return 1;
}
int tim(int a[],int n, int x){
for(int i=0;i<n;i++) if(a[i]==x) return i;
return -1;
}
void sapxep(int a[],int b[],int n){
int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(b[i]<b[j]){
t=a[i]; a[i]=a[j]; a[j]=t;
t=b[i]; b[i]=b[j]; b[j]=t;
}
}
void in(int a[],int b[],int n){
for(int i=0;i<n;i++) printf("%d %d\n",a[i],b[i]);
}
main(){
int a[10000],b[10000]={0},x,n=0;
while(scanf("%d",&x)!=-1){
if(thuannghich(x)){
int t = tim(a,n,x);
if(t==-1){
a[n] = x; b[n] = 1; n++;
}
else b[t]++;
}
}
sapxep(a,b,n); in(a,b,n);
}
SẮP XẾP NỔI BỌT

Bài làm tốt nhất


Hãy thực hiện thuật toán sắp xếp nổi bọt trên dãy N số nguyên. Ghi ra các bước thực hiện
thuật toán.

Input: Dòng 1 ghi số N (không quá 100). Dòng 2 ghi N số nguyên dương (không quá 100).

Output:Ghi ra màn hình từng bước thực hiện thuật toán. Mỗi bước trên một dòng, các số
trong dãy cách nhau đúng một khoảng trống.

Ví dụ:

Input Output
4 Buoc 1: 3 2 5 7

5 3 2 7 Buoc 2: 2 3 5 7

#include<stdio.h>
int main (){
int n;
scanf("%d",&n);
int a[n],i,j;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int k=1;
for(i=0;i<n-1;i++){
int kt=0;
int x=0;
for(j=x+1;j<n;j++){
if(a[x]>a[j]){
int d=a[j];
a[j]=a[x];
a[x]=d;
kt++;

}
x++;
}
if(kt==0) {
break;
}
printf("Buoc %d: ",k);
for(j=0;j<n;j++){
printf("%d ",a[j]);
}
printf("\n");
k++;
}
}
LEO NÚI

Bài làm tốt nhất


Có N (1≤N≤25000) người leo lên và leo xuống trên 1 ngọn núi. Người i mất U(i) thời gian leo
lên và D(i) thời gian để leo xuống. Trong một thời điểm chỉ có tối đa người 1 người có thể lên
và tối đa 1 người có thể xuống (có thể 1 người lên, 1 người xuống). Những người khác có thể
đứng chờ ở đỉnh ngọn núi. Thứ tự đi xuống có thể khác thứ tự đi lên. Bạn hãy xác định xem
thời gian tối thiểu để cho N người lên và xuống ngọn núi là bao nhiêu.

Input: Dòng 1 ghi số N. N dòng tiếp theo chứa 2 số U(i) và D(i) (1 ≤ U(i) , D(i) ≤ 50000)

Output:Ghi ra thời gian tối thiểu có thể.

Ví dụ: (Giải thích: đi lên và xuống theo thứ tự người 3->1->2)

Input Output
3 17

6 4

8 1

2 3

#include<stdio.h>

int main()
{
long n;
long MinU=50005;
long MinD=50005;
long U,D;
long TU=0,TD=0;
scanf("%ld",&n);
for(long i=1;i<=n;i++) { scanf("%ld%ld",&U,&D); TU+=U; TD+=D; if(MinU>U)
MinU=U;
if(MinD>D) MinD=D;
}
TU+=MinD;
TD+=MinU;
if(TU>TD) printf("%ld",TU);
else printf("%ld",TD);

DÃY CON LIÊN TIẾP CÓ TỔNG LỚN NHẤT

Bài làm tốt nhất


Cho dãy số A[] gồm có N phần tử. Nhiệm vụ của bạn là hãy tìm một dãy con liên tiếp sao cho
tổng các phần tử của chúng là lớn nhất.

Input: Dòng đầu tiên là số lượng bộ test T (T ≤ 10). Mỗi test gồm số nguyên N (1≤ N ≤ 100
000), số lượng phần tử trong dãy số ban đầu. Dòng tiếp theo gồm N số nguyên A[i] (-10 9 ≤
A[i] ≤ 109).

Output: Với mỗi test, in ra một số nguyên là đáp án của bài toán trên một dòng.

Ví dụ:

Input Output
2 7

8 15

-2 -3 4 -1 -2 1 5 -3

1 2 3 4 5
#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,j,i,max,kt=0;
scanf("%ld",&n);
long a[n];
for(i=0;i<n;i++){
scanf("%ld",&a[i]);
max=a[0];
if(max<a[i]) max=a[i];
}
for(i=0;i<n;i++){
if(a[i]>0){
kt=1;
break;
}
}
if(kt==0) printf("%ld\n",max);
else{
long s=0,smax=a[0];
for(i=0;i<n;i++){
if((s+a[i])<0){
s=0;
continue;
}
s+=a[i];
if(s>smax) smax=s;
}
printf("%ld\n",smax);
}
}

SỐ ĐẦU TIÊN BỊ LẶP

Bài làm tốt nhất


Cho dãy số A[] gồm có N phần tử. Nhiệm vụ của bạn là hãy tìm số xuất hiện nhiều hơn 1 lần
trong dãy số và số thứ tự là nhỏ nhất.

Input: Dòng đầu tiên là số lượng bộ test T (T ≤ 10). Mỗi test gồm số nguyên N (1≤ N ≤ 100
000), số lượng phần tử trong dãy số ban đầu. Dòng tiếp theo gồm N số nguyên A[i] (0 ≤ A[i]
≤ 109).

Output: Với mỗi test in ra đáp án của bài toán trên một dòng. Nếu không tìm được đáp án, in
ra “NO”.

Ví dụ:

Input Output
2 5

7 NO

10 5 3 4 3 5 6

1 2 3 4
#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
int n,j,i,kt=0,d;
scanf("%d",&n);
long a[n];
for(i=0;i<n;i++){
scanf("%ld",&a[i]);
}
for(i=0;i<n-1;i++){
d=0;
for(j=i+1;j<n;j++){
if(a[j]==a[i]){
d++;
break;
}
}
if(d>0){
printf("%ld",a[i]);
kt=1;
break;
}
}
if(kt==0) printf("NO");
printf("\n");
}

}
BRT

Bài làm tốt nhất


Thành phố X có N thị trấn trên trục đường chính. Tọa độ của các thị trấn lần lượt là a[1], a[2],
…, a[N], các tọa độ này là phân biệt, không có 2 tọa độ nào trùng nhau.

Chính quyền thành phố muốn xây dựng một tuyến buýt nhanh BRT để kết nối 2 thị trấn gần
nhau nhất với nhau.

Bạn hãy tính thử xem chiều dài của tuyến buýt này bằng bao nhiêu? Và có bao nhiêu cặp thị
trấn có tiềm năng giống nhau để xây dựng tuyến BRT này.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 10).

Mỗi test bắt đầu bằng số nguyên N (N ≤ 100 000).

Dòng tiếp theo gồm N số nguyên A[i] (-109 ≤ A[i] ≤ 109).

Output:

Với mỗi test in ra 2 số nguyên C và D, lần lượt là khoảng cách ngắn nhất giữa 2 thị trấn, và số
lượng cặp thị trấn có cùng khoảng cách ngắn nhất này.

Ví dụ:

Input Output
2 2 1

4 2 2

6 -3 0 4

-2 0 2
#include <stdio.h>
#include <stdlib.h>
void merge(long arr[], long l, long m, long r)
{
long i, j, k;
long n1 = m - l + 1;
long n2 = r - m;

long L[n1], R[n2];

for (i = 0; i < n1; i++)


L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];

i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}

void mergeSort(long arr[], long l, long r)


{
if (l < r) {

long m = l + (r - l) / 2;

mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);

merge(arr, l, m, r);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
long n,i,j;
scanf("%ld",&n);
long arr[n+1];
for(i=0;i<n;i++){
scanf("%ld",&arr[i]);
}
long long min=9999999999,dem=0;
mergeSort(arr, 0, n-1);
for(i=0;i<n-1;i++){
if(arr[i+1]-arr[i]<min) min=arr[i+1]-arr[i];
}
for(i=0;i<n-1;i++){
if(arr[i+1]-arr[i]==min) dem++;
}
printf("%lld %lld\n",min,dem);
}
}

CHU VI TAM GIÁC

Bài làm tốt nhất


Cho 3 điểm A, B, C trong không gian 2 chiều Oxy, hãy tính chu vi tam giác được tạo
bởi 3 điểm đó.

Dữ liệu vào

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi bộ test ghi trên 1 dòng 6 số thực có giá trị tuyệt đối không quá 1000 lần
lượt là tọa độ của 3 điểm A, B, C.

Kết quả

 Nếu 3 điểm không thể tạo thành tam giác thì in ra INVALID
 Nếu 3 điểm tạo thành 1 tam giác thì in ra chu vi của tam giác đó, làm tròn đến 3
chữ số phần thập phân.

Ví dụ

Input Output
3 INVALID
0 0 0 5 0 199 INVALID

1 1 1 1 1 1 17.071

0 0 0 5 5 0

#include<stdio.h>
#include<math.h>
float dd(float a, float b,float c, float d){
float x=(float)sqrt((a-b)*(a-b) + (c-d)*(c-d));
return x;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
float xA,yA,xB,yB,xC,yC;
scanf("%f %f %f %f %f %f",&xA,&yA,&xB,&yB,&xC,&yC);
float a=dd(xA,xB,yA,yB);
float b=dd(xB,xC,yB,yC);
float c=dd(xC,xA,yC,yA);
float m=a+b+c;
if((a + b <= c) || (a + c <= b) || (b + c <= a)) printf("INVALID\n");
else printf("%.3f\n",m);

}
}
DIỆN TÍCH TAM GIÁC

Bài làm tốt nhất


Cho 3 điểm A, B, C trong không gian 2 chiều Oxy, hãy tính diện tích tam giác được
tạo bởi 3 điểm đó.

Công thức Heron tính diện tích tam giác khi biết độ dài 3 cạnh là a,b,c:

Dữ liệu vào

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi bộ test ghi trên 1 dòng 6 số thực có giá trị tuyệt đối không quá 1000 lần
lượt là tọa độ của 3 điểm A, B, C.

Kết quả

 Nếu 3 điểm không thể tạo thành tam giác thì in ra INVALID
 Nếu 3 điểm tạo thành 1 tam giác thì in ra diện tích của tam giác đó, làm tròn
đến 2 chữ số phần thập phân.

Ví dụ

Input Output
3 INVALID

0 0 0 5 0 199 INVALID

1 1 1 1 1 1 12.50

0 0 0 5 5 0
#include <stdio.h>
#include <math.h>

double canh(double x1, double y1, double x2, double y2) {


return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

int ktra(double ab, double ac, double bc) {


if(ab>=ac+bc || ac>=ab+bc || bc>=ab+ac) return 0;
return 1;
}

double dientich(double ab, double ac, double bc) {


return (sqrt((ab+ac+bc)*(ab+ac-bc)*(ab-ac+bc)*(bc-ab+ac)))/4;
}

int main () {
int t;
scanf("%d", &t);
while(t--) {
double x1, y1, x2, y2, x3, y3;
scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
double ab=canh(x1, y1, x2, y2);
double ac=canh(x1, y1, x3, y3);
double bc=canh(x2, y2, x3, y3);
if(ktra(ab, ac, bc)) printf("%.2lf\n", dientich(ab, ac, bc));
else printf("INVALID\n");
}
return 0;
}

HÌNH VUÔNG NHỎ NHẤT

Bài làm tốt nhất


Cho 2 hình chữ nhật trên mặt phẳng Oxy. Cần tìm hình vuông có kích thước nhỏ nhất
sao cho phủ kín được 2 hình chữ nhật đã cho.

Dữ liệu vào:

2 dòng, mỗi dòng gồm 4 số nguyên lần lượt mô tả điểm trái dưới và phải trên của hình
chữ nhật. Các tọa độ có giá trị tuyệt đối không vượt quá 100.

Kết quả:

In ra diện tích của hình vuông tìm được.

Ví dụ:

Input Output
6 6 8 8 49

1 8 4 9

#include<stdio.h>
int main(){
int xA,yA,xB,yB,xC,yC,xD,yD;
scanf("%d %d %d %d %d %d %d
%d",&xA,&yA,&xB,&yB,&xC,&yC,&xD,&yD);
int maxd=xA,mind=xA,maxr=yA,minr=yA;
if(xB>maxd) maxd=xB;
if(xC>maxd) maxd=xC;
if(xD>maxd) maxd=xD;
if(xB<mind) mind=xB;
if(xC<mind) mind=xC;
if(xD<mind) mind=xD;
if(yB>maxr) maxr=yB;
if(yC>maxr) maxr=yC;
if(yD>maxr) maxr=yD;
if(yB<minr) minr=yB;
if(yC<minr) minr=yC;
if(yD<minr) minr=yD;
int a=maxd - mind;
int b=maxr - minr;
if(a>b) printf("%ld",a*a);
else printf("%ld",b*b);

}
TAM GIÁC VUÔNG

Bài làm tốt nhất


Theo định lý Pytago, ta đã biết một bộ 3 số (a, b, c) thỏa mãn a2 + b2 = c2 thì đó là ba
cạnh của một tam giác vuông.

Cho dãy số A[] gồm có N phần tử. Nhiệm vụ của bạn là kiểm tra xem có tồn tại bộ ba
số thỏa mãn là ba cạnh của tam giác vuông hay không.

Dữ liệu vào:

 Dòng đầu tiên là số lượng bộ test T (T ≤ 20).


 Mỗi test gồm số nguyên N (1≤ N ≤5000).
 Dòng tiếp theo gồm N số nguyên A[i] (1 ≤ A[i] ≤ 109).

Kết quả:

Với mỗi test, in ra trên một dòng “YES” nếu tìm được, và “NO” trong trường hợp
ngược lại.

Ví dụ:

Input Output
2 YES

5 NO

3 1 4 6 5

1 1 1

#include<stdio.h>
int kt(long a, long b,long c){
if(a*a==b*b+c*c || a*a+b*b==c*c || a*a+c*c==b*b) return 1;
else return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,i,j;
scanf("%d",&n);
long long a[n+1],tg;
for(i=0;i<n;i++){
scanf("%lld",&a[i]);
a[i]*=a[i];

}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
tg=a[j];
a[j]=a[i];
a[i]=tg;
}
}
}
int x=0,y=n-2,z=n-1,kt=1;
while(y>0){
if(a[x]+a[y]<a[z]) x++;
else if(a[x]+a[y]>a[z]) y--;
else {
kt=0;
break;
}
if(x==y){
z--;
y=z-1;
x=0;
}
}
if(kt==1) printf("NO\n");
else printf("YES\n");
}
}

SẮP XẾP MA TRẬN

Bài làm tốt nhất


Cho ma trận A chỉ gồm các số nguyên dương cấp N*M . Hãy viết chương trình sắp xếp ma
trận A theo kiểu đổi chỗ trực tiếp. Một ma trận được coi là sắp xếp nếu góc trên bên trái là
nhỏ nhất, góc dưới bên phải là lớn nhất, theo mỗi hàng hay mỗi cột đều được sắp xếp tăng
dần.

Hãy thực hiện sắp xếp ma trận theo ý tưởng đổi chỗ trực tiếp.

Dữ liệu vào

Dòng đầu tiên ghi số bộ test. Với mỗi bộ test: Dòng đầu tiên ghi hai số n và m là bậc
của ma trân a; n dòng tiếp theo, mỗi dòng ghi m số của một dòng trong ma trận A.

Kết quả

Với mỗi bộ test ghi ra thứ tự bộ test, sau đó là ma trận tích tương ứng.

Ví dụ

Input Output
1 Test 1:
33
426 234
353 356
578 578
#include<stdio.h>
void nhap(int a[20][20],int n,int m){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
void in(int a[20][20],int n,int m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
void sapxep(int a[20][20],int n,int m){
int i1,i2,j1,j2,t;
for(i1=0;i1<n;i1++){
for(j1=0;j1<m;j1++){
for(i2=i1;i2<n;i2++){
for(j2=j1;j2<m;j2++){
if(a[i1][j1]>a[i2][j2]){
t = a[i1][j1];
a[i1][j1] = a[i2][j2];
a[i2][j2] = t;
}
}
}
}
}
}
void xuly(int a[20][20],int n,int m){
sapxep(a,n,m);
in(a,n,m);
printf("\n");
}
main(){
int a[20][20],n,m,t;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d%d",&n,&m);
nhap(a,n,m);
printf("Test %d:\n",i);
xuly(a,n,m);
}
}

MA TRẬN XOẮN ỐC 2

Bài làm tốt nhất


Cho ma trận A[N][M]. Nhiệm vụ của bạn là in các phần tử của ma trận theo hình xoắn ốc. Ví
dụ về in ma trận theo hình xoắn ốc như dưới đây: 1 2 3 4 8 12 16 15 14 13 9 5 6 7
11 10 .

1 2 3 4

5 6 7 8

9 10 11 12
13 14 15 16

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào T bộ test. Mỗi bộ test gồm hai dòng: dòng đầu tiên đưa
vào N, M là cấp của ma trận A[][]; dòng tiếp theo đưa vào N×M số A[i][j].
 T, M, N, A[i][j] thỏa mãn ràng buộc: 1≤ T ≤100; 1≤ M, N ≤100; 1≤ A[i][j] ≤105.

Output: Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input: Output:
2 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
4 4 1 2 3 4 8 12 11 10 9 5 6 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
3 4
1 2 3 4 5 6 7 8 9 10 11 12

#include<stdio.h>
int main(){
int t;
scanf("%d\n",&t);
while(t--){
int m,n;
scanf("%d %d\n",&m,&n);
int a[m][n];
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d ",&a[i][j]);
}
}
int x=0,y=0,z=0;

int p=m*n;

while(-1){
for(j=x;j<n;j++){
y++;
printf("%d ",a[x][j]);
}
if(y==p) break;
for(i=x+1;i<m;i++){
y++;
printf("%d ",a[i][n-1]);
}
if(y==p) break;
for(j=n-2;j>=x;j--){
y++;
printf("%d ",a[m-1][j]);
}
if(y==p) break;

for(i=m-2;i>x;i--){
y++;
printf("%d ",a[i][x]);
}
if(y==p) break;

m--;
n--;
x++;

}
printf("\n");
}
}

HIỆU HAI SỐ NGUYÊN LỚN

Bài làm tốt nhất


Viết chương trình tính hiệu của hai số nguyên lớn. Chú ý: luôn luôn lấy số lớn hơn trừ đi số
nhỏ hơn.

Input:

 Dòng 1 ghi số bộ test


 Mỗi bộ test gồm 2 dòng, mỗi dòng ghi một số không quá 1000 chữ số..

Output:

Với mỗi bộ test ghi ra kết quả tính toán tương ứng

Ví dụ:

Input Output
3 333
456 99999999999999999999999999902
789 123456789012345678900000000000
100000000000000000000000000001
99
123456789012345678901234567890
1234567890
#include<stdio.h>
#include<string.h>
int kt(char a[], char b[]){
int la=strlen(a), lb=strlen(b);
for(int i=0;i<la;i++){
if(a[i]>b[i]) return 1;
else if(a[i]<b[i]) return 2;
}
return 0;
}
void tru(char a[], char b[]){
char c[1000];
int l1=strlen(a),l2=strlen(b);
for(int i=0;i<l1;i++){
a[i]=a[i]-48;
}
for(int i=0;i<l2;i++){
b[i]=b[i]-48;
}
int e=0,k=0;
while(l2>=0){
if(a[l1]>=b[l2]){
c[k]=a[l1]-b[l2]-e;
e=0;
}
else {
c[k]=10+a[l1]-b[l2]-e;
e=1;
}
l1--;
l2--;
k++;
}
while(l1>=0){
if(a[l1]<e){
c[k]=10-e;
e=1;
}
else{
c[k]=a[l1]-e;
e=0;
}
k++;
l1--;
}
while(c[k]<1 || c[k]>10){
k--;
}
for(int i=k;i>0;i--){
c[i]=c[i]+48;
printf("%c",c[i]);
}
}
int main(){
int t;
char a[1000],b[1000];
scanf("%d",&t);
while(t--){
scanf("\n");
gets(a);
scanf("\n");
gets(b);
int n1=strlen(a);
int n2=strlen(b);
if(n1>n2){
tru(a,b);
}
else if(n2>n1){
tru(b,a);
}
else {
if(kt(a,b)==0) printf("0");
else if(kt(a,b)==1) {
tru(a,b);
}
else {
tru(b,a);
}
}
printf("\n");
}
}

ĐỊA CHỈ EMAIL PTIT 2

Bài làm tốt nhất


Địa chỉ email của các cán bộ, giảng viên PTIT được tạo ra bằng cách viết đầy đủ tên và ghép
với các chữ cái đầu của họ và tên đệm. Nếu có nhiều người cùng email thì từ người thứ 2 sẽ
thêm số thứ tự vào email đó.

Cho trước các xâu họ tên (có thể không chuẩn). Hãy tạo ra các địa email tương ứng.

Input:

 Dòng 1 ghi số N là xâu họ tên trong danh sách


 N dòng tiếp theo ghi lần lượt các xâu họ tên (không quá 50 ký tự)

Output: Ghi ra các email được tạo ra.

Ví dụ:

Input Output
4 vinhnq@ptit.edu.vn

nGUYEn quaNG vInH huongttt@ptit.edu.vn

tRan thi THU huOnG vinhnq2@ptit.edu.vn

nGO quoC VINH anhlt@ptit.edu.vn

lE tuAn aNH

#include<stdio.h>
#include<string.h>
int kt(char s[],char a[]){
int l=strlen(s);
int n=strlen(a);
if(l!=n) return 0;
else{
for(int i=0;i<l;i++){
if(s[i]!=a[i]) return 0;
}
return 1;
}
}
int main(){
int t;
char a[101],s[101][101];
scanf("%d",&t);
int j,k,h;
for(k=0;k<t;k++){
j=0;
scanf("\n");
gets(a);
int d=0,i,vt,l=strlen(a);
for(i=0;i<l;i++){
if(a[i]>=65 && a[i]<=90) a[i]=a[i]+32;
}

while(a[d]==' '){
d++;
}
while(a[l-1]==' '){
l--;
}
for(i=l-1;i>=0;i--){
if(a[i]==' '){
break;
}
vt=i;
}
for(i=vt;i<l;i++){
s[k][j++]=a[i];
}
s[k][j++]=a[d];
for(i=d+1;i<vt;i++){
if(a[i]!=' ' && a[i-1]==' ') s[k][j++]=a[i];
}
int dem=1;
for(h=0;h<k;h++){
if(kt(s[h],s[k])==1) dem++;
}
printf("%s",s[k]);
if(dem>1) printf("%d",dem);
printf("@ptit.edu.vn\n");
}
}
TÌM TỪ DÀI NHẤT

Bài làm tốt nhất


Cho một văn bản bất kỳ. Hãy tìm ra từ có độ dài lớn nhất. Nếu có nhiều từ khác nhau có độ
dài bằng nhau và bằng giá trị lớn nhất thì in ra tất cả các từ đó theo thứ tự xuất hiện trong file
dữ liệu vào (nhưng một từ dù xuất hiện nhiều lần cũng chỉ được liệt kê một lần).

Input:Gồm một đoạn văn bản bất kỳ. Không quá 1000 từ.

Output:Ghi ra từ dài nhất, độ dài của nó và số lần xuất hiện trong file, cách nhau một khoảng
trống. Nếu có nhiều từ như vậy thì liệt kê lần lượt các từ theo thứ tự xuất hiện trong file ban
đầu.

Ví dụ:

Input Output
Tiet hoc cuoi cung da ket thuc. Mon hoc thuc. 5 2
Tin hoc co so 2 da ket thuc. Cac ban co
gang on tap tot de thi dat ket qua cao. nhieu 5 1
Chuc cac ban ngay cang gat hai duoc
nhieu thanh cong tren con duong da chon thanh 5 1

duong 5 1

#include<stdio.h>
#include<string.h>
struct chuoi{
char xau[1001];
};
int main(){
struct chuoi s[1001];
int n=0,max=0;
scanf(" ");
while(scanf("%s",s[n].xau)==1){
n++;
}
for(int i=0;i<n;i++){
int l=strlen(s[i].xau);
if(l>max) max=l;
}
for(int i=0;i<n;i++){
int kt=0,dem=1;
int l=strlen(s[i].xau);
if(l==max){
for(int j=0;j<i;j++){
if(strcmp(s[i].xau,s[j].xau)==0){
kt=1;
break;
}
}
if(kt==0){
for(int j=i+1;j<n;j++){
if(strcmp(s[i].xau,s[j].xau)==0) dem++;
}
printf("%s %d %d\n",s[i].xau,max,dem);
}
}
}
}
XÂU KÝ TỰ ĐẦY ĐỦ

Bài làm tốt nhất


Một xâu được gọi là đầy đủ nếu xóa đi 0 hoặc nhiều hơn các ký tự từ xâu đó ta thu được
xâu abcdefghijklmnopqrstuvwxyz

Cho một xâu ký tự chỉ bao gồm các chữ cái viết thường. Hãy tính số ký tự phải chèn thêm ít
nhất (vào bất cứ chỗ nào) để có thể chuyển xâu đó sang dạng đầy đủ.

Input: Chỉ có một dòng ghi ra xâu ký tự đầu vào. Không quá 50 chữ cái.

Output: Ghi ra số kỹ tự ít nhất phải chèn thêm.

Ví dụ:

Test 1 Test 2
Input Input

xyzabcdefghijklmnopqrstuvw aiemckgobjfndlhp

Output Output

3 20

#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int f[100];
gets(s);
int max=1;
for (int i=0; i<strlen(s); i++) {
f[i] = 1;
for (int j=i-1; j>=0; j--) {
if (s[i]>s[j]) {
if(f[i]<f[j]+1) f[i]=f[j]+1;
}
}
}
for (int i=0; i<strlen(s); i++)
if (f[i]>=max)
max = f[i];
printf("%d",26-max);
}

GHÉP XÂU

Bài làm tốt nhất


Cho M xâu kí tự. Nhiệm vụ của bạn là hãy ghép các xâu này thành một từ, sao cho từ thu
được có thứ tự từ điển nhỏ nhất.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 100).

Mỗi test gồm số nguyên M (M ≤ 9) là số lượng các từ, theo sau là M xâu.

Mỗi xâu có độ dài không vượt quá 10.

Output:

Với mỗi test hãy in ra xâu có thứ tự từ điển nhỏ nhất tìm được.
Ví dụ:

Input Output
5 acmforptitstudents

4 acm ptit for students duzklvrawqrc

5 k duz q rc lvraw abbcc

3 a bb cc afsiasfasfiasfiokj

5 asf asfi asfi afsi okj dcyihopjijaalieukuy

5 ukuy hopji lie jaa dcyi

#include<stdio.h>
#include<string.h>
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n;
char ds1[100], ds2[100],tmp[100];
char s[100][100];
scanf("%d",&n);
for (int i = 0; i < n; i++) {
scanf("%s", s[i]);
}
for (int i = 0; i < n-1; i++) {
for (int j = i; j < n; j++) {
strcpy(ds1,s[i]);
strcat(ds1,s[j]);
strcpy(ds2,s[j]);
strcat(ds2,s[i]);
if (strcmp(ds1,ds2)>0) {
strcpy(tmp,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],tmp);
}
}
}
for(int i=0; i<n; i++)printf("%s", s[i]);
printf("\n");
}
}

TRỘN XÂU

Bài làm tốt nhất


Cho hai xâu ký tự S1 và S2 với độ dài N và chỉ chứa các ký tự từ A đến H. Chúng ta thực hiện
thao tác như sau:

 Bước đầu tiên tạo S12 bằng cách lấy các ký tự lần lượt trong S1 và S2 từ trái sang
phải, lấy một ký tự trong S2 trước, sau đó đến 1 ký tự trong S1 và cứ như vậy. Ví dụ
S1 = ABCHAD, S2= DEFDAC thì S12 = DAEBFCDHAACD
 Sau đó ta lại lấy nữa bên trái của S12 thành S1 mới, nửa bên phải thành S2 mới. Trong
ví dụ trên S1 mới là DAEBFC, S2 mới là DHAACD. Rồi lại tiếp tục như vậy trong
các bước tiếp theo.
Cho trước một xâu S có độ dài 2*N. Bài toán đặt ra là liệu có thể tạo ra xâu S sau một số lần
lặp hay không.

Dữ liệu vào

Có nhiều bộ test, mỗi bộ test có bốn dòng. Dòng đầu ghi số N không quá 200. Dòng thứ 2 ghi
S1, dòng thứ 3 ghi S2. Dòng cuối ghi xâu S. Input kết thúc với một dòng ghi số 0.

Kết quả

Ghi ra số bước lặp cần thiết. Nếu không thể tìm được thì ghi ra -1.

Ví dụ

Input Output
4 2

AHAH -1

HAHA

HHAAAAHH

CDE

CDE

EEDDCC

#include<stdio.h>
#include<string.h>
int main(){
while(-1){
int n;
scanf("%d",&n);
if(n==0) break;
char a[101], b[101], c[202];
scanf("\n");
gets(a);
gets(b);
gets(c);
char s1[101], s2[101];
int i,j,kt=0;
strcpy(s1,a);
strcpy(s2,b);
int d=0;
while(-1){
int m=0;
char s12[1000]="";
for(i=0;i<n;i++){
s12[m++]=s2[i];
s12[m++]=s1[i];
}
d++;
if(strcmp(s12,c)==0) break;
m=0;
for(i=0;i<n;i++){
s1[i]=s12[m++];
}
for(i=0;i<n;i++){
s2[i]=s12[m++];
}
if(strcmp(s1,a)==0 && strcmp(s2,b)==0){
kt=1;
break;
}
}
if(kt==1) printf("-1\n");
else printf("%d\n",d);
}
}
SỐ LA MÃ

Bài làm tốt nhất


Bảng chữ số La Mã bao gồm các chữ cái với ý nghĩa I=1; V=5; X=10; L=50;
C=100;D=500; M=1000. Một số quy tắc viết các số La Mã như sau:

 Tính từ trái sang phải giá trị của các chữ số và nhóm chữ số giảm dần.
 I chỉ có thể đứng trước V hoặc X, X chỉ có thể đứng trước L hoặc C, C chỉ có thể đứng
trước D hoặc M.
 Các chữ cái I, X, C, M, không được lặp lại quá ba lần liên tiếp; các chữ cái V, L, D
không được lặp lại quá một lần liên tiếp.

Bài toán đặt ra là cho một xâu ký tự mô tả đúng một số La Mã. Hãy tính giá trị thập phân
của số đó

Input: Dòng đầu ghi số bộ test. Mỗi bộ test ghi trên một dòng dãy ký tự số La Mã.

Output: Với mỗi bộ test ghi ra kết quả tương ứng

Ví dụ:

Input Output
3 19

XIX 600

DC 400

CD

#include<stdio.h>
#include<string.h>
int main(){
int t;
int b[10000];
char a[100];
scanf("%d",&t);
while(t--){
scanf("\n");
gets(a);
int i,l=strlen(a);
for(i=0;i<l;i++){
if(a[i]=='I') b[i]=1;
else if(a[i]=='V') b[i]=5;
else if(a[i]=='X') b[i]=10;
else if(a[i]=='L') b[i]=50;
else if(a[i]=='C') b[i]=100;
else if(a[i]=='D') b[i]=500;
else b[i]=1000;
}
int c=b[l-1];
for(i=0;i<l-1;i++){
if(b[i]>=b[i+1]) c=c+b[i];
else c=c-b[i];

printf("%d\n",c);
}
}
TỔNG HAI SỐ NGUYÊN LỚN

Bài làm tốt nhất


Viết chương trình cộng hai số nguyên dương bất kỳ (không quá 500 chữ số).
Input:
Dòng 1 ghi số bộ test. Mỗi bộ test gồm 2 dòng, mỗi dòng ghi một số nguyên
dương
Output:
Với mỗi bộ test ghi ra một số nguyên dương là tổng hai số đã cho (số này cũng
không quá 500 chữ số).
Ví dụ:

Input Output
3 112
12 10100
100 121212121257800190
1212
8888
121212121212121212
45678978

#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d",&t);
char a[501],b[501],c[501];
while(t--){
scanf("\n");
gets(a);
scanf("\n");
gets(b);
int m=strlen(a),n=strlen(b);
int l1=m,l2=n,i;
for(i=0;i<m;i++){
a[i]-=48;
}
for(i=0;i<n;i++){
b[i]-=48;
}
int j=0,e=0,d;
while(-1){
d=a[m-1]+b[n-1]+e;
c[j]=d%10;
e=d/10;
if(l1>l2 && n-1==0) break;
if(l2>l1 && m-1==0) break;
if(l1==l2 && n-1==0){
if(e>0){
j++;
c[j]=e;
}
break;
}
m--;
n--;
j++;

}
if(l1>l2){

while(m-1>0){
m--;
j++;
d=a[m-1]%10+e;
c[j]=d%10;
e=d/10;
if(m-1==0){
if(e>0){
j++;
c[j]=e;

}
}

}
}
if(l2>l1){

while(n-1>0){
n--;
j++;
d=b[n-1]%10+e;
c[j]=d%10;
e=d/10;
if(n-1==0){
if(e>0){
j++;
c[j]=e;

}
}

}
}

for(int k=0;k<=j;k++){
printf("%c",c[j-k]+48);
}
printf("\n");
}
}
TỔNG ĐA THỨC

Bài làm tốt nhất


Cho hai đa thức có bậc không quá 10000 (chỉ viết ra các phần tử có hệ số khác 0). Hãy tính
tổng hai đa thức đó.

Input: Dòng đầu ghi số bộ test. Mỗi bộ test có hai dòng, mỗi dòng ghi một đa thức theo mẫu
như trong ví dụ. Chú ý: Bậc của các hạng tử luôn theo thứ tự giảm dần, trong đa thức chỉ có
phép cộng và luôn được viết đầy đủ hệ số + số mũ (kể cả mũ 0).

Output: Ghi ra một dòng đa thức tổng tính được (theo mẫu như ví dụ)

Ví dụ:

Input Output
1 3*x^8 + 11*x^6 + 16*x^2 + 2*x^1 + 7*x^0

3*x^8 + 7*x^2 + 4*x^0

11*x^6 + 9*x^2 + 2*x^1 + 3*x^0

#include<stdio.h>
struct pt{
int hs;
int mu;
};
int main(){
int t;
scanf("%d",&t);

while(t--){

struct pt a[10000],d;
int x=0,y=0;
for(int i=0;;i++){
scanf("%d",&a[i].hs);
scanf("*x^");
scanf("%d",&a[i].mu);
x=i+1;
if(a[i].mu==0)break;
scanf(" + ");

}
for(int i=x;;i++){

scanf("%d",&a[i].hs);
scanf("*x^");
scanf("%d",&a[i].mu);
y=i+1;
if(a[i].mu==0)break;

scanf(" + ");

}
for(int i=0;i<y-1;i++){
for(int j=i+1;j<y;j++){
if(a[i].mu<a[j].mu) {
d=a[j];
a[j]=a[i];
a[i]=d;
}
}
}
for(int i=0;i>=0;i++){
if(a[i].mu!=a[i+1].mu){
printf("%d",a[i].hs);
printf("*x^");
printf("%d",a[i].mu);
if(a[i].mu==0)break;
printf(" + ");
}
if(a[i].mu==a[i+1].mu){
a[i].hs=a[i].hs +a[i+1].hs;
printf("%d",a[i].hs);
printf("*x^");
printf("%d",a[i].mu);
i++;
if(a[i+1].mu==0)break;
printf(" + ");

}
printf("\n");
}
}

Ố CHỈ CÓ BA ƯỚC SỐ

Bài làm tốt nhất


Cho hai số L, R. Nhiệm vụ của bạn là hãy đếm tất cả các số có đúng ba ước số trong khoảng
[L, R]. Ví dụ L =1, R =10, ta có kết quả là 2 vì chỉ có số 4 và 9 là có đúng 3 ước số.

Input:
 Dòng đầu tiên đưa vào số lượng test T.
 Những dòng kế tiếp đưa vào các bộ test. Mỗi bộ test là cặp số L, R.
 T, N thỏa mãn rang buộc 1≤T≤100; 1≤L, R ≤1012.

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input Output
2
2
1 10
78498
1 1000000000000

#include<stdio.h>
#include<math.h>
int b[1000000+9]={0};
void sangnt(){
int i,j;
for(i=2;i<=1000000;i++){
if(b[i]==0){
for(j=i*2;j<=1000000;j=j+i){
b[j]=1;
}
}
}
}
int main(){
int t;
scanf("%d",&t);
sangnt();
long s=0;
while(t--){
long long m,n;
scanf("%lld %lld",&m,&n);
long m1=sqrt(m),n1=sqrt(n),i,dem=0;
for(i=m1;i<=n1;i++){
if(b[i]==0 && i>1) dem++;
}
printf("%ld\n",dem);

}
}

ƯỚC SỐ CỦA GIAI THỪA

Bài làm tốt nhất


Cho số tự nhiên N và số nguyên tố P. Nhiệm vụ của bạn là tìm số x lớn nhất để N! chia hết
cho px. Ví dụ với N=7, p=3 thì x=2 là số lớn nhất để 7! Chia hết cho 32.

Input:

 Dòng đầu tiên đưa vào số lượng bộ test T.


 Những dòng kế tiếp đưa vào các bộ test. Mỗi bộ test là cặp số N, p được viết cách
nhau một vài khoảng trống.
 T, N, p thỏa mãn ràng buộc : 1≤T≤100; 1≤N≤105; 2≤p≤5000;

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input: Output:
3
9
62 7
73
76 2
0
3 5

#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b,i,d=0,k;
scanf("%d %d",&a,&b);
for(i=1;i<=a;i++){
k=i;
while(k>=b && k%b==0){
d++;
k=k/b;
}
}
printf("%d\n",d);

}
}

BỘI SỐ NHỎ NHẤT CỦA N SỐ NGUYÊN DƯƠNG ĐẦU TIÊN

Bài làm tốt nhất


Cho số tự nhiên n. Nhiệm vụ của bạn là tìm số nguyên nhỏ nhất chia hết cho 1, 2, .., n.

Input:
 Dòng đầu tiên đưa vào T là số lượng bộ test.
 T dòng tiếp theo mỗi dòng đưa vào một bộ test. Mỗi bộ test là một số tự nhiên n.
 T thỏa mãn ràng buộc: 1≤T≤104; n không quá 100.

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input Output
2
6
3
60
5

#include<stdio.h>
#include<math.h>
int b[1000+9]={0};
int c[1009];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,i,j,k;
scanf("%d",&n);
long long s=1,x;
for(i=2;i<=n;i++){
k=i;
for(j=2;j<=sqrt(k);j++){
int dem=0;
x=1;
if(k%j==0){
while(k%j==0){
x=x*j;
dem++;
k=k/j;
}
if(dem>b[j]){
b[j]=dem;
c[j]=x;
}
}
}
if(k>1 && b[k]==0){
b[k]++;
c[k]=k;
}
}
for(int i=2;i<=n;i++){
if(b[i]>0) s=s*c[i];
}
for(int i=2;i<=n;i++){
b[i]=0;
c[i]=0;
}
printf("%lld",s);
printf("\n");
}
}
BỘI SỐ NHỎ NHẤT

Bài làm tốt nhất


Cho hai số tự nhiên n, m . Nhiệm vụ của bạn là tìm số nguyên nhỏ nhất chia hết cho n ,
n+1, .., m.

Input:

 Dòng đầu tiên đưa vào T là số lượng bộ test.


 T dòng tiếp theo mỗi dòng đưa vào một bộ test. Mỗi bộ test là 2 số tự nhiên n, m.
 T thỏa mãn ràng buộc: 1≤T≤104; 1≤n, m ≤40

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Input Output
2
6
13
60
35

#include<stdio.h>
#include<math.h>
int b[1000+9]={0};
int c[1009];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m,i,j,k;
scanf("%d %d",&n,&m);
long long s=1,x;
for(i=n;i<=m;i++){
k=i;
for(j=2;j<=sqrt(k);j++){
int dem=0;
x=1;
if(k%j==0){
while(k%j==0){
x=x*j;
dem++;
k=k/j;
}
if(dem>b[j]){
b[j]=dem;
c[j]=x;
}
}
}
if(k>1 && b[k]==0){
b[k]++;
c[k]=k;
}
}
for(int i=2;i<=m;i++){
if(b[i]>0) s=s*c[i];
}
for(int i=2;i<=m;i++){
b[i]=0;
c[i]=0;
}
printf("%lld",s);
printf("\n");
}
}
SỐ ĐẦU TIÊN BỊ LẶP

Bài làm tốt nhất


Cho dãy số A[] gồm có N phần tử. Nhiệm vụ của bạn là hãy tìm số xuất hiện nhiều hơn 1 lần
trong dãy số và số thứ tự là nhỏ nhất.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 10).

Mỗi test gồm số nguyên N (1≤ N ≤ 100 000), số lượng phần tử trong dãy số ban đầu.

Dòng tiếp theo gồm N số nguyên A[i] (0 ≤ A[i] ≤ 10^9).

Output:

Với mỗi test in ra đáp án của bài toán trên một dòng. Nếu không tìm được đáp án, in ra “NO”.

Ví dụ:

Input: Output
2 5

7 NO

10 5 3 4 3 5 6

1 2 3 4

#include<iostream>
using namespace std;
int main(){
int t,k;
cin>>t;
for(k=0;k<t;k++){
long n,j,i,kt=0,x;
cin>>n;
long a[n];
for(i=0;i<n;i++){
cin>>a[i];
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[i]==a[j]){
kt++;

}
}

if(kt!=0) {
cout<<a[i];
break;
}
}
if(kt==0) {
cout<<"NO";
}
cout<<endl;
}
}

TÌM SỐ DƯ

Bài làm tốt nhất

Hãy tính giá trị biểu thức .

Input:

Dòng đầu là số lượng bộ test T (T ≤ 100).

Mỗi test gồm một xâu biểu diễn số nguyên n, n có không quá 100 000 kí tự.

Output:
Với mỗi test in ra đáp án tìm được trên một dòng.

Test ví dụ:

Input: Output
2 4

4 0

123456789

#include<stdio.h>
#include<math.h>
#include<string.h>

int main(){
int t,k;
scanf("%d",&t);
char a[100000];
for(k=0;k<t;k++){
scanf("\n");
gets(a);
long l=strlen(a),i,d=0;
for(i=0;i<l;i++){
d=10*d+a[i];
}
if(d%4==0) printf("4\n");
else printf("0\n");
}
}
ƯỚC SỐ CHUNG LỚN NHẤT (GCD)

Bài làm tốt nhất


Cho dãy số A[] nguyên dương có N phần tử. Bạn cần xây dựng dãy số B có N+1 phần tử sao
cho gcd(B[i], B[i+1]) = A[i] với mọi i thỏa mãn 1 <= i <= n. Vì có rất nhiều dãy số B[] thỏa
mãn, nên bạn cần tìm được dãy số có tổng các phần tử là nhỏ nhất.

Input

 Dòng đầu tiên là số lượng bộ test T (1 <= T <= 10).


 Mỗi test bắt đầu bằng số nguyên N (2 <= N <= 1000).
 Dòng tiếp theo gồm N số nguyên A[i] (1 <= A[i] <= 10 000).

Output

 Với mỗi test in ra dãy số B[] trên một dòng.

Test ví dụ:

Input Output
2 1 2 3 6

3 5 10 10 5

1 2 3

5 10 5

#include<iostream>
#include<math.h>
using namespace std;
int ucll(long x, long y){
long d;
while(x%y!=0){
d=x%y;
x=y;
y=d;
}

return y;
}
int bcnn(long x, long y){
long z=x*y/ucll(x,y);
return z;

}
int main(){
int t,k;
cin>>t;
for(k=0;k<t;k++){
int n,i
;
cin>>n;
long a[n],b[n+1];
for(i=1;i<=n;i++){
cin>>a[i];
}
cout<<a[1]<<" ";
for(i=1;i<n;i++){
b[i]=bcnn(a[i],a[i+1]);
cout<<b[i]<<" ";
}
cout<<a[n];
cout<<endl;
}
}
CHIA TAM GIÁC

Bài làm tốt nhất


Cho một tam giác cân có độ dài đáy bằng 1 và chiều cao bằng H. Bạn cần chia tam giác này
thành N phần có diện tích bằng nhau và song song với đáy.

Hãy in ra N-1 số là khoảng cách từ lát cắt thứ i tới đỉnh của tam giác.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 100).

Mỗi test gồm 2 số nguyên N và H (2 ≤ ≤ N ≤ 1000, 1 ≤ H ≤ 100 000).

Output:

Với mỗi test, in ra đáp án tìm được trên một dòng với 6 chữ số sau dấu phảy.

Input: Output
2 1.154701 1.632993

3 2 70710.678119

2 100000

#include<stdio.h>
#include<math.h>
int main(){
int t,o;
scanf("%d",&t);
for(o=0;o<t;o++){
int n,h,i;
scanf("%d %d",&n,&h);
double s,s1=0,h1,k,m;
s=(double)h/2;
m=s/n;

for(i=0;i<n-1;i++){
s1=s1+m;
k=s1/s;
h1=h*sqrt(k);
printf("%lf ",h1);
}

printf("\n");

}
}

DI CHUYỂN ROBOT

Bài làm tốt nhất


Một robot xuất phát từ vị trí (0,0) mặt quay về hướng Bắc. Mỗi lần chỉ có một trong 4
lệnh chuyển động là G, L, R, B tương ứng là tiến về phía trước, tiến sang trái, tiến
sang phải, lùi lại phía sau một đơn vị.

Cho dãy lệnh chuyển động. Hãy tính xem vị trí cuối cùng của robot là vị trí nào?

Input

 Dòng đầu tiên ghi n (n≤100) là số lệnh robot cần thực hiện.
 Dòng thứ hai là dãy n ký tự mô tả dãy lệnh robot thực hiện

Output
Ghi ra hai số nguyên là tọa độ (x,y) của vị trí cuối cùng robot

Ví dụ

Input Output
5 -1 0

GLLRB
Input Output
2 -2 0

RG

#include<stdio.h>
#include<string.h>
int main(){
int n;
scanf("%d",&n);
char a[n];

scanf("\n");
gets(a);
int x=0,y=0;
int k=2;

for(int i=0;i<n;i++){
if(a[i]==71){

if(k==1){
x=x+1; k=1; }
else if(k==2){

y=y+1; k=2; }
else if(k==3){
x=x-1; k=3;}
else {
y=y-1; k=4;}

}
else if(a[i]==76){

if(k==1) {
y=y+1; k=2; }
else if(k==2) {
x=x-1; k=3; }
else if(k==3) {
y=y-1; k=4; }
else {
x=x+1; k=1;}

}
else if(a[i]==82){

if(k==1){
y=y-1; k=4; }
else if(k==2){
x=x+1; k=1;}
else if(k==3){
y=y+1; k=2;}
else {
x=x-1; k=3; }

}
else {

if(k==1){
x=x-1; k=3; }
else if(k==2){
y=y-1; k=4; }
else if(k==3) {
x=x+1; k=1; }
else {y+=1; k=2; }

}
}
printf("%d %d",x,y);
return 0;
}

BỐC BI

Bài làm tốt nhất


Unnie có một hộp bi trong đó có a viên bi màu đỏ, b viên bi màu xanh và c viên bi
màu vàng. Unnie đố Oppa có thể nhắm mắt mà lấy ra được k viên bi có cùng màu.

Oppa vừa đi dép lê vừa suy nghĩ nhưng mà không biết phải làm như thế nào. Nhờ các
bạn tính giúp xem Oppa cần lấy ít nhất bao nhiêu viên để đảm bảo yêu cầu của Unnie
nha.

Input

Chứa 4 số nguyên a, b, c, k. (1 ≤ a, b, c ≤ 1000, 1 ≤ k ≤ max(a, b, c))

Output

In ra 1 số nguyên là đáp án của bài toán.

Ví dụ:

Input Output
2 4 6 3 7
#include<stdio.h>
int main(){
int a,b,c,k;
scanf("%d %d %d %d",&a,&b,&c,&k);
if(a>=k && b>=k && c>=k) printf("%d",3*k-2);

else if(a<k && b<k && c>=k ) printf("%d",a+b+k);


else if( a<k && b>=k && c<k ) printf("%d",a+c+k);
else if (a>=k && b<k && c<k) printf("%d",b+c+k);
else if(a<k && b>=k && c>=k )printf("%d",a+k+k-1);
else if(a>=k && b<k && c>=k) printf("%d",b+k+k-1);
else printf("%d",c+k+k-1);

PHẦN TỬ LỚN NHẤT TRONG DÃY CON

Bài làm tốt nhất


Cho dãy số A[] gồm có N phần tử và số nguyên K.

Với mỗi dãy con liên tiếp có độ dài bằng K (từ trái sang phải), bạn hãy in ra phần tử
lớn nhất trong dãy con này.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 10).

Mỗi test gồm số nguyên N và K (1≤ N ≤ 100 000, 1 ≤ K ≤ N).

Dòng tiếp theo gồm N số nguyên A[i] (0 ≤ A[i] ≤ 109).

Output:

Với mỗi test, in ra trên một dòng N-K+1 số nguyên là đáp án tìm được.
Ví dụ:

Input Output
2 3 3 4 5 5 5 6

9 3 10 10 10 15 15 90 90

1 2 3 1 4 5 2 3 6

10 4

8 5 10 7 9 4 15 12 90 13

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int main(){
int t,o;
cin>>t;
for(o=0;o<t;o++){
int n,k,i,j;
cin>>n>>k;
long a[n],max;
for(i=0;i<n;i++){
cin>>a[i];
}
for(i=0;i<n-k+1;i++){
max=0;
for(j=i;j<i+k;j++){
if(a[j]>max){
max=a[j];
}
}
cout<<max<<" ";
}
cout<<endl;

SỐ XUẤT HIỆN NHIỀU NHẤT

Bài làm tốt nhất


Cho dãy số A[] gồm có N phần tử. Nhiệm vụ của bạn là hãy tìm một số có tần số xuất hiện
nhiều nhất, yêu cầu lớn hơn N/2 lần xuất hiện trong dãy số.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 10).

Mỗi test gồm số nguyên N (1≤ N ≤ 100 000), số lượng phần tử trong dãy số ban đầu.

Dòng tiếp theo gồm N số nguyên A[i] (1 ≤ A[i] ≤ 1 000 000).

Output:

Với mỗi test in ra đáp án của bài toán trên một dòng. Nếu không tìm được đáp án, in ra “NO”.

Ví dụ:

Input: Output
2 4

9 NO

3 3 4 2 4 4 2 4 4

3 3 4 2 4 4 2 4
#include<stdio.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
while(n--){
long m;
scanf("%ld",&m);
long a[m];
for(long i=0;i<m;i++){
scanf("%ld",&a[i]);
}

long x;
long y=m/2;
long kt=0;
for(long i=0;i<=y;i++){
long dem=1;

for(long j=i+1;j<m;j++){
if(a[j]==a[i]){
dem++;

}
}
if(dem>y) {
x=a[i];
kt=1;

break;
}
}
if(kt==1)printf("%ld",x);
if(kt==0)printf("NO");
printf("\n");
}
}

TẦN SUẤT LẺ

Bài làm tốt nhất


Cho dãy số A[] gồm có N phần tử. Các phần tử trong dãy số đều xuất hiện với tần suất chẵn,
chỉ có duy nhất 1 số có số lần xuất hiện là số lẻ. Nhiệm vụ của bạn là hãy tìm số này.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 10).

Mỗi test gồm số nguyên N (1≤ N ≤ 100 000), số lượng phần tử trong dãy số ban đầu. N là một
số lẻ.

Dòng tiếp theo gồm N số nguyên A[i] (1 ≤ A[i] ≤ 1 000 000).

Output:

Với mỗi test in ra trên mỗi dòng một số nguyên là đáp án của bài toán.

Ví dụ:

Input: Output
2 3

7 2

1 2 3 2 3 1 3
5

1 1 3 3 2

#include<iostream>
int b[1000001];
using namespace std;
int main(){
int t,k;
cin>>t;
for(k=0;k<t;k++){
long n,i,x;
cin>>n;
long a[n];
for(i=0;i<n;i++){
cin>>a[i];
b[a[i]]++;
}
for(i=0;i<n;i++){
if(b[a[i]]%2==1) x=a[i];
}
cout<<x<<endl;
}
}

QUAY VÒNG DÃY SỐ


Bài làm tốt nhất
Cho dãy số A[] gồm có N phần tử. Nhiệm vụ của bạn là hãy chuyển D phần tử đầu tiên của
dãy A[] xuống cuối dãy.

Input:

Dòng đầu tiên là số lượng bộ test T (T ≤ 10).

Mỗi test gồm số nguyên N và D (1≤ N ≤ 1000, 0 ≤ D ≤ N).

Dòng tiếp theo gồm N số nguyên A[i] (0 ≤ A[i] ≤ 10^6).

Output:

Với mỗi test, in ra trên một dòng là dãy số thu được sau khi thực hiện phép quay vòng.

Ví dụ:

Input: Output
1 3 4 5 6 7 1 2

7 2

1 2 3 4 5 6 7

#include<iostream>
using namespace std;
int main(){
int t,k;
cin>>t;
for(k=0;k<t;k++){
int n,d,j,i;
cin>>n>>d;
long a[n];
for(i=0;i<n;i++){
cin>>a[i];
}
for(i=d;i<n;i++){
cout<<a[i]<<" ";
}
for(i=0;i<d;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}

CHỮ SỐ CHẴN LẺ 1
Bài làm tốt nhất
Cho số nguyên dương N không quá 9 chữ số.
Hãy đếm xem N có bao nhiêu chữ số lẻ và bao nhiêu chữ số chẵn. Nếu không tồn tại
số lẻ hoặc số chẵn thì in ra kết quả là 0 cho loại số tương ứng
Input
Chỉ có một dòng ghi số N
Output
Ghi số chữ số lẻ rồi đến số chữ số chẵn
Ví dụ

Input Output
12345678 44
#include<stdio.h>
int main(){
int n,d=0,e=0,k;
scanf("%d",&n);
while(n>0){
k=n%10;
if(k%2==0){
d++;
}
else e++;
n=n/10;
}
printf("%d %d",e,d);
}
LIỆT KÊ SỐ NGUYÊN TỐ TRONG DÃY

Bài làm tốt nhất


Viết chương trình nhập mảng n (1<n<100) phần tử số nguyên dương. Các giá trị trong
mảng không quá 1000.
Đếm các phần tử là số nguyên tố trong mảng và in ra lần lượt theo thứ tự xuất hiện.
Input
Dòng 1 ghi số n. Dòng 2 ghi n số của mảng.
Output
Ghi số lượng các số nguyên tố, sau đó lần lượt là các số nguyên tố theo thứ tự xuất
hiện.
Ví dụ:

Input Output
6 3 5 3 19
1 5 3 19 18 25
#include<stdio.h>
#include<math.h>
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int main(){
int n,j,d=0;
scanf("%d",&n);
int a[n];
for(j=0;j<n;j++){
scanf("%d",&a[j]);
}
for(j=0;j<n;j++){
if(nt(a[j])==1){
d++;
}
}
printf("%d ",d);
for(j=0;j<n;j++){
if(nt(a[j])==1){
printf("%d ",a[j]);
}
}
}

SỐ ĐẸP 1

Bài làm tốt nhất


Một số được coi là đẹp nếu nó là số nguyên tố và tổng chữ số là một số trong dãy Fibonaci.
Viết chương trình liệt kê trong một đoạn giữa hai số nguyên cho trước có bao nhiêu số đẹp
như vậy
Input
Chỉ có một dòng ghi hai số nguyên dương a,b (a có thể lớn hơn b) không quá 1000.
Output
Ghi ra các số thỏa mãn trên một dòng, cách nhau một khoảng trống.
Ví dụ

Input Output
2 50 2 3 5 11 17 23 41
#include<stdio.h>
#include<math.h>
int nt(int a){
int i,kt=0;
if(a<=1) return 0;
for(i=2;i<=sqrt(a);i++){
if(a%i==0){
kt=1;
break;
}
}
if(kt==1) return 0;
else return 1;
}
int fb(int n)
{
int s=0;
while(n>0){
s=s+n%10;
n/=10;
}
if(s==1||s==0||s==2||s==3 || s==5 || s==8 || s==13 || s==21|| s==34) return 1;
else return 0;
}
int main(){
int a,b,i;
scanf("%d %d",&a,&b);
if(a>b){
int d=a;
a=b;
b=d;
}
for(i=a;i<=b;i++){

if(nt(i)==1 && fb(i)==1) printf("%d ",i);


}

TÍNH TỔNG

Bài làm tốt nhất


Cho hai số nguyên (có thể âm) có giá trị tuyệt đối không quá 106.
Viết chương trình tính tổng hai số
Input
Có duy nhất một dòng ghi hai số nguyên, cách nhau một khoảng trống.
Output
In kết quả trên một dòng
Ví dụ

Input Output
10 2 12
#include<stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d",a+b);
}

PHÉP TOÁN CƠ BẢN 1

Bài làm tốt nhất


Nhập 2 số nguyên dương a,b không quá 1000.
Hãy in ra lần lượt các giá trị: tổng, hiệu, tích, chia kết quả thực (với đúng 2 chữ số sau
dấu phẩy) và chia phần dư của 2 số a,b đã cho.
Kết quả tính toán ghi trên một dòng. Nếu b = 0 thì không thực hiện phép toán nào mà
chỉ in ra số 0.
Input
Chỉ có 2 số a,b trên một dòng.
Output
Ghi ra lần lượt kết quả các phép toán trên một dòng.
Ví dụ

Input Output
10 5 15 5 50 2.00 0
#include<stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
if(b==0) printf("0");
else{

int tong,hieu,tich,cd;
float chia;
tong=a+b;
hieu=a-b;
tich=a*b;
cd=a%b;
chia=(float)a/b;
printf("%d %d %d %.2f %d",tong,hieu,tich,chia,cd);
}

HÌNH CHỮ NHẬT

Bài làm tốt nhất


Cho độ dài hai cạnh của hình chữ nhật. Giá trị không quá 104.
Viết chương trình tính chu vi và diện tích của hình chữ nhật đó. Nếu dữ liệu không
hợp lệ (chiều dài hoặc chiều rộng ≤ 0 thì in ra số 0)
Input
Có duy nhất một dòng ghi hai số nguyên, cách nhau một khoảng trống.
Output
In kết quả trên một dòng, chu vi rồi đến diện tích, cách nhau một khoảng trống.
Ví dụ

Input Output
10 2 24 20
#include<stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
if(a<=0 || b<=0) printf("0");
else{
long c,s;
c=(a+b)*2;
s=a*b;
printf("%ld %ld",c,s);
}

CHUYỂN ĐỔI THANG ĐO NHIỆT ĐỘ

Bài làm tốt nhất


Công thức chuyển đơn vị đo nhiệt độ từ C sang F như sau:
F = (C * 9 / 5) + 32
Viết chương trình nhập vào nhiệt độ đo theo độ C, thực hiện chuyển sang đơn vị đo độ
F và in ra màn hình. (Lưu ý luôn lấy 2 chữ số thập phân).
Input
Có duy nhất một dòng ghi nhiệt độ đo theo độ C (không quá 100).
Output
In kết quả trên một dòng.
Ví dụ

Input Output
24 75.20
#include<stdio.h>
int main(){
float k,c;
scanf("%f",&c);
k=(c * 9 / 5) + 32;
printf("%.2f",k);

CHUYỂN ĐỔI NGÀY THÁNG

Bài làm tốt nhất


Viết chương trình nhập vào số ngày, thực hiện chuyển số ngày sang năm, tuần, ngày
(bỏ qua trường hợp năm nhuận).
Input
Có duy nhất một dòng ghi số ngảy, không quá 1000.
Output
In kết quả trên một dòng theo thứ tự: năm – tuần – ngày, mỗi số cách nhau một khoảng
trống.
Ví dụ

Input Output
350 0 50 0
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int nam,t,ngay;
nam=n/365;
t=(n-365*nam)/7;
ngay=n-365*nam-t*7;
printf("%d %d %d",nam,t,ngay);

PHƯƠNG TRÌNH BẬC HAI

Bài làm tốt nhất


Viết chương trình nhập 3 số thực a,b,c và in ra nghiệm của phương trình bậc hai a*x 2 +
b*x + c = 0.
Input
Chỉ có một dòng ghi ba số a,b,c, giá trị tuyệt đối không quá 1000. Không có trường
hợp a = b = c = 0.
Output
Kết quả ghi ra trên một dòng, nếu không có nghiệm in ra NO.
Ví dụ

Input Output
1 2 1 -1.00
#include<stdio.h>
#include<math.h>
int main(){
float a,b,c;
scanf("%f %f %f",&a,&b,&c);
float d,m,n,e;
d=(b*b)-(4*a*c);
if(d<0) printf("NO");
else if(d==0) {
e=(-b/(2*a));
printf("%.2f",e);
}
else {
m=(-b+sqrt(d))/(2*a);
n=(-b-sqrt(d))/(2*a);
printf("%.2f %.2f",m,n);
}

TÍNH TỔNG TRONG ĐOẠN

Bài làm tốt nhất


Cho hai số nguyên dương a,b không quá 106.
Thực hiện tính tổng các số tự nhiên nằm trong đoạn [a, b] và in ra màn hình.
(Lưu ý có thể nhập a lớn hơn b)
Input
Chỉ có một dòng ghi hai số nguyên dương a,b (không quá 6 chữ số)
Output
Ghi ra kết quả trên một dòng
Ví dụ

Input Output
1 10 55
#include<stdio.h>
int main(){
int a,b;
long s=0;
scanf("%d %d",&a,&b);
if(a>b){
int d=a;
a=b;
b=d;
}
for(int i=a;i<=b;i++){
s+=i;
}
printf("%ld",s);

}
BẢNG CỬU CHƯƠNG

Bài làm tốt nhất


Cho số nguyên dương N (không quá 9). In ra lần lượt kết quả phép nhân của N với các
số từ 1 đến 10, mỗi giá trị cách nhau một khoảng trống
Input
Có duy nhất một dòng ghi số nguyên dương N (1 ≤ N ≤ 9).
Output
In kết quả trên một dòng.
Ví dụ

Input Output
5 5 10 15 20 25 30 35 40 45 50
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[100];
for(int i=1;i<11;i++){
a[i]=n*i;
printf("%d ",a[i]);
}

ĐẾM SỐ CHỮ SỐ

Bài làm tốt nhất


Cho số nguyên dương N không quá 9 chữ số.
Hãy đếm xem N có bao nhiêu chữ số.
Input
Chỉ có một số nguyên dương N không quá 9 chữ số.
Output
Ghi ra kết quả trên một dòng
Ví dụ

Input Output
1234 4
#include<stdio.h>
int main(){
long n;
scanf("%ld",&n);
int d=0;
while(n>0){
d++;
n=n/10;
}
printf("%d",d);

CHỮ SỐ ĐẦU CUỐI

Bài làm tốt nhất


Viết chương trình nhập vào một số nguyên dương N không quá 9 chữ số.
In ra chữ số đầu tiên và cuối cùng của N.
Input
Chỉ có một số nguyên dương N không quá 9 chữ số.
Output
Ghi ra kết quả trên một dòng
Ví dụ

Input Output
1234 14
#include<stdio.h>
int main(){
long n;
scanf("%ld",&n);
int d=n%10;
int e;
while(n>0){
e=n%10;
n=n/10;
}
printf("%d %d",e,d);

THAY ĐỔI ĐẦU CUỐI


Bài làm tốt nhất
Cho một số nguyên dương n không quá 9 chữ số.
Hãy thực hiện đổi vị trí của chữ số đầu tiên và chữ số cuối cùng.
Lưu ý trong trường hợp chữ số cuối cùng là 0 thì khi đổi chỗ sẽ được loại bỏ (ví dụ
9800 -> 809)
Input
Chỉ có một số nguyên dương N không quá 9 chữ số.
Output
Ghi ra kết quả trên một dòng
Ví dụ

Input Output
1234 4231
#include<stdio.h>
int main(){
long n;
scanf("%ld",&n);
long a=n,m=1,i;
int d=n%10;
int e,dem=0;
while(n>0){
dem++;
e=n%10;
n=n/10;
}
for(i=1;i<dem;i++){
m=m*10;
}
long k=(a-e*m)/10;
if(d==0) printf("%d%d",k,e);
else printf("%d%d%d",d,k,e);

TỔNG CHỮ SỐ 1

Bài làm tốt nhất


Viết chương trình nhập vào một số n không quá 10 9, thực hiện tìm tổng các chữ số của
n và in ra màn hình.
Input:
Chỉ có một dòng ghi số n.
Output:
Ghi ra kết quả tính toán
Ví dụ:

Input Output
1234 10
#include<stdio.h>
int main(){
long n,s=0;
scanf("%ld",&n);
while(n>0){
s=s+n%10;
n=n/10;
}
printf("%ld",s);

TÍCH CHỮ SỐ

Bài làm tốt nhất


Cho một số nguyên dương N.
Thực hiện tìm tích của các chữ số và in ra màn hình.
Input
Chỉ có một dòng ghi số nguyên dương N (không quá 9 chữ số)

Output
Ghi ra kết quả trên một dòng
Ví dụ

Input Output
1234 24
#include<stdio.h>
int main(){
long n,s=1;
scanf("%ld",&n);
while(n>0){
s=s*(n%10);
n=n/10;
}
printf("%ld",s);

}
SỐ HOÀN HẢO

Bài làm tốt nhất


Số hoàn hảo là số có tổng các ước số (nhỏ hơn chính nó) bằng nó. Ví dụ: 6 = 1 + 2 + 3.
Nhập vào số N và kiểm tra xem n có phải là số hoàn hảo hay không. Nếu đúng in ra 1,
sai in ra 0.
Input
Chỉ có một dòng ghi số N (không quá 6 chữ số)
Output
Ghi ra 1 hoặc 0
Ví dụ

Input Output
6 1
#include<stdio.h>
int main(){
int n,s=0;
scanf("%d",&n);
int a=n;
for(int i=1;i<n;i++){
if(n%i==0){
s=s+i;
}
}
if(a==s) printf("1");
else printf("0");

SỐ HOÀN HẢO NHỎ HƠN N

Bài làm tốt nhất


Số hoàn hảo là số có tổng các ước số (nhỏ hơn chính nó) bằng nó. Ví dụ: 6 = 1 + 2 + 3.
Viết chương trình cho phép nhập vào số n (không quá 6 chữ số) và liệt kê các số hoàn
hảo nhỏ hơn n.
Input:
Chỉ có một dòng ghi số n.
Output:
Ghi ra kết quả tính toán trên một dòng
Ví dụ:
Input Output
1000 6 28 496
#include<stdio.h>
#include<math.h>
int shh(int n){
int s=0,a=n;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){

if(i==1 || i*i==n){
s=s+i;
}
else s=s+i+(n/i);
}
}
if(a==s) return 1;
else return 0;
}
int main(){
int n;
scanf("%d",&n);
int a=n;
for(int i=2;i<n;i++){
if(shh(i)==1) printf("%d ",i);
}

SỐ HOÀN HẢO TRONG ĐOẠN

Bài làm tốt nhất


Viết chương trình C cho phép nhập vào hai số a và b (không quá 6 chữ số, a có thể lớn
hơn b). Thực hiện liệt kê các số hoàn hảo nằm trong đoạn từ [a,b].
Input:
Chỉ có một dòng ghi hai số a,b.
Output:
Ghi ra kết quả tính toán trên một dòng
Ví dụ:

Input Output
1 1000 6 28 496
#include<stdio.h>
#include<math.h>
int shh(int n){
int s=0,a=n;
if(n==1) return 0;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){

if(i==1 || i*i==n){
s=s+i;
}
else s=s+i+(n/i);
}
}
if(a==s) return 1;
else return 0;
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
if(a>b){
int d=a;
a=b;
b=d;
}
for(int i=a;i<=b;i++){
if(shh(i)==1) printf("%d ",i);
}

SỐ STRONG
Bài làm tốt nhất
Số Strong là số thỏa mãn có tổng giai thừa các chữ số của nó bằng chính nó. Ví dụ:
145 = 1! + 4! + 5!

Viết chương trình nhập vào số n không quá 6 chữ số và kiểm tra xem n có phải số
Strong hay không. Nếu đúng in ra 1 sai in ra 0.
Input
Chỉ có một dòng ghi số N (không quá 6 chữ số)
Output
Ghi ra 1 hoặc 0
Ví dụ

Input Output
145 1
#include<stdio.h>
int gt(int a){
long s=1;
for(int i=1;i<=a;i++){
s=s*i;
}
return s;
}
int sst(int n){
int d,s=0;
while(n>0){
d=n%10;
n/=10;
s=s+gt(d);
}
return s;
}
int main(){
int n;
scanf("%d",&n);
if(n==sst(n)) printf("1");
else printf("0");

SỐ STRONG NHỎ HƠN N

Bài làm tốt nhất


Số Strong là số thỏa mãn có tổng giai thừa các chữ số của nó bằng chính nó. Ví dụ:
145 = 1! + 4! + 5!
Viết chương trình nhập vào số n không quá 9 chữ số và liệt kê các số Strong nhỏ hơn n
(Các kết quả thỏa mãn được liệt kê trên một dòng cách nhau một khoảng trống)
Input:
Chỉ có một dòng ghi số n.
Output:
Ghi ra kết quả tính toán trên một dòng
Ví dụ:

Input Output
1000 1 2 145
#include<stdio.h>
int gt(int a){
long s=1;
for(int i=1;i<=a;i++){
s=s*i;
}
return s;
}
int sst(int n){
int d,s=0;
int a=n;
while(n>0){
d=n%10;
n/=10;
s=s+gt(d);
}
if(a==s) return 1;
else return 0;
}
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<n;i++){
if(sst(i)==1) printf("%d ",i);

SỐ STRONG TRONG ĐOẠN

Bài làm tốt nhất


Viết chương trình C cho phép nhập vào hai số a và b (a có thể lớn hơn b). Liệt kê các
sô Strong nằm trong đoạn a,b.
Các kết quả thỏa mãn liệt kê cách nhau một khoảng trống.
Input:
Chỉ có một dòng ghi hai số a,b.
Output:
Ghi ra kết quả tính toán trên một dòng
Ví dụ:

Input Output
1 1000 1 2 145
#include<stdio.h>
int gt(int a){
long s=1;
for(int i=1;i<=a;i++){
s=s*i;
}
return s;
}
int sst(int n){
int d,s=0;
int a=n;
while(n>0){
d=n%10;
n/=10;
s=s+gt(d);
}
if(a==s) return 1;
else return 0;
}
int main(){
int a,b,i;
scanf("%d %d",&a,&b);
if(a>b){
int d=a;
a=b;
b=d;
}
for(i=a;i<=b;i++){
if(sst(i)==1) printf("%d ",i);

KIỂM TRA SỐ FIBONACCI 1


Bài làm tốt nhất
Nhập vào một số n không quá 8 chữ số và kiểm tra số đó có thuộc dãy Fibonacci hay
không. Nếu thỏa mãn in ra 1, ngược lại in ra 0.
Input:
Chỉ có một số nguyên dương, không quá 8 chữ số.
Output:
In ra kết quả kiểm tra
Ví dụ:

Input Output
8 1
#include<stdio.h>
int main(){
long n;
scanf("%ld",&n);
long a[n],i,kt=0;
a[0]=0;
a[1]=1;
if(n==0 || n==1) printf("1");
else{
for(i=2;i<=n+1;i++){
a[i]=a[i-1]+a[i-2];
if(a[i]==n){
kt=1;
break;
}
}
if(kt==1) printf("1");
else printf("0");
}

LIỆT KÊ N SỐ FIBONACCI ĐẦU TIÊN

Bài làm tốt nhất


Nhập vào số nguyên dương n không quá 30.
In ra màn hình n số đầu tiên thuộc dãy Fibonacci (tính từ số 0).
Input:
Chỉ có một dòng ghi số n.
Output:
Ghi ra kết quả tính toán trên một dòng
Ví dụ:

Input Output
8 0 1 1 2 3 5 8 13
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[50];
printf("0 1 ");
a[0]=0;
a[1]=1;
for(int i=2;i<n;i++){
a[i]=a[i-1]+a[i-2];
printf("%d ",a[i]);
}

HÌNH VUÔNG DẤU *

Bài làm tốt nhất


Viết chương trình nhập vào n là cạnh của hình vuông và in ra hình vuông các ký tự *.
Giá trị n không quá 100.
Input
Chỉ có một số nguyên dương N không quá 100.
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
4 ****
****
****
****
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("*");
}
printf("\n");
}

HÌNH VUÔNG RỖNG VỚI DẤU *

Bài làm tốt nhất


Viết chương trình nhập vào n (không quá 100) là cạnh của hình vuông và thực hiện in
ra hình vuông rỗng các ký tự * theo mẫu trong ví dụ.
Input
Chỉ có một số nguyên dương N không quá 100.
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
4 ****
*..*
*..*
****

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==1 || i==n ) printf("*");
else {
if(j==1 || j==n) printf("*");
else printf(".");
}
}
printf("\n");
}
}

HÌNH BÌNH HÀNH CÁC DẤU *

Bài làm tốt nhất


Viết chương trình nhập vào N (không quá 100) là độ dài cạnh hình bình hành. Thực
hiện in ra hình bình hành tương ứng theo mẫu trong ví dụ.

Input
Chỉ có một số nguyên dương N không quá 100.
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
5 ~~~~*****
~~~*****
~~*****
~*****
*****
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=n-i;j>0;j--){
printf("~");
}
for(int j=1;j<=n;j++){
printf("*");
}
printf("\n");
}
}

HÌNH BÌNH HÀNH RỖNG

Bài làm tốt nhất


Viết chương trình nhập vào n (không quá 100) là độ dài cạnh hình bình hành. Thực
hiện in ra hình bình hành rỗng tương ứng theo mẫu trong ví dụ.
Input
Chỉ có một số nguyên dương N không quá 100.
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
5 ~~~~*****
~~~*...*
~~*...*
~*...*
*****
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=n-i;j>0;j--){
printf("~");
}
for(int j=1;j<=n;j++){
if(i==1 || i==n) printf("*");
else{

if(j==1 || j==n) printf("*");


else printf(".");
}
}
printf("\n");
}

}
HÌNH BÌNH HÀNH NGƯỢC

Bài làm tốt nhất


Viết chương trình nhập vào số hàng và cột của hình bình hành (không quá 100). Thực
hiện in ra hình bình hành ngược theo mẫu trong ví dụ.
Input
Chỉ có một số dòng ghi hai số a,b là số hàng và số cột (không quá 100).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
35 *****
~*****
~~*****
#include<stdio.h>
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
printf("~");
}
for(int j=1;j<=m;j++){
printf("*");
}
printf("\n");
}

HÌNH BÌNH HÀNH NGƯỢC - RỖNG

Bài làm tốt nhất


Viết chương trình nhập vào hàng và cột của hình bình hành (không quá 100). Thực
hiện in hình bình hành ngược và rỗng theo mẫu trong ví dụ.
Input
Chỉ có một số dòng ghi hai số a,b là số hàng và số cột (không quá 100).
Output
Ghi ra kết quả theo mẫu.
Ví dụ
Input Output
34 ****
~*..*
~~****
#include<stdio.h>
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
printf("~");
}

for(int j=1;j<=m;j++){
if(i==1 || i==n) printf("*");
else{
if(j==1 || j==m) printf("*");
else printf(".");
}
}
printf("\n");
}
}

TAM GIÁC VUÔNG TRÁI

Bài làm tốt nhất


Viết chương trình nhập vào chiều cao của tam giác (không quá 100) và In ra tam giác
hình sao tương ứng theo mẫu trong ví dụ.
Input
Chỉ có một số dòng ghi chiều cao (không quá 100).
Output
Ghi ra kết quả theo mẫu.
Ví dụ
Input Output
5 *
**
***
****
*****
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(int j=1;j<=i;j++){
printf("*");
}
printf("\n");
}
}

TAM GIÁC VUÔNG TRÁI - RỖNG

Bài làm tốt nhất


Viết chương trình nhập vào chiều cao của tam giác (không quá 100) và In ra tam giác
hình sao rỗng tương ứng theo mẫu trong ví dụ.
Input
Chỉ có một số dòng ghi chiều cao (không quá 100).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
5 *
**
*.*
*..*
*****
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(i==1 || i==n) printf("*");
else{
if(j==1 || j==i) printf("*");
else printf(".");
}
}
printf("\n");
}
}

TAM GIÁC VUÔNG PHẢI

Bài làm tốt nhất


Viết chương trình nhập vào chiêu cao của tam giác (không quá 100) và thực hiện in ra
tam giác vuông theo mẫu trong ví dụ.
Input
Chỉ có một số dòng ghi chiều cao (không quá 100).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
5 ~~~~*
~~~**
~~***
~****
*****
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
printf("~");
}
for(int k=n-i+1;k<=n;k++){
printf("*");
}

printf("\n");
}
}

HÌNH CHỮ NHẬT - 1

Bài làm tốt nhất


Nhập vào số hàng và số cột của hình chữ nhật (không quá 9). Vẽ hình chữ nhật số theo
nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.
Input
Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 9).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output

44 1234
2341
3421
4321
35 12345
23451
34521
64 1234
2341
3421
4321
5321
6321
#include<stdio.h>

int main(){
int n,m,i,j;
scanf("%d %d",&n,&m);
int c=0;
if(n<=m){
for(i=0;i<n;i++){
int e=c+1;
int d=c;
for(j=0;j<m-c;j++){
d++;
printf("%d",d);
}
for(j=m-c;j<m;j++){
e--;
printf("%d",e);

}
printf("\n");
c++;
}
}
else {
for(i=0;i<m;i++){
int e=c+1;
int d=c;
for(j=0;j<m-c;j++){
d++;
printf("%d",d);
}
for(j=m-c;j<m;j++){
e--;
printf("%d",e);

}
printf("\n");
c++;
}
for(i=m;i<n;i++){
int y=m;
for(j=0;j<m;j++){
if(j==0){
printf("%d",i+1);
}
else {
y--;
printf("%d",y);
}
}
printf("\n");
}
}
}

HÌNH CHỮ NHẬT - 2

Bài làm tốt nhất


Nhập vào số hàng và số cột của hình chữ nhật (không quá 9). Vẽ hình chữ nhật số theo
nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.
Input
Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 9).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output
44 1234
2343
3432
4321
35 12345
23454
34543
53 123
232
321
432
543

#include<stdio.h>

int main(){
int n,m,i,j;
scanf("%d %d",&n,&m);
if(n>m){
for(i=1;i<m;i++){
int d=i-1;
for(j=1;j<=m-i+1;j++){
d++;
printf("%d",d);
}
for(j=m-i+2;j<=m;j++){
d--;
printf("%d",d);
}
printf("\n");
}
for(i=m;i<=n;i++){
int e=i;
for(j=1;j<=m;j++){
printf("%d",e);
e--;
}
printf("\n");
}
}
else{
for(i=1;i<=n;i++){
int d=i-1;
for(j=1;j<=m-i+1;j++){
d++;
printf("%d",d);
}
for(j=m-i+2;j<=m;j++){
d--;
printf("%d",d);
}
printf("\n");
}
}
}

HÌNH CHỮ NHẬT - 3

Bài làm tốt nhất


Nhập vào số hàng và số cột của hình chữ nhật (không quá 9). Vẽ hình chữ nhật số theo
nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.
Input
Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 9).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output

44 1234
2123
3212
4321
46 123456
212345
321234
432123
64 1234
2123
3212
4321
5432
6543
#include<stdio.h>
int main(){
int n,m,i,j,d;
scanf("%d %d",&n,&m);
if(n<=m){
for(i=1;i<=n;i++){
d=i;
for(j=1;j<i;j++){
printf("%d",d);
d--;
}

for(j=i;j<=m;j++){
printf("%d",d);
d++;
}
printf("\n");
}
}
else{
for(i=1;i<=m;i++){
d=i;
for(j=1;j<i;j++){
printf("%d",d);
d--;
}

for(j=i;j<=m;j++){
printf("%d",d);
d++;
}
printf("\n");
}
for(i=m+1;i<=n;i++){
d=i;
for(j=1;j<=m;j++){
printf("%d",d);
d--;
}
printf("\n");
}
}
}

HÌNH CHỮ NHẬT - 4

Bài làm tốt nhất


Nhập vào số hàng và số cột của hình chữ nhật (không quá 9). Vẽ hình chữ nhật số theo
nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.
Input
Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 9).
Output
Ghi ra kết quả theo mẫu.
Ví dụ

Input Output

44 4321
3212
2123
1234
46 654321
543212
432123
321234
64 6543
5432
4321
3212
2123
1234
#include<stdio.h>
int main(){
int n,m,i,j,d;
scanf("%d %d",&n,&m);
if(n<=m){
for(i=1;i<=n;i++){
d=m+1-i;
for(j=1;j<m+1-i;j++){
printf("%d",d);
d--;
}

for(j=m+1-i;j<=m;j++){
printf("%d",d);
d++;
}
printf("\n");
}
}
else{

for(i=1;i<n-m;i++){
d=n+1-i;
for(j=1;j<=m;j++){
printf("%d",d);
d--;
}
printf("\n");
}
for(i=n-m;i<=n;i++){
d=n-i+1;
for(j=1;j<n-i+1;j++){
printf("%d",d);
d--;
}

for(j=n-i+1;j<=m;j++){
printf("%d",d);
d++;
}
printf("\n");
}

}
}

SO SÁNH TỔNG CHỮ SỐ

Bài làm tốt nhất


Viết chương trình nhập vào 2 số nguyên dương a và b không quá 6 chữ số. Hãy so sánh và
xếp lại theo thứ tự tăng dần tổng các chữ số.
(Nếu a và b có tổng các chữ số bằng nhau thì in ra a trước)
Ví dụ

Input Output
99 1111 1111 99
#include<stdio.h>
int tcn(int a){
int s=0;
while(a>0){
s=s+a%10;
a=a/10;
}
return s;
}
int main(){
int n,m,i,j,d;
scanf("%d %d",&n,&m);
if(tcn(m)<tcn(n)) printf("%d %d",m,n);
else printf("%d %d",n,m);
}

XUẤT HIỆN NHIỀU HƠN MỘT LẦN

Bài làm tốt nhất


Viết chương trình nhập vào mảng một chiều n phần tử (1 < n < 100) và thực hiện in ra
các phần tử xuất hiện nhiều hơn 1 lần trong mảng theo thứ tự xuất hiện (Nếu không có
phần tử nào thỏa mãn in ra 0).
Input
Dòng 1 ghi số n. Dòng 2 ghi n số của mảng.
Output
Ghi ra kết quả trên một dòng.
Ví dụ:

Input Output
7 23
2332195
#include<stdio.h>
int b[10001];
int main(){
int n,i,d=0,j;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}

for(i=0;i<n;i++){
int kt=0;
if(b[a[i]]>1) {
d++;
for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;
}
}
}
if(kt==0 && b[a[i]]>1) printf("%d ",a[i]);

if(d==0) printf("0");
}

ĐẾM SỐ LẦN XUẤT HIỆN 1

Bài làm tốt nhất


Viết chương trình nhập vào mảng một chiều n phần tử (1 < n < 100) và thực hiện in ra
các phần tử cùng số lần xuất hiện của chúng trong mảng. Các phần tử liệt kê theo thứ
tự xuất hiện.
Input
Dòng 1 ghi số n. Dòng 2 ghi n số của mảng.
Output
Ghi ra kết quả kết quả gồm các số khác nhau và số lần xuất hiện. Mỗi số trên một
dòng.
Ví dụ:

Input Output
7 22
2332195 32
11
91
51
#include<stdio.h>
int b[10001];
int main(){
int n,i,d=0,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}

for(i=0;i<n;i++){
int kt=0;

for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;

}
}
if(kt==0) printf("%d %d\n",a[i],b[a[i]]);
}
}

CHÈN MẢNG 1

Bài làm tốt nhất


Viết chương trình nhập vào mảng A một chiều n phần tử (1 < n < 100) và mảng B một
chiều m phần tử (1 < m < 100). Thực hiện chèn mảng B vào mảng A tại vị trí P và in
ra mảng kết quả.
Input
Dòng thứ nhất là số phần tử của mảng A và mảng B
Dòng thứ hai là các phần tử của mảng A
Dòng thứ ba là các phần tử của mảng B
Dòng thứ tư là vị trí chèn

Các phần tử không vượt quá 1000. Vị trí cần chèn đảm bảo nằm trong mảng A.
Output
Ghi ra dãy kết quả trên một dòng.
Ví dụ:
Input Output
53 12367845
12345
678
3
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d %d\n",&m,&n);
int a[m],b[n];
for(i=0;i<m;i++){
scanf("%d\n",&a[i]);
}
for(i=0;i<n;i++){
scanf("%d\n",&b[i]);
}
int k;
scanf("%d\n",&k);
for(i=0;i<k;i++){
printf("%d ",a[i]);
}
for(i=k;i<k+n;i++){
printf("%d ",b[i-k]);
}
for(i=k+n;i<m+n;i++){
printf("%d ",a[i-n]);
}
}

ĐẢO NGƯỢC MẢNG SỐ

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Thực hiện đảo
ngược mảng và in ra kết quả.
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Các phần tử không vượt quá 1000.
Output
Ghi ra dãy kết quả trên một dòng.
Ví dụ:

Input Output
5 54321
12345
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d\n",&a[i]);
}
for(i=n-1;i>=0;i--){
printf("%d ",a[i]);
}
}

TÁCH CHẴN LẺ

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Các giá trị trong dãy
không quá 1000. Thực hiện tách mảng đã cho thành mảng các số chẵn và mảng các số
lẻ.
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Các phần tử không vượt quá 1000.
Output
Dòng thứ nhất là mảng các số chẵn
Dòng thứ hai là mảng các số lẻ.
Ví dụ:
Input Output
5 24
12345 135
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]%2==0)
printf("%d ",a[i]);
}
printf("\n");
for(i=0;i<n;i++){
if(a[i]%2==1)
printf("%d ",a[i]);
}
}

SẮP XẾP TĂNG

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Thực hiện sắp xếp
tăng dần các phần tử của mảng và in ra màn hình.
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Các phần tử không vượt quá 1000.
Output
Ghi ra kết quả trên một dòng.
Ví dụ:
Input Output
8 12356789
13829765
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
int d=a[j];
a[j]=a[i];
a[i]=d;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}

SẮP XẾP GIẢM

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Thực hiện sắp xếp
giảm dần các phần tử của mảng và in ra màn hình.
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Các phần tử không vượt quá 1000.
Output
Ghi ra kết quả trên một dòng.
Ví dụ:

Input Output
8 98765321
13829765
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]<a[j]){
int d=a[j];
a[j]=a[i];
a[i]=d;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}

}
DỊCH TRÁI

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Thực hiện dịch n
phần tử của mảng sang trái và In ra mảng kết quả.
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Dòng thứ 3 là số lượng phần tử cần dịch trái.
Các phần tử không vượt quá 1000.
Output
Ghi ra kết quả trên một dòng.
Ví dụ:

Input Output
10 4 5 6 7 8 9 10 1 2 3
1 2 3 4 5 6 7 8 9 10
3
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d\n",&a[i]);
}
int k;
scanf("%d\n",&k);
for(i=0;i<n-k;i++){
printf("%d ",a[i+k]);
}
for(i=n-k;i<n;i++){
printf("%d ",a[i-n+k]);
}

}
DỊCH PHẢI

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử (1 < n < 100). Thực hiện dịch n
phần tử của mảng sang phải và In ra mảng kết quả
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Dòng thứ 3 là số lượng phần tử cần dịch phải.
Các phần tử không vượt quá 1000.
Output
Ghi ra kết quả trên một dòng.
Ví dụ:

Input Output
10 8 9 10 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8 9 10
3
#include <stdio.h>
int main(){
int m,n,i,j;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d\n",&a[i]);
}
int k;
scanf("%d\n",&k);
for(i=0;i<k;i++){
printf("%d ",a[n+i-k]);
}
for(i=k;i<n;i++){
printf("%d ",a[i-k]);
}

}
LỚN NHẤT VÀ LỚN THỨ HAI

Bài làm tốt nhất


Viết chương trình nhập vào mảng A có n phần tử số nguyên (2 < n < 100). Tìm giá trị
lớn nhất và lớn thứ hai trong mảng.

Dữ liệu vào đảm bảo dãy có ít nhất 2 số khác nhau.


Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Output
Ghi ra kết quả trên một dòng.
Ví dụ:

Input Output
6 80 79
80 23 79 58 11 10
#include<stdio.h>

int main(){
int n;
scanf("%d",&n);
int a[n],i,kt=0,s;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(a[i]<a[j]){
int d=a[j];
a[j]=a[i];
a[i]=d;
}
}
}
for(i=0;i<n;i++){
s=a[i];
if(s!=a[0]) {
kt=1;
break;
}}
if(kt==1){
printf("%d %d",a[0],s);
}

XUẤT HIỆN ĐÚNG MỘT LẦN

Bài làm tốt nhất


Viết chương trình cho phép nhập vào mảng A có n phần tử số nguyên (2 < n < 100).
Đếm các phần tử chỉ xuất hiện một lần và liệt kê.

Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Output
- Dòng đầu tiên là số các phần tử thỏa mãn
- Dòng thứ hai là các phần tử thỏa mãn.
Ví dụ:

Input Output
7 3
1 5 10 10 5 2 3 123
#include<stdio.h>
int b[10001];
int main(){
int n,d=0;
scanf("%d",&n);
int a[n],i,kt=0,s;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}
for(i=0;i<n;i++){
if(b[a[i]]==1){
d++;
}
}
printf("%d\n",d);
for(i=0;i<n;i++){
if(b[a[i]]==1){
printf("%d ",a[i]);
}
}
}

NHỎ NHẤT VÀ NHỎ THỨ HAI

Bài làm tốt nhất


Viết chương trình nhập vào mảng A gồm n phần tử số nguyên (2 < n < 100). Tìm giá
trị nhỏ nhất và nhỏ thứ hai và in ra.
Dữ liệu vào đảm bảo luôn có ít nhất 2 số khác nhau.
Input
Dòng thứ nhất là số phần tử của mảng A.
Dòng thứ hai là các phần tử của mảng A
Output
- Giá trị nhỏ nhất và giá trị nhỏ thứ hai
Ví dụ:

Input Output
6 10 11
80 23 79 58 11 10
#include<stdio.h>

int main(){
int n;
scanf("%d",&n);
int a[n],i,kt=0,s;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(a[i]>a[j]){
int d=a[j];
a[j]=a[i];
a[i]=d;
}
}
}
for(i=0;i<n;i++){
s=a[i];
if(s!=a[0]) {
kt=1;
break;
}}
if(kt==1){
printf("%d %d",a[0],s);
}

}
LIỆT KÊ PHẦN TỬ XUẤT HIỆN NHIỀU HƠN 1 LẦN

Bài làm tốt nhất

Viết chương trình nhập vào mảng A gồm n phần tử số nguyên (2 < n < 100). Đếm các
phần tử xuất hiện nhiều hơn một lần và liệt kê các số đó.

Input

Dòng thứ nhất là số phần tử của mảng A.

Dòng thứ hai là các phần tử của mảng A

Output

- Dòng đầu tiên là số các phần tử thỏa mãn

- Dòng thứ hai là các phần tử thõa mãn

Ví dụ:

Input Output
7 2

1 5 10 10 5 2 3 5 10

#include<stdio.h>
int b[10001];
int main(){
int n,i,d=0,j;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}
for(i=0;i<n;i++){
int kt=0;
if(b[a[i]]>1) {
for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;
}
}
}
if(kt==0 && b[a[i]]>1) d++;

}
printf("%d\n",d);
for(i=0;i<n;i++){
int kt=0;
if(b[a[i]]>1) {
for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;
}
}
}
if(kt==0 && b[a[i]]>1) printf("%d ",a[i]);

}
CHUYỂN THÀNH CHỮ HOA

Bài làm tốt nhất

Viết chương trình nhập vào một xâu ký tự S có độ dài không quá 100 và chuyển xâu
đã nhập thành chữ in hoa.

Input:

Chỉ có một dòng ghi xâu S.

Output:

Ghi ra kết quả trên một dòng.

Ví dụ:

Input Output
mon thcs 2 MON THCS 2

#include <stdio.h>
#include <string.h>
int main(){
char a[101];
gets(a);
for(int i;i<=strlen(a);i++){
if(a[i]>='a' && a[i]<='z'){
a[i]=a[i]-32;
}
}
printf("%s",a);
}

ĐẾM KÝ TỰ

Bài làm tốt nhất

Viết chương trình nhập vào một xâu ký tự S, thực hiện phân tích xâu đã nhập chứa bao
nhiêu chữ cái, chữ số và các ký tự khác.

Input:

Chỉ có một dòng ghi xâu S.

Output:

Ghi ra kết quả theo mẫu trong ví dụ: số chữ cái, số chữ số, số các ký tự khác.

Ví dụ:

Input Output
mon thcs mon THCS 2 ... 14 1 8

#include<stdio.h>
#include<string.h>
int main(){
char a[1000001];
gets(a);
long long i,x=0,y=0,z=0;
for(i=0;i<strlen(a);i++){
if((a[i]>='a' && a[i]<='z') || (a[i]<='Z' && a[i]>='A')) {
x++;
}
else if(a[i]>=48 && a[i]<=57){
y++;
}
else {
z++;
}
}
printf("%lld %lld %lld",x,y,z);
}

LOẠI BỎ TRÙNG NHAU

Bài làm tốt nhất

Viết chương trình nhập vào mảng A gồm n phần tử số nguyên (2 < n < 100). Thực
hiện loại bỏ các phần tử đã xuất hiện và In ra mảng kết quả.

Input

Dòng thứ nhất là số phần tử của mảng A.

Dòng thứ hai là các phần tử của mảng A

Output

Ghi ra kết quả trên một dòng

Ví dụ:
Input Output
7 1 5 10 2 3

1 5 10 10 5 2 3

#include<stdio.h>
int main(){
int n,i,d=0,j;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);

for(i=0;i<n;i++){
int kt=0;

for(j=0;j<i;j++){
if(a[j]==a[i]){
kt=1;
break;

}
}
if(kt==0 ) printf("%d ",a[i]);

}
HÌNH CHỮ NHẬT KÝ TỰ - 1

Bài làm tốt nhất

Nhập vào số hàng và số cột của hình chữ nhật (không quá 20). Vẽ hình chữ nhật ký tự
theo nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.

Input

Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

55 eeeee

edddd

edccc

edcbb

edcba
46 ffffff

feeeee

fedddd

fedccc
64 ffff

feee

fedd
fedc

fedc

fedc

#include<stdio.h>
#include<string.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int d=n;
int i,j;
if(m>=n){

for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i>=j) printf("%c",m-j+96);
else printf("%c",m-i+96);
}
printf("\n");
}
}
else {
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i>=j) printf("%c",n-j+96);
else printf("%c",n-i+96);
}
printf("\n");
}
}
}

HÌNH CHỮ NHẬT KÝ TỰ - 2

Bài làm tốt nhất

Nhập vào số hàng và số cột của hình chữ nhật (không quá 20). Vẽ hình chữ nhật ký tự
theo nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.

Input

Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

44 ABCD

BCDA

CDBA

DCBA
35 ABCDE

BCDEA

CDEBA
53 ABC

BCA

CBA
CBA

CBA

#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i,j;
if(m<=n){
for(i=1;i<=m;i++){
for(j=i;j<=n;j++){
printf("%c",j+64);
}

for(j=n+1;j<n+i;j++){
printf("%c",n+i-j+64);
}

printf("\n");
}
}
else {
for(i=1;i<=n;i++){
for(j=i;j<=n;j++){
printf("%c",j+64);
}
for(j=n+1;j<n+i;j++){
printf("%c",n+i-j+64);
}
printf("\n");
}
for(i=n+1;i<=m;i++){
for(j=n;j>0;j--){
printf("%c",j+64);
}
printf("\n");
}
}
}

TAM GIÁC KÝ TỰ - 2

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 20).

Vẽ hình tam giác ký tự theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output

4 ACEG

CEG

EG

G
#include<stdio.h>
#include<string.h>
int main(){
int m;
scanf("%d",&m);
int i,j;
for(i=0;i<m;i++){
for(j=i;j<m;j++){
printf("%c",j+65+j);
}
printf("\n");
}
}

TAM GIÁC KÝ TỰ - 5

Bài làm tốt nhất

Nhập vào chiều cao tam giác (không quá 20).

Vẽ hình tam giác ký tự theo nguyên tắc tương ứng theo mẫu trong ví dụ dưới đây.

Input

Chỉ có một số dòng ghi chiều cao (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ
Input Output

5 DEFGH

CDEF

BCD

AB

#include<stdio.h>
#include<string.h>
int main(){
int m;
scanf("%d",&m);
int i,j;
for(i=m;i>0;i--){
for(j=i;j<=2*i-1;j++){
printf("%c",j+63);
}

printf("\n");
}
}

HÌNH CHỮ NHẬT KÝ TỰ - 3


Bài làm tốt nhất

Nhập vào số hàng và số cột của hình chữ nhật (không quá 20). Vẽ hình chữ nhật ký tự
theo nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.

Input

Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output
44 @ABC

ABCC

BCCC

CCCC
35 @ABCD

ABCDD

BCDDD
53 @AB

ABB

BBB

BBB

BBB

#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i,j;
if(m<=n){

for(i=1;i<=m;i++){
for(j=i;j<=n;j++){
printf("%c",j+63);
}

for(j=1;j<i;j++){
printf("%c",n+63);
}

printf("\n");
}
}
else {
for(i=1;i<=n;i++){
for(j=i;j<=n;j++){
printf("%c",j+63);
}

for(j=1;j<i;j++){
printf("%c",n+63);
}

printf("\n");
}
for(i=n+1;i<=m;i++){
for(j=1;j<=n;j++){
printf("%c",n+63);
}
printf("\n");
}
}

HÌNH CHỮ NHẬT KÝ TỰ - 4

Bài làm tốt nhất

Nhập vào số hàng và số cột của hình chữ nhật (không quá 20). Vẽ hình chữ nhật ký tự
theo nguyên tắc tương ứng theo mẫu trong các ví dụ dưới đây.

Input

Chỉ có một số dòng ghi số hàng và số cột của hình chữ nhật (không quá 20).

Output

Ghi ra kết quả theo mẫu.

Ví dụ

Input Output
44 DDDD

CDDD

BCDD

ABCD
35 CDEEE

BCDEE

ABCDE
53 CCC

CCC

CCC

BCC

ABC

#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i,j;
if(m<=n){

for(i=m;i>0;i--){
for(j=i;j<=n;j++){
printf("%c",j+64);
}

for(j=1;j<i;j++){
printf("%c",n+64);
}

printf("\n");
}
}
else {
for(i=m;i>=n+1;i--){
for(j=1;j<=n;j++){
printf("%c",n+64);
}
printf("\n");
}
for(i=n;i>0;i--){
for(j=i;j<=n;j++){
printf("%c",j+64);
}

for(j=1;j<i;j++){
printf("%c",n+64);
}

printf("\n");
}

LOẠI BỎ TỪ TRONG XÂU

Bài làm tốt nhất


Cho xâu ký tự S1 và một từ S2. Viết chương trình loại bỏ tất cả các từ S2 xuất hiện
trong S1

Input:

Dòng đầu ghi xâu S1 (độ dài không quá 100).

Dòng thứ 2 ghi từ S2.

Output:

Ghi ra xâu S1 sau khi đã loại bỏ các từ S2.

Ví dụ:

Input Output
mon thcs2 la mon 2tc thcs2 la 2tc

mon

#include<stdio.h>
#include<string.h>
int main(){
char a[1000],b[1000];
gets(a);
scanf("\n");
gets(b);
int m=strlen(a), n=strlen(b),i,j;
for(i=0;i<m;i++){
int k=1;
while(k!=0){
if(a[i+k-1]!=b[k-1]) break;
else k++;
if(k==n+1){
for(j=i;j<k+i;j++){
a[j]='\0';
}
k=0;
}
}
}
for(i=0;i<m;i++){
if(a[i]!='\0') printf("%c",a[i]);
}
}

LOẠI CÁC TỪ TRÙNG NHAU

Bài làm tốt nhất

Cho xâu ký tự S có độ dài không quá 100. Hãy loại bỏ các từ trùng nhau trong xâu.

Input:

Chỉ có một dòng ghi xâu S.

Output:

Ghi ra kết quả sau khi loại các từ trùng nhau.

Ví dụ:

Input Output
mon thcs2 hoc la mon 2tc hoc mon thcs2 hoc la 2tc

#include<stdio.h>
#include<string.h>
int bn(char a[],char b[]){
int n=strlen(a);
int l=strlen(b);
if(n!=l) return 0;
else {
for(int i=0;i<n;i++){
if(a[i]!=b[i]) return 0;
}
return 1;

}
}
int main(){
char a[1001];
char s[1001][1001];
gets(a);
int i,j,n=strlen(a);
int l=0,x=0;
for(i=0;i<n;i++){
if(a[i]!=' '){

s[l][x++]=a[i];
}
if(a[i]==' '){
l++;
x=0;
}
}
for(i=0;i<=l;i++){
int d=0;
for(j=0;j<i;j++){
if(bn(s[i],s[j])==1){
d++;
break;
}
}
if(d==0) printf("%s ",s[i]);
}
}GIÁ TRỊ NHỎ NHẤT TRONG BA SỐ

Bài làm tốt nhất

Viết chương trình nhập vào ba số nguyên có trị tuyệt đối không quá 6 chữ số. Tìm giá
trị nhỏ nhất trong ba số đó.

Input

Chỉ có một dòng ghi ba số a,b,c cách nhau một khoảng trống. Cả ba số không quá 6
chữ số.

Output

Ghi ra số nhỏ nhất.

Ví dụ

Input Output
10 20 30 10

#include<stdio.h>
int main(){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int min=a;
if(b<min) min=b;
if (c<min) min=c;
printf("%d",min);

GẤP ĐÔI 1

Bài làm tốt nhất

Cho số tự nhiên N không quá 7 chữ số. Hãy in ra giá trị gấp đôi của N.

Input

Có duy nhất một số tự nhiên không quá 7 chữ số.

Output

Ghi ra kết quả trên một dòng.

Ví dụ

Input Output
23 46
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d",a*2);

GẤP ĐÔI 2

Bài làm tốt nhất

Cho số tự nhiên N không quá 9 chữ số. Hãy in ra giá trị gấp đôi của N.

Input

Dòng đầu ghi số bộ test. Mỗi bộ test có duy nhất một số tự nhiên không quá 9 chữ số.

Output

Với mỗi bộ test, ghi ra kết quả trên một dòng.

Ví dụ

Input Output
2 2

1 46

23


#include<stdio.h>
int main(){
int t,i;
scanf("%d\n",&t);
for(i=0;i<t;i++){
int a;
scanf("%d",&a);
printf("%d\n",a*2);

}
}

BÌNH PHƯƠNG

Bài làm tốt nhất

Cho số tự nhiên N không quá 9 chữ số. Hãy in ra giá trị bình phương của N.

Input

Dòng đầu ghi số bộ test. Mỗi bộ test có duy nhất một số tự nhiên không quá 9 chữ số.

Output

Với mỗi bộ test, ghi ra kết quả trên một dòng.

Ví dụ

Input Output
2 1

1 529

23
#include<stdio.h>
int main(){
int t,i;
scanf("%d\n",&t);
for(i=0;i<t;i++){
long a;
scanf("%ld",&a);
long long s=a*a;
printf("%lld\n",s);

}
}

GIÁ TRỊ THẬP PHÂN

Bài làm tốt nhất

Cho số nguyên dương N không quá 9 chữ số. Hãy in ra giá trị thập phân 1/N.

Input

Dòng đầu ghi số bộ test. Mỗi bộ test có duy nhất một số nguyên dương không quá 9
chữ số.

Output
Với mỗi bộ test, ghi ra kết quả trên một dòng với đúng 15 số sau dấu phẩy.

Ví dụ

Input Output
2 1.000000000000000

1 0.043478260869565

23

#include<stdio.h>
int main(){
int t,i;
scanf("%d\n",&t);
for(i=0;i<t;i++){
long a;
scanf("%ld",&a);
double s=(double)1/a;
printf("%.15lf\n",s);

}
}
PHÉP TOÁN CƠ BẢN 2

Bài làm tốt nhất

Nhập 2 số nguyên dương a,b không quá 6 chữ số.

Hãy in ra lần lượt các giá trị: tổng, hiệu, tích, chia phần nguyên, chia phần dư, chia kết
quả thực (với đúng 2 chữ số sau dấu phẩy) của 2 số a,b đã cho.

Mỗi kết quả tính toán ghi trên một dòng

Input

Chỉ có 2 số a,b trên một dòng.

Output

Gồm 6 dòng lần lượt là kết quả của các phép tính theo thứ tự trong mô tả đề bài.

Ví dụ

Input Output
1 2 3

-1

0.50
#include<stdio.h>
int main(){
long a,b;
scanf("%ld %ld",&a,&b);
long long s=a+b;
long m=a-b;
long x=a/b;
float y=(float)a/b;
long z=a%b;
long long t=a*b;
printf("%lld\n",s);
printf("%ld\n",m);
printf("%lld\n",t);
printf("%ld\n",x);
printf("%ld\n",z);
printf("%.2f",y);
}

CHẴN LẺ

Bài làm tốt nhất

Cho một số nguyên dương N không quá 5 chữ số, hãy kiểm tra và in ra số đó chẵn hay
lẻ. Nếu chẵn ghi ra chữ CHAN, nếu ngược lại ghi ra chữ LE.

Input

Chỉ có một dòng ghi số N

Output
Ghi ra kết quả trên một dòng.

Ví dụ

Input Output
2 CHAN
9999 LE

#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n%2==0) printf("CHAN");
else printf("LE");

CHỮ HOA – CHỮ THƯỜNG

Bài làm tốt nhất

Cho một chữ cái bất kỳ. Hãy kiểm tra xem đó là chữ hoa hay chữ thường. Nếu là chữ
thường thì in ra chữ hoa, nếu là chữ hoa thì in ra chữ thường tương ứng.
Input

Dòng đầu ghi số bộ test. Mỗi bộ test có duy nhất một chữ cái.

Output

Với mỗi bộ test, ghi ra kết quả trên một dòng.

Ví dụ

Input Output
2 b

B Q

#include<stdio.h>
#include<string.h>
int main(){
int t,i;
scanf("%d",&t);

for(i=0;i<t;i++){
char n;
scanf("\n");
scanf("%c",&n);
if(n<='z' && n>='a'){
n=n-32;
printf("%c",n);
}
else {
n=n+32;
printf("%c",n);
}
printf("\n");
}
}

PHÉP CỘNG

Bài làm tốt nhất

Cho một phép toán có dạng a + b = c với a,b,c chỉ là các số nguyên dương có một chữ
số.

Hãy kiểm tra xem phép toán đó có đúng hay không.

Input

Chỉ có một dòng ghi ra phép toán (gồm đúng 9 ký tự)

Ouput

Ghi ra YES nếu phép toán đó đúng. Ghi ra NO nếu sai.

Ví dụ

Test 1 Test 2
Input Input

1 + 2 = 3 2 + 2 = 5

Output Output

YES NO
#include<stdio.h>
int main(){
int a,b,c;
scanf("%d + %d = %d",&a,&b,&c);
int s=a+b;
if(c==s) printf("YES");
else printf("NO");
}

PHƯƠNG TRÌNH BẬC NHẤT

Bài làm tốt nhất

Viết chương trình nhập 2 số thực a,b và in ra nghiệm của phương trình bậc nhất
a*x+b=0.

Input

Chỉ có một dòng ghi hai số a,b.

Output

Kết quả ghi ra trên một dòng tương ứng là “Vo nghiem” “Vo so nghiem” hoặc
nghiệm dưới dạng số thực có đúng 2 chữ số sau dấu phẩy.

Ví dụ
Input Output
2 -1 0.50
0 1 Vo nghiem
0 0 Vo so nghiem

#include <stdio.h>

int main()
{
float a;
float b;
float c;
scanf("%f %f",&a,&b);
if(a==0 && b!=0) printf("Vo nghiem");
else if(a==0 && b==0) printf ("Vo so nghiem");
else {
c=-b/a;
printf ("%.2f", c);
}
return 0;
}
TÍNH TỔNG 1 ĐẾN N

Bài làm tốt nhất

Cho số nguyên dương N.

Hãy tính S = 1 + 2 + ... + N

Dữ liệu vào:

 Dòng đầu ghi số bộ test, không quá 10


 Mỗi dòng ghi một số nguyên dương N, không quá 109

Kết quả:

Với mỗi test, ghi kết quả trên một dòng.

Ví dụ:

Input Output
2 55

10 210

20

#include <stdio.h>

int main() {
int a;
scanf ("%d",&a);
for (int i=0;i<a;i++)
{
long long n;
scanf ("%lld",&n);
printf ("%lld\n",(1+n)*n/2);
}
}

SỐ CHÍNH PHƯƠNG

Bài làm tốt nhất

Nhập một số nguyên dương không quá 9 chữ số. Hãy kiểm tra xem đó có phải số
chính phương hay không.

Input

Dòng đầu của dữ liệu vào ghi số bộ test, mỗi bộ test ghi một số nguyên dương N.

Output

Ghi ra YES nếu đúng và NO nếu không.

Ví dụ

Input Output
3 NO

11 YES

121 YES

361
#include<stdio.h>
#include<math.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,i,x,y;
scanf("%ld",&n);
x=sqrt(n);
y=x*x;
if(y==n) printf("YES\n");
else printf("NO\n");
}
}

TÍNH TỔNG PHÂN THỨC

Bài làm tốt nhất

Viết chương trình tính tổng S = 1 + ½ + 1/3 + … + 1/N

Input
Dữ liệu vào chỉ có 1 dòng ghi số N không quá 6 chữ số.

Output

Kết quả ghi chính xác với 4 số phần thập phân.

Ví dụ

Input Output
2 1.5000

#include<stdio.h>
int main(){
long long a;
double sum=0;
scanf("%lld",&a);
for(double i=1;i<=a;i++){
sum+=1/(double)i;
}
printf("%.4lf",sum);
return 0;
}

TÍNH TỔNG GIAI THỪA


Bài làm tốt nhất

Viết chương trình tính tổng S = 1 + 1.2 + 1.2.3 + ...+1.2.3...N

Input

Dữ liệu vào chỉ có 1 dòng ghi số N không quá 20.

Output

Kết quả ghi trên một dòng.

Ví dụ

Input Output
3 9

#include<stdio.h>
int main(){

int n,i;
long x=1,s=0;

scanf("%d",&n);
for(i=1;i<=n;i++){
x=x*i;
s=s+x;
}
printf("%ld",s);
}
TỔNG CHỮ SỐ 2

Bài làm tốt nhất

Hãy viết chương trình tính tổng các chữ số của một số nguyên bất kỳ.

Input

Dòng đầu tiên của dữ liệu vào ghi số bộ test, mỗi bộ test ghi trên một dòng 1 số
nguyên dương không quá 9 chữ số.

Output

Kết quả của mỗi bộ test cũng ghi trên một dòng.

Ví dụ

Input Output
1 10

1234

#include<stdio.h>
int main(){

int t,k;

scanf("%d",&t);
for(k=1;k<=t;k++){
long n;
scanf("%ld",&n);
long s=0;
while(n>0){
s=s+n%10;
n=n/10;
}
printf("%ld\n",s);
}
}
ƯỚC SỐ CHUNG LỚN NHẤT – BỘI SỐ CHUNG NHỎ NHẤT

Bài làm tốt nhất

Viết chương trình tìm ước số chung lớn nhất và bội số chung nhỏ nhất của hai số
nguyên dương a,b.

Input

Dữ liệu vào chỉ có 2 số nguyên dương a và b không quá 9 chữ số.

Ouput

Kết quả ghi trên 2 dòng, dòng đầu là USCLN, dòng thứ 2 là BSCNN.

Ví dụ

Input Output
2 5 1

10

#include<stdio.h>
int main(){
long a,b,d;
scanf("%ld %ld",&a,&b);
long x=b,y=a;
while(a%b!=0){
d=a%b;
a=b;
b=d;
}
long UCLN=b;
long BCNN=x*y/UCLN;
printf("%ld\n%ld",UCLN,BCNN);
}
SỐ LỘC PHÁT

Bài làm tốt nhất

Một số được gọi là “lộc phát” nếu chỉ có các chữ số 0,6,8. Nhập vào một số nguyên
dương không quá 9 chữ số, hãy kiểm tra xem đó có phải số lộc phát hay không.

Input

Dòng đầu là số bộ test, mỗi dòng tiếp theo ghi một số cần kiểm tra.

Ouput

Nếu đúng in ra YES, nếu sai in ra NO.

Ví dụ

Input Output
3 NO

181 YES

88888 YES

608868

#include<stdio.h>
#include<string.h>
int main(){
int n;
char a[1000000];
scanf("%d",&n);

while(n--){
scanf("\n");

gets(a);
int y=0;
for(int i=0;i<strlen(a);i++){
if(a[i] != '0' && a[i] != '6' && a[i] != '8') y=1;
break;
}
if(y==0) printf("YES\n");
else printf("NO\n");
}}

BẮT ĐẦU VÀ KẾT THÚC

Bài làm tốt nhất

Viết chương trình kiểm tra một số nguyên dương bất kỳ (2 chữ số trở lên, không quá 9
chữ số) có chữ số bắt đầu và kết thúc bằng nhau hay không.

Input

Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng số nguyên dương tương
ứng cần kiểm tra.

Output

Mỗi bộ test viết ra YES hoặc NO, tương ứng với bộ dữ liệu vào

Ví dụ

Input Output
2 YES
12451

1000012 NO

#include<stdio.h>

int main(){
int t;
scanf ("%d",&t);
while (t--){
long long a;
scanf ("%lld", &a);
int cuoi=a%10;
while (a>9) a/=10;
if (a==cuoi) printf ("YES\n");
else printf ("NO\n");
}

TỔNG CHỮ SỐ CHIA HẾT CHO 10

Bài làm tốt nhất

Viết chương trình kiểm tra một số có thỏa mãn tính chất tổng chữ số của nó chia hết
cho 10 hay không.

Input
Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng một số nguyên dương, ít
nhất 2 chữ số nhưng không quá 9 chữ số.

Output

Mỗi bộ test viết ra YES hoặc NO tùy thuộc kết quả kiểm tra.

Ví dụ

Input Output
3 NO

3333 YES

555555 YES

123455

#include<stdio.h>
int main(){

int t,k;

scanf("%d",&t);
for(k=0;k<t;k++){
long n;
scanf("%ld",&n);
long s=0;
while(n>0){
s=s+n%10;
n=n/10;
}
if(s%10==0) printf("YES\n");
else printf("NO\n");
}
}

SỐ NGUYÊN TỐ

Bài làm tốt nhất

Viết chương trình kiểm tra một số nguyên dương có phải số nguyên tố hay không.

Input

Dòng đầu của dữ liệu vào ghi số bộ test. Mỗi dòng tiếp theo có một nguyên dương không quá
9 chữ số.

Output

Kết quả in ra YES nếu đó là số nguyên tố, in ra NO nếu ngược lại.

Ví dụ:

Input Output
3 NO

123456 YES

997 NO

111111111

#include<stdio.h>

int main()
{
long long a;
scanf("%lld",&a);
while(a--){
long m;
scanf("%ld",&m);
int kt=0;
if (m<2) printf("NO\n");
else {
for (int i=2;i*i<=m;i++) {
if (m%i==0) {
kt=1;
break;
}
}
if (kt==1) printf("NO\n");
else printf("YES\n");
}
}
}

SỐ NGUYÊN TỐ NHỎ HƠN N

Bài làm tốt nhất

Viết chương trình liệt kê các số nguyên tố nhỏ hơn N với N là một số nguyên dương không
quá 106.

Input

Dữ liệu vào chỉ có duy nhất một số N.

Output
Kết quả ghi mỗi số nguyên tố trên một dòng, theo thứ tự từ nhỏ đến lớn.

Ví dụ:

Input Output
10 2

#include <stdio.h>
#include <math.h>
int songuyento(int i)
{
int kt=1;
if(i<2)
kt=0;

else{
for(int k=2;k<=sqrt(i);k++)
{
if(i%k==0){
kt=0;
break;
}
} }
if(kt==0)
return 0;
else
return 1;
}
int main()
{
int i,c;
scanf("%d",&i);
for(int k=1;k<=i;k++)
{
if(songuyento(k)==1)
printf("%d\n",k);
}
}

LIỆT KÊ N SỐ NGUYÊN TỐ ĐẦU TIÊN

Bài làm tốt nhất

Viết chương trình liệt kê N số nguyên tố đầu tiên với N là một số nguyên dương không quá
105.

Input

Dữ liệu vào chỉ có duy nhất một số N.

Output

Kết quả ghi mỗi số nguyên tố trên một dòng, theo thứ tự từ nhỏ đến lớn.

Ví dụ:

Input Output
5 2
3

11

#include<stdio.h>
#include<math.h>
int snt(int a){
if(a<2) return 0;
else{

int kt=0;
for(int i=2;i<=sqrt(a);i++){
if(a%i==0){

kt=1;
break;
}
}
if(kt==1 ) return 0;
else return 1;

}
}
int main(){

int t,d=0;
long long k;
scanf("%d",&t);
for(k=1;k>=1;k++){
if(snt(k)==1)
{
d++;
printf("%d\n",k);
}
if(d==t){
break;
}

}
}

LIỆT KÊ CÁC CẶP SỐ NGUYÊN TỐ CÙNG NHAU

Bài làm tốt nhất

Viết chương trình nhập hai số nguyên dương a,b thỏa mãn 2<a<b<100.

Một cặp số (i,j) được gọi là nguyên tố cùng nhau nếu i ≠ j và ước số chung lớn nhất của i với j
là 1

Hãy liệt kê các cặp số nguyên tố cùng nhau trong đoạn [a,b] theo thứ tự từ nhỏ đến lớn.

Input

Chỉ có một dòng ghi hai số a,b


Output

Các cặp số i,j thỏa mãn được viết lần lượt trên từng dòng theo định dạng (i,j), theo thứ tự từ
điển.

Ví dụ

Input Output
5 8 (5,6)

(5,7)

(5,8)

(6,7)

(7,8)

PHÂN TÍCH THỪA SỐ NGUYÊN TỐ 1

Bài làm tốt nhất

Viết chương trình phân tích một số nguyên thành các thừa số nguyên tố.

Input

Dòng đầu ghi số bộ test, mỗi bộ test ghi trên một dòng số nguyên dương cần phân tích
(không quá 9 chữ số) .

Output

Kết quả của mỗi bộ test ghi trên một dòng, mỗi thừa số cách nhau một khoảng trống.

Ví dụ

Input Output
2 2 5

10 2 2 5

20
#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,i;
scanf("%ld",&n);
for(i=2;i<=n;i++){
long d=n;
while(n%i==0){
printf("%ld ",i);
n=n/i;
}
}
printf("\n");
}
}

PHÂN TÍCH THỪA SỐ NGUYÊN TỐ 3

Bài làm tốt nhất

Hãy phân tích một số nguyên dương thành tích các thừa số nguyên tố.

Input
Dòng đầu tiên ghi số bộ test. Mỗi bộ test viết trên một dòng số nguyên dương n không quá 9
chữ số.

Output

Mỗi bộ test viết ra thứ tự bộ test, sau đó lần lượt là các số nguyên tố khác nhau có trong tích,
với mỗi số viết thêm số lượng số đó. Xem ví dụ để hiểu rõ hơn về cách viết kết quả.

Ví dụ

Input Output
3 Test 1: 2(2) 3(1) 5(1)

Test 2: 2(7)
60
Test 3: 2(4) 5(4)
128

10000

#include<stdio.h>
int b[10001];
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,i;
scanf("%ld",&n);
printf("Test %d: ",k+1);
for(i=2;i<=n;i++){
long d=0;
while(n%i==0){
d++;
n=n/i;
}
if(d>0) printf("%ld(%ld) ",i,d);
}
printf("\n");
}
}

SỐ THUẬN NGHỊCH

Bài làm tốt nhất

Một số nguyên dương được gọi là số thuận nghịch nếu viết theo chiều ngược lại vẫn
có cùng giá trị với số ban đầu. Ví dụ số 121 là số thuận nghịch, số 123 không phải số
thuận nghịch.

Viết chương trình kiểm tra số thuận nghịch

Input

Dòng đầu ghi số bộ test, mỗi bộ test ghi một số nguyên dương không quá 18 chữ số

Output

Với mỗi bộ test, nếu đúng ghi ra YES, nếu sai ghi ra NO.

Ví dụ

Input Output
2 NO

123456789012345 YES

12345678987654321

#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long long n,i,s=0;
scanf("%lld",&n);
long long m=n;
while(n>0){
int d=n%10;
s=s*10+d;
n=n/10;
}
if(s==m) printf("YES");
else printf("NO");
printf("\n");
}
}

VỪA NGUYÊN TỐ VỪA THUẬN NGHỊCH

Bài làm tốt nhất

Viết chương trình liệt kê các số vừa nguyên tố, vừa thuận nghịch trong đoạn [a,b] với a,b là
các số nguyên dương thỏa mãn 10<a<b<106.

Input

Dòng đầu ghi số bộ test. Mỗi bộ test là một cặp số a,b.

Output

Với mỗi bộ test, ghi lần lượt các số thỏa mãn, mỗi số cách nhau một khoảng trống, mỗi dòng
ghi đúng 10 số. Khi hết một test thì bỏ trống một dòng trước khi ghi kết quả test tiếp theo.

Ví dụ

Input Output
2 101 131 151 181 191 313 353 373 383 727

20 1234 757 787 797 919 929

123 140

131

#include<stdio.h>
#include<math.h>
int snt(long a){
if(a<2) return 0;
else{

int kt=0;
for(long i=2;i<=sqrt(a);i++){
if(a%i==0){

kt=1;
break;
}
}
if(kt==1 ) return 0;
else return 1;

}
}
int stn(int n){
int i,s=0,m=n;
while(n>0){
int d=n%10;
s=s*10+d;
n=n/10;
}
if(s==m) return 1;
else return 0;
}
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
int a,b,i,d=0;
scanf("%d %d",&a,&b);
for(i=a;i<=b;i++){
if(snt(i)==1 && stn(i)==1){
d++;
printf("%d ",i);
}
if(d==10){
printf("\n");
d=0;
}
}
printf("\n");
printf("\n");

LIỆT KÊ SỐ CHÍNH PHƯƠNG

Bài làm tốt nhất


Nhập vào 2 số tự nhiên m và n, sao cho m<n và cả hai số đều không quá 9 chữ
số. Hãy liệt kê các số chính phương trong đoạn [m,n].

Input

Dữ liệu vào chỉ bao gồm hai số m và n ghi trên một dòng.

Output

Dòng đầu tiên của kết quả ghi số lượng số chính phương tìm được. Tiếp theo,
mỗi số chính phương được ghi trên một dòng.

Ví dụ

Input Output
9 50 5

16

25

36

49

#include<stdio.h>
#include<math.h>
int scp(long a){
long x=sqrt(a);
if(x*x==a) return 1;
else return 0;
}
int main(){
long a,b,i,d=0,m,n;
scanf("%ld %ld",&a,&b);
for(i=a;i<=b;i++){
if(scp(i)==1){
m=i;
break;
}
}
for(i=b;i>=a+m;i--){
if(scp(i)==1) {
n=i;
break;
}
}

long x=sqrt(m),y=sqrt(n);
printf("%ld\n",y-x+1);
for(i=x;i<=y;i++){
long z=i*i;
printf("%ld\n",z);
}

CHỮ SỐ CHẴN LẺ 2

Bài làm tốt nhất

Nhập một số nguyên dương N không quá 9 chữ số. Hãy đếm xem N có bao nhiêu
chữ số lẻ và bao nhiêu chữ số chẵn.

Input

Dòng đầu của dữ liệu vào ghi số bộ test, mỗi bộ test ghi trên một dòng một số nguyên
cần kiểm tra.

Output
Kết quả in ra trên một dòng lần lượt là số chữ số lẻ và số chữ số chẵn, cách nhau một
khoảng trống.

Ví dụ

Input Output
2 2 2

1234 0 7

4444444

#include<stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){
long n,i;
scanf("%ld",&n);
long d=0,e=0;
while(n>0){
i=n%10;
n=n/10;
if(i%2==0) d++;
else e++;
}
printf("%ld %ld\n",e,d);
}
}
HÌNH CHỮ NHẬT DẤU *

Bài làm tốt nhất

Nhập vào kích thước chiều rộng, chiều cao và in ra hình chữ nhật các dấu * nhưng
rỗng bên trong. Các dấu * được in sát cạnh nhau.

Dữ liệu vào chỉ có 2 số nguyên dương là chiều rộng và chiều cao (không quá 40).

Ví dụ:

Input Output
5 4 *****

* *

* *

*****

#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++){
if(i==1 || i==n){
printf("*");
}
else {
if(j==1 || j==m){
printf("*");
}
else printf(" ");
}
}
printf("\n");
}
}
BỘI SỐ CHUNG - ƯỚC SỐ CHUNG

Bài làm tốt nhất

Tìm bội số chung nhỏ nhất và ước số chung lớn nhất của hai số nguyên dương a, b.

Input:

 Dòng đầu tiên đưa vào T là số lượng bộ test.


 T dòng tiếp theo mỗi dòng có một cặp số a, b.
 T, a, b thỏa mãn ràng buộc: 1≤T≤100; 1≤a, b≤10 ; 8

Output:

 Đưa ra kết quả mỗi test theo từng dòng.

Ví dụ:

Input Output
2 10 5

5 10 56 2

14 8

#include<stdio.h>
#include<math.h>
int main(){
int k,t;
scanf("%d",&t);
for(k=0;k<t;k++){
long long a,b,LCM;
scanf("%lld %lld",&a,&b);
long long d,GCD=b,m=a;
while(a%GCD!=0){
d=a%GCD;
a=GCD;
GCD=d;
}
LCM=m*b/GCD;
printf("%lld %lld",LCM,GCD);
printf("\n");
}
return 0;

SỐ KHÔNG GIẢM

Bài làm tốt nhất

Một số nguyên dương được gọi là số không giảm nếu các chữ số từ trái qua phải tạo
thành dãy không giảm. Ví dụ số số 123 là số không giảm, số 121 không phải.

Viết chương trình kiểm tra một số có phải số không giảm hay không.

Input

Dòng đầu ghi số bộ test, mỗi bộ test ghi một số nguyên dương không quá 18 chữ số

Output

Với mỗi bộ test, nếu đúng ghi ra YES, nếu sai ghi ra NO.

Ví dụ
Input Output
2 NO

1234567890676543 YES

11223334445555689

#include<stdio.h>
int main(){
int t;
scanf("%d\n",&t);
long long a;
while(t--){
scanf("%lld",&a);
int e=a%10;
int kt=0;
while(a>0){
int d=a%10;
if(d>e){
kt=1;
break;
}

e=d;
a/=10;
}
if(kt==0)printf("YES");
else printf("NO");
printf("\n");
}
}
SỐ CHẴN TRONG DÃY

Bài làm tốt nhất

Viết chương trình in ra các số chẵn trong một dãy số cho trước.

Input: Dòng đầu ghi số bộ test. Mỗi test gồm 2 dòng, dòng đầu ghi số N là số phần tử của
dãy. Dòng sau ghi N số của dãy. N không quá 100, các số trong dãy đều nguyên dương và
không quá 1000.

Output: Với mỗi bộ test ghi trên một dòng lần lượt là các số chẵn của dãy số ban đầu, theo
thứ tự xuất hiện.

Ví dụ :

Input Output
1 2 4

1 2 3 4 5
#include<stdio.h>
int main(){
int t;
scanf("%d\n",&t);

while(t--){
int n,i;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]%2==0){
printf("%d ",a[i]);
}
}
printf("\n");
}
}

SỐ NGUYÊN TỐ TRONG DÃY

Bài làm tốt nhất

Viết chương trình in ra các số nguyên tố trong một dãy số cho trước.
Input: Dòng đầu ghi số bộ test. Mỗi test gồm 2 dòng, dòng đầu ghi số N là số phần tử của
dãy. Dòng sau ghi N số của dãy. N không quá 100, các số trong dãy đều nguyên dương và
không quá 1000.

Output: Với mỗi bộ test ghi trên một dòng lần lượt là các số nguyên tố của dãy số ban đầu,
theo thứ tự xuất hiện.

Ví dụ :

Input Output
1 2 3 5

1 2 3 4 5
#include<stdio.h>
#include<math.h>
int snt(long a){
if(a<2) return 0;
else{

int kt=0;
for(long i=2;i<=sqrt(a);i++){
if(a%i==0){

kt=1;
break;
}
}
if(kt==1 ) return 0;
else return 1;

}
}
int main(){
int t;
scanf("%d\n",&t);

while(t--){
int n,i;
scanf("%d\n",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(snt(a[i])==1){
printf("%d ",a[i]);
}
}
printf("\n");
}
}
MẢNG ĐỐI XỨNG

Bài làm tốt nhất

Nhập một dãy số nguyên có n phần tử (n không quá 100, các phần tử trong dãy không quá
109). Hãy viết chương trình kiểm tra xem dãy có phải đối xứng hay không. Nếu đúng in ra
YES, nếu sai in ra NO.

Input: Dòng đầu ghi số bộ test, mỗi bộ test gồm hai dòng. Dòng đầu là số phần tử của dãy,
dòng sau ghi ra dãy đó, mỗi số cách nhau một khoảng trống.

Output: In ra kết quả kiểm tra.

Ví dụ:

Input Ouput
2 YES

4 NO

1 4 4 1

1 5 5 5 3

#include<stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,i,kt=0;
scanf("%d",&n);
long a[n];
for(i=0;i<n;i++){
scanf("%ld",&a[i]);
}

for(i=0;i<n/2;i++){
if(a[i]!=a[n-i-1]){
kt=1;
break;
}
}

if(kt!=0) printf("NO\n");
else printf("YES\n");
}

SỐ FIBONACCI

Bài làm tốt nhất

Dãy số Fibonacci được định nghĩa theo công thức như sau:

F1 = 1

F2 = 1

Fn = Fn-1 + Fn-2 với n>2

Viết chương trình tính số Fibonacci thứ n (với n không quá 92)

Input: Dòng đầu ghi số bộ test. Mỗi bộ test là một số nguyên n.

Output: Với mỗi bộ test, ghi ra số Fibonacci thứ n trên một dòng.

Ví dụ
Input Output
3 1

2 5

5 6765

20

#include <stdio.h>

long long Fibonacci(long long n)


{
long long a1 = 1, a2 = 1;
if(n==1||n==2)return 1;
long long i = 3;
long long a;
while (i <= n)
{
a = a1 + a2;
a1 = a2;
a2 = a;
i++;
}
return a;
}
int main()
{
long long t;
scanf ("%lld",&t);
while (t--)
{
long long n;
scanf("%lld", &n);
printf("%lld\n",Fibonacci(n));
}
}

SỐ LỚN NHẤT

Bài làm tốt nhất

Viết chương trình tìm số lớn nhất trong một dãy số cho trước.

Input: Dòng đầu ghi số bộ test. Mỗi test gồm 2 dòng, dòng đầu ghi số N là số phần tử của
dãy. Dòng sau ghi N số của dãy. N không quá 100, các số trong dãy đều nguyên dương và
không quá 1000.

Output: Với mỗi bộ test ghi trên hai dòng :

 Dòng thứ nhất là giá trị số lớn nhất


 Dòng thứ 2 lần lượt là các vị trí trong dãy có giá trị lớn nhất (chỉ số tính từ 0).

Ví dụ:

Input Output
1 9

7 26

3598429

#include<stdio.h>
int main(){
int t;
scanf("%d\n",&t);

while(t--){
int n,i;
scanf("%d\n",&n);
int a[n],m=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]>m) m=a[i];
}
printf("%d\n",m);
for(i=0;i<n;i++){
if(a[i]==m) printf("%d ",i);
}
printf("\n");
}
}

CHÈN MẢNG 2

Bài làm tốt nhất

Nhập 2 mảng (a, N) và (b, M) và số nguyên p (0≤p<M<=N<100). Hãy chèn mảng b vào vị trí
p của mảng a.

Input: Dòng đầu ghi số bộ test, mỗi bộ test gồm 3 dòng: dòng đầu ghi 3 số N,M,p. Dòng thứ
2 ghi N số của mảng a. Dòng thứ 3 ghi M số của mảng b.

Output: ghi ra thứ tự bộ test, rồi xuống dòng và dãy số kết quả sau khi chèn.

Ví dụ:

Input Output
1 Test 1:

431 5 2 9 11 3 6 7
5367

2 9 11

#include <stdio.h>
int main(){
int t,k;
scanf("%d",&t);
for(k=0;k<t;k++){

int m,n,i,j,x;
scanf("%d %d %d",&m,&n,&x);
int a[m],b[n];
for(i=0;i<m;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
scanf("%d",&b[i]);
}
printf("Test %d:\n",k+1);
for(i=0;i<x;i++){
printf("%d ",a[i]);
}
for(i=x;i<x+n;i++){
printf("%d ",b[i-x]);
}
for(i=x+n;i<m+n;i++){
printf("%d ",a[i-n]);
}

printf("\n");
}

You might also like