算法競賽入門【碼蹄集新手村600題】(MT1160-1180)C語言
- 目錄
- MT1161 N的零
- MT1162 數組最大公約數
- MT1163 孿生質數
- MT1164 最大數字
- MT1165 卡羅爾數
- MT1166 自守數
- MT1167自守數II
- MT1168 階乘數
- MT1169 平衡數
- MT1170 四葉玫瑰數
- MT1171 幻數
- MT1172 完美數字
- MT1173 魔數
- MT1174 A的B次方
- MT1175 網球比賽
- MT1176 兩個點的距離
- MT1177 三角形
- MT1178 點與線段的關系
- MT1179 線段與線段的關系
- MT1180 兩條線段
碼蹄集網站地址:https://www.matiji.net/exam/ojquestionlist
目錄
MT1161 N的零
(1)題目
輸入正整數N,將N的所有零轉換為5。沒有0就原樣輸出。不考慮不合理的輸入等特殊情況。
格式
輸入格式:
輸入正整數N輸出格式:
輸出整型
樣例1
輸入:
5002輸出:
5552
(2)參考代碼
#include<stdio.h>
#include<string.h>
int main()
{ char a[100];scanf("%s", &a);for (int i=0;i<strlen(a);i++){if (a[i] == '0'){a[i] = '5';}}printf("%s", a);return 0;
}
MT1162 數組最大公約數
(1)題目
給定一個由N個正整數組成的數組,求所有數組元素的最大公約數。
格式
輸入格式:
第一行輸入數組長度N,第二行輸入數組元素,整型,空格分隔。輸出格式:
輸出整型
樣例1
輸入格式:
3
2 4 6輸出格式:2
(2)參考代碼
#include<stdio.h>
int main()
{ int N;scanf("%d", &N);int a[N];for (int i=0;i<N;i++){scanf("%d", &a[i]);}int min = a[0], flag;for (int i=0;i<N;i++){if (min < a[i]){min = a[i];}}for (int i=min;i>=1;i--){flag = 1;for (int j=0;j<N;j++){if (a[j] % i != 0){flag = 0;break;}}if (flag == 1){printf("%d", i);break;}}return 0;
}
MT1163 孿生質數
(1)題目
在質數中,若兩個質數之差為2,我們稱之為孿生質數,例如(3、5)(5、7),輸入2個正整數,判斷他是不是孿生質數,輸出YES或者NO。
格式
輸入格式:
輸入整型輸出格式:
輸出YES或者NO
樣例1
輸入:
2 6輸出:
NO
(2)參考代碼
#include<stdio.h>
int main()
{int a, b;scanf("%d %d", &a, &b);if ((b - a == 2 || a - b == 2) && (a != 0 && b != 0) && (a != 1 && b != 1)){for (int i=2;i<a;i++){if (a % i == 0){printf("NO");return 0;}for (int i=2;i<b;i++){if (b % i == 0){printf("NO");return 0;}}}}else{printf("NO");return 0;}printf("YES");return 0;
}
MT1164 最大數字
(1)題目
輸入正整數N,找到小于或等于它的最大數字,并且其數字從高位到低位是非遞減的順序。
格式
輸入格式:輸入正整數N輸出格式:
輸出整型
樣例1
輸入格式:
200輸出格式:
199
(2)參考代碼
#include<stdio.h>
int main()
{ int n;scanf("%d", &n);int temp = n, min = temp % 10, flag = 1;while (temp){if (temp % 10 <= min){min = temp % 10;}else{flag = 0;}temp /= 10;}if (flag == 1){printf("%d", n);}else{for (int i=n;i>0;i--){temp = i;flag = 1;min = temp % 10;while (temp){if (temp % 10 <= min){min = temp % 10;}else{flag = 0;}temp /= 10;}if (flag == 1){printf("%d", i);break;}}}return 0;
}
MT1165 卡羅爾數
(1)題目
卡羅爾數是其值滿足4n-2 (n+1) -1的整數(n為正整數)。輸入正整數N判斷它是不是卡羅爾數,輸出YES或者NO。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入格式:
1輸出格式:
YES
(2)參考代碼
#include<stdio.h>
int main()
{ int N, num;scanf("%d", &N);for (int i=2;;i++){num = 2 * i - 3;if (num == N){printf("YES");break;}else if (num > N){printf("NO");break;}}return 0;
}
MT1166 自守數
(1)題目
輸入正整數N (N<10),判斷該數是否為自守數輸出YES或者NO。當且僅當一個數的平方以與該數相同的數字結尾時,該數稱為自守數。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入格式:5輸出格式:
YES
(2)參考代碼
#include<stdio.h>
int main()
{ int N, n, temp_N, temp_n;scanf("%d", &N);int temp = N, count = 0;n = N * N;while (temp){temp /= 10;count++;}for (int i=0;i<count;i++){temp_N = N % 10;temp_n = n % 10;if (temp_N != temp_n){printf("NO");return 0;}N /= 10;n /= 10;}printf("YES");return 0;
}
MT1167自守數II
(1)題目
輸入正整數N,檢查該數是否為自守數輸出YES或者NO。當且僅當一個數的平方以與該數相同的數字結尾時,該數稱為自守數。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
76輸出:
YES
(2)參考代碼
#include<stdio.h>
int main()
{ int N;scanf("%d", &N);int NN = N * N;while (N){if (N % 10 != NN % 10){printf("NO");return 0;}N = N / 10;NN = NN / 10;}printf("YES");return 0;
}
MT1168 階乘數
(1)題目
輸入正整數N,找出它是否是一個等于其他數的階乘值的數,輸出YES或者NO。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
5輸出:
NO
(2)參考代碼
#include<stdio.h>
int main()
{ int N, num = 1, i;scanf("%d", &N);// for (i=1;i<=N;i++)// {// num *= i;// if (num == N)// {// printf("YES");// return 0;// }// }for (i=1;i<=(N/2)+1;i++){num *= i;if (num == N){printf("YES");return 0;}}printf("NO");return 0;
}
MT1169 平衡數
(1)題目
輸入一個正整數,它有N位數,N是大于1的奇數,判斷它是不是平衡數。如果左側的所有數字和等于右側的所有數字之和,則稱為平衡數。不考慮不合理的輸入等特殊情況。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入格式:
1234006輸出格式:
YES
(2)參考代碼
#include<stdio.h>
int main()
{ int N;scanf("%d", &N);int temp = N, count = 0, sum1 = 0, sum2 = 0;while (temp){temp /= 10;count++;}if (count == 1){printf("YES");}else{for (int i=1;i<=count;i++){if (i < (count - 1) / 2 + 1){sum1 += N % 10;}else if (i > (count - 1) / 2 + 1){sum2 += N % 10;}N /= 10;}}if (sum1 == sum2){printf("YES");}else{printf("NO");}return 0;
}
MT1170 四葉玫瑰數
(1)題目
輸入正整數N,判斷它是不是一個四葉玫瑰數,輸出YES或者NO。四位玫瑰數是4位數的自冪數,它的每個位上的數字的4次冪之和等于它本身。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
1634輸出:
YES
(2)參考代碼
#include<stdio.h>
#include<math.h>
int main()
{ int N, sum = 0;scanf("%d", &N);int temp = N;while (temp){sum += pow((double)(temp % 10), 4.0);temp /= 10;}if (N == sum && (N >= 1000 && N <= 9999)){printf("YES");}else{printf("NO");}return 0;
}
MT1171 幻數
(1)題目
一個數字,把他的各位數累加會得到一個新的數字,再把這個新數字的每一位加起來,重復這個過程,直到只剩下一位數字,如果最后剩下的數字是1,就稱原數為一個幻數。輸入正整數N,檢查它是否是一個幻數,輸出YES或者NO。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
1234輸出:
YES
(2)參考代碼
#include<stdio.h>
int LeiJia(int num)
{int sum = 0;while (num){sum += num % 10;num /= 10;}return sum;
}
int main()
{ int N;scanf("%d", &N);while (N >= 10){N = LeiJia(N);}if (N == 1){printf("YES");}else{printf("NO");}return 0;
}
MT1172 完美數字
(1)題目
輸入正整數N,檢查它是否完美輸出YES或者NO。把一個數字的每一位拆分開,計算他們的階乘再累加,如果和等于原數字,則該數字是完美的。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
145輸出:
YES
(2)參考代碼
#include<stdio.h>
int main()
{ int N, i;scanf("%d", &N);int num, sum = 0, temp = N;while (temp){num = 1;for (i=1;i<=temp%10;i++){num *= i;}sum += num;temp /= 10;}if (sum == N){printf("YES");}else{printf("NO");}return 0;
}
MT1173 魔數
(1)題目
一個數字,把他乘以二,會得到一個新的數字,如果這個新數字依然由原數中那些數字組成,就稱原數為一個魔數。輸入正整數N,檢查它是否是一個魔數,輸出YES或者NO。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
142857輸出:
YES
(2)參考代碼
#include<stdio.h>
int main()
{ int N;scanf("%d", &N);int temp1, temp2 = N / 2, flag;while (temp2){temp1 = N;flag = 0;while (temp1){if (temp1 % 10 == temp2 % 10){flag = 1;}temp1 /= 10;}if (flag != 1){printf("NO");return 0;}temp2 /= 10;}printf("YES");return 0;
}
MT1174 A的B次方
(1)題目
輸入正整數N,判斷它是否可以表示為A的B次方,其中B>1,A>0,都是整數。輸出YES或者NO。
格式
輸入格式:
輸入正整數N輸出格式:
輸出YES或者NO
樣例1
輸入:
6輸出:
NO
(2)參考代碼
#include<stdio.h>
#include<math.h>
int main()
{int N, i, j;scanf("%d", &N);for (i = 1; i <= sqrt(N) + 1; i++){for (j = 2; j <= sqrt(N) + 1; j++){if (pow(i, j) == N){printf("YES");return 0;}}}printf("NO");return 0;
}
MT1175 網球比賽
(1)題目
兩個網球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三對賽手的名單。
格式
輸入格式:
無輸出格式:
分3行輸出,見樣例
樣例1
輸入格式:
無輸出格式:
a with z
b with x
c with y
(2)參考代碼
#include<stdio.h>
int main()
{ char a[2][3] = {{'a', 'b', 'c'}, {'x', 'y', 'z'}};for (int i=3;i<=3;i++){for (int j=1;i<=3;j++){for (int k=2;k<=2;k++){if (i != j && j != k && i != k){printf("%c with %c\n", a[0][0], a[1][i-1]);printf("%c with %c\n", a[0][1], a[1][j-1]);printf("%c with %c", a[0][2], a[1][k-1]);return 0;}}}}return 0;
}
MT1176 兩個點的距離
(1)題目
給定笛卡爾平面上兩個點的坐標,求它們之間的距離向上舍入為最接近的整數。
格式
輸入格式:
輸入整型,空格分隔輸出格式:
輸出整型
樣例1
輸入:
0 0 2 -2輸出:
3
(2)參考代碼
#include<stdio.h>
#include<math.h>
int main()
{ int x1, x2, y1, y2;scanf("%d %d %d %d", &x1, &y1, &x2, &y2);// printf("%.0lf\n", sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)));int sum = pow(x1 - x2, 2) + pow(y1 - y2, 2);int num = sqrt(sum);if (num * num == sum){printf("%d\n", num);}else{printf("%d\n", num + 1);}return 0;
}
MT1177 三角形
(1)題目
輸入三角形的三個頂點坐標,和點N的坐標。判斷N是否位于三角形內,輸出YES或者NO。
格式
輸入格式:
第一行輸入三角形的三個頂點坐標(x1,y1) , (x2,y2)和(x3,y3),第二行輸入點N的坐標,整型,空格分隔。輸出格式:輸出YES或者NO
樣例1
輸入格式:
0 0 20 0 10 30
10 15輸出格式:
YES
(2)參考代碼
#include<stdio.h>
#include<math.h>
int main()
{ int x1, y1, x2, y2, x3, y3;int xN, yN;scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3);scanf("%d %d", &xN, &yN);double S, S1, S2, S3;S = (double)(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2) * 0.5;S1 = (double)(x1*yN+xN*y3+x3*y1-x1*y3-xN*y1-x3*yN) * 0.5;S2 = (double)(xN*y2+x2*y3+x3*yN-xN*y3-x2*yN-x3*y2) * 0.5;S3 = (double)(x1*y2+x2*yN+xN*y1-x1*yN-x2*y1-xN*y2) * 0.5;if (S < 0 || S1 < 0 || S2 < 0 || S3 < 0){S = sqrt(S * S);S1 = sqrt(S1 * S1);S2 = sqrt(S2 * S2);S3 = sqrt(S3 * S3);}if (S < S1 + S2 + S3){printf("NO");}else if (S == S1 + S2 + S3){printf("YES");}return 0;
}
MT1178 點與線段的關系
(1)題目
輸入線段的2個端點的坐標值x和y,再輸入第3個點的坐標,判斷點在不在線段上,輸出YES或者NO。
格式
輸入格式:
按照先起點(x,y)再終點(x,y)的次序。第二行輸入第3個點的坐標。坐標整型。第一行兩點之間空格,如樣例所示。輸出格式:
輸出YES或者NO
樣例1
輸入:
(-20,20) (-20,-10)
(0,0) 輸出:
NO
(2)參考代碼
#include<stdio.h>
#include<math.h>
int main()
{ double x1, y1, x2, y2, a, b;scanf("(%lf,%lf) (%lf,%lf) \n (%lf,%lf)", &x1, &y1, &x2, &y2, &a, &b);double xy = sqrt(pow(x1 - x2, 2.0) + pow(y1 - y2, 2.0));double xy1 = sqrt(pow(x1 - a, 2.0) + pow(y1 - b, 2.0));double xy2 = sqrt(pow(x2 - a, 2.0) + pow(y2 - b, 2.0));if (xy1 + xy2 == xy){printf("YES");}else{printf("NO");}return 0;
}
MT1179 線段與線段的關系
(1)題目
輸入2個線段的端點的坐標值x和y,判斷兩條線是否為平行線。輸出YES或者NO。另:不考慮共線情況。
格式
輸入格式:輸入整型,空格分隔。按照先起點(x,y),空格,再終點(x,y)的次序。每行一個線段的信息。輸出格式:
輸出YES或者NO
樣例1
輸入格式:
(-20,20) (-20,-10)
(0,0) (5,0)輸出格式:
NO
(2)參考代碼
#include<stdio.h>
// #include<math.h>
int main()
{ int x1, y1, x2, y2;int x3, y3, x4, y4;scanf("(%d,%d) (%d,%d)\n", &x1, &y1, &x2, &y2);scanf("(%d,%d) (%d,%d)", &x3, &y3, &x4, &y4);// if ((x1 == x2 && x3 == x4) || (y1 == y2 && y3 == y4))// {// printf("YES");// return 0;// }// double tan1, tan2;// tan1 = sqrt(pow((double)(y2 - y1), 2.0)) / sqrt(pow((double)(x2 - x1), 2.0));// tan2 = sqrt(pow((double)(y4 - y3), 2.0)) / sqrt(pow((double)(x4 - x3), 2.0));// if (tan1 == tan2)// {// printf("YES");// }// else// {// printf("NO");// }if (x1 == x2 && x3 == x4 || y1 == y2 && y3 == y4){printf("YES");}else if ((y2 - y1) / (x2 - x1) == (y4 - y3) / (x4 - x3)){printf("YES");}else{printf("NO");}return 0;
}
MT1180 兩條線段
(1)題目
輸入2個線段的端點的坐標值x和y (x,y不重合),判斷兩條線段是否交叉,輸出YES或者NO。
格式
輸入格式:
輸入整型,空格分隔。按照先起點(x,y),空格,再終點(x,y))的次序。每行一個線段的信息。輸出格式:
輸出YES或者NO
樣例1
輸入格式:
(-20,20) (-20,-10)
(0,0) (5,0)輸出格式:NO
(2)參考代碼
//#include<stdio.h>
// int main()
// {
// int x1, y1, x2, y2;
// int x3, y3, x4, y4;
// scanf("(%d,%d) (%d,%d)/n", &x1, &y1, &x2, &y2);
// scanf("(%d,%d) (%d,%d)", &x3, &y3, &x4, &y4);
// if (x1 == x2 && x3 == x4 || y1 == y2 && y3 == y4)
// {
// printf("NO");
// }
// else if ((y2 - y1) / (x2 - x1) == (y4 - y3) / (x4 - x3))
// {
// printf("NO");
// }
// else
// {
// printf("YES");
// }
// return 0;
// }