Professional Documents
Culture Documents
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ố.
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;
}
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:
#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");
}
}
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:
#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;
}
}
}
for(i=0;i<n;i++){
b[a[i]]=0;
}
printf("\n");
}
}
Input: Dòng đầu tiên ghi số bộ test. Mỗi bộ test có hai dòng:
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Ị
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ả
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");
}
}
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");
}
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ự.
Ví dụ:
Input Output
2 5
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
Input:
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
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(kt==1 ) printf("YES");
printf("\n");
}
}
SỐ ĐẸP 3
Input:
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Ừ
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:
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]);
}
}
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);
}
}
Input
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
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Ố
Input
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Ố
Input
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");
}
}
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
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
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
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
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
Input
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)
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
Input
Output
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
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
#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");
}
}
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
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
Input
Output
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Ẻ
Input
Output
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
Input
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)));
}
}
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
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Ố
Input:
Output:
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
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
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
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
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
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
Viết chương trình kiểm tra số đẹp theo tiêu chí trên.
Input
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
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.
Input:
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");
}
}
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:
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
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:
Output:
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 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
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
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");
}
}
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
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);
}
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
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
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
Output
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
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
Output
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
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
Output
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
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
Output
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
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
Output
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
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
Output
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
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
Output
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
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
Output
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");
}
}
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]);
}
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]);
}
}
}
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á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");
}
}
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:
Output:
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
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
Output
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
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
Output
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
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
Output
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");
}
}
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");
}
}
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");
}
}
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");
}
}
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:
Output:
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++){
}
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
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ứ 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
Đị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:
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");
}
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
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;
}
}
}
}
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");
}
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:
Output:
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);
}
}
Cho số nguyên dương N. Hãy đưa ra ước số nguyên tố lớn nhất của N.
Input:
Output:
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);
}
}
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:
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Ố
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:
Output:
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
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)
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
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).
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);
}
}
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");
}
}
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++;
}
}
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
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");
}
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
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
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).
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Ố
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
Kết quả
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");
}
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++;
}
}
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++;
}
}
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 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
Kết quả
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ố 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
Kết quả
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");
}
}
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:
Ví dụ:
Input Output
4 Quang Vinh, NGUYEN
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");
}
}
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
ab abc
#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");
}
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++;
}
}
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");
}
}
}
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");
}
}
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.
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 ĐỦ
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
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
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
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
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ả
Ví dụ
Input Output
7 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Ế
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
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
#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Ố
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:
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:
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++;
}
}
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
16400
17699
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);
}
}
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);
}
}
}
Hãy sắp xếp danh sách thí sinh theo tổng điểm giảm dần.
Input:
Dòng đầu chứa số thí sinh. Mỗi thí sinh viết trên 3 dòng:
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
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
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;
}
}
Input:
Output:
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);
}
}
Input:
Output:
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);
}
}
1. thêm mới
3. hiển thị danh sách sinh viên theo tổng điểm tăng dần
Input:
+ 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
- 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
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
1. thêm mới
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:
+ 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
Output:
- 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
#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){
CHIA HẾT
Input
Output
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Ố
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>
if( ktcsnt(i)==1 ){
if( kttongsnt(i)==1){
if(snt(i)==1){
d++;
}
}
}
}
printf("%ld\n",d);
}
return 0;
}
GHÉP HÌNH
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 printf("NO");
}
LIỆT KÊ VÀ ĐẾM
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
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
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)
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);
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);
}
}
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
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:
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;
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++;
}
}
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);
}
}
Dữ liệu vào
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
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
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>
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;
}
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ả:
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
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:
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");
}
}
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
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Input:
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");
}
}
Input:
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");
}
}
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:
Ví dụ:
Input Output
4 vinhnq@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
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 ĐỦ
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.
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
Input:
Mỗi test gồm số nguyên M (M ≤ 9) là số lượng các từ, theo sau là M xâu.
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
3 a bb cc afsiasfasfiasfiokj
#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ướ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Ã
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ã.
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
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
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
#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Ố
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:
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);
}
}
Input:
Output:
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);
}
}
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:
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
Input:
Output:
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
Input:
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.
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Ư
Input:
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)
Input
Output
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
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:
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
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
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
Output
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);
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:
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;
Input:
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.
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Ẻ
Input:
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ẻ.
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;
}
}
Input:
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
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
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++){
TÍNH TỔNG
Input Output
10 2 12
#include<stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d",a+b);
}
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);
}
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);
}
Input Output
24 75.20
#include<stdio.h>
int main(){
float k,c;
scanf("%f",&c);
k=(c * 9 / 5) + 32;
printf("%.2f",k);
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);
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);
}
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
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Ố
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);
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);
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
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Ố
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
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");
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);
}
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");
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);
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);
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");
}
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]);
}
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");
}
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");
}
}
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");
}
}
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{
}
HÌNH BÌNH HÀNH NGƯỢC
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");
}
for(int j=1;j<=m;j++){
if(i==1 || i==n) printf("*");
else{
if(j==1 || j==m) printf("*");
else printf(".");
}
}
printf("\n");
}
}
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");
}
}
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");
}
}
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");
}
}
}
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");
}
}
}
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");
}
}
}
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");
}
}
}
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);
}
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");
}
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
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]);
}
}
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Ẻ
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
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
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
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);
}
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]);
}
}
}
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
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
Output
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
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:
Output:
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Ự
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:
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);
}
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
Output
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
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
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");
}
}
}
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
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
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
Output
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
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
Output
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");
}
}
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
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");
}
}
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
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");
}
Input:
Output:
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]);
}
}
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:
Output:
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Ố
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
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
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
Output
Ví dụ
Input Output
23 46
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d",a*2);
GẤP ĐÔI 2
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í 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
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í 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);
}
}
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
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.
Input
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Ẻ
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
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");
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í 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
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ố.
Input
Ouput
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");
}
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
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
Dữ liệu vào:
Kết quả:
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
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
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");
}
}
Input
Dữ liệu vào chỉ có 1 dòng ghi số N không quá 6 chữ số.
Output
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;
}
Input
Output
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
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
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
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
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
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");
}}
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");
}
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Ố
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
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");
}
}
}
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
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);
}
}
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
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;
}
}
}
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
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)
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");
}
}
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
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.
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");
}
}
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
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
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");
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
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 *
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
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:
Output:
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
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
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");
}
}
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
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.
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
Dãy số Fibonacci được định nghĩa theo công thức như sau:
F1 = 1
F2 = 1
Viết chương trình tính số Fibonacci thứ n (với n không quá 92)
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>
SỐ LỚN 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.
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
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");
}