2025年卓越工程师学院程序设计大赛题解
问题 A: 选择法排序
点击查看代码
#include<stdio.h>
int main()
{
int a[10];
int i, m, j, n;
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
for(j=0;j<9;j++)
{
for (n = 0; n < 9-j; n++)
if (a[n]>a[n +1])
{
m = a[n];
a[n] = a[n + 1];
a[n + 1] = m;
}
}
for (n = 0; n <= 9; n++)
printf("%d\n", a[n]);
return 0;
}
点击查看代码
#include<stdio.h>
#include<math.h>
int shu(int x);
int main()
{
int i, n,k=0;
scanf("%d", &n);
for (i = 100; i <= n; i++)
{
if (shu(i) && shu(i / 10) && shu(i / 100) && shu(i%10) && (shu(i % 100) && shu((i / 10) % 10) && i < 1000))
{
printf("%d\n", i);
k += 1;
}
if(shu(i) && shu(i / 10) && shu(i / 100) && shu(i%100) && (shu(i %1000) && shu((i/10)%100) && i >= 1000))
{
printf("%d\n", i);
k += 1;
}
}
if (k == 0) printf("No");
return 0;
}
int shu( int x)
{
int t;
if (x <2) return 0;
for (t = 2; t <= sqrt(x); t++)
if (x % t == 0) return 0;
return 1;
}
点击查看代码
#include<stdio.h>
#include<math.h>
int main()
{
int i, m, j,p;
scanf("%d", &m);
for (j = 2; j <= m; j++)
{
p = sqrt(j);
for (i = 2; i <=p; i++)
if (j % i == 0)
break;
if (p == i-1)
printf("%d\n", j);
}
return 0;
}
点击查看代码
#include<stdio.h>
#include<math.h>
long long gcd(long long x, long long y)
{
if (y == 0) return x;
return gcd(y, x % y);
}
long long m,n,ans;
int main(){
scanf("%lld %lld",&m,&n);
if(m==n) ans--;
n*=m;
for(long long i=1;i<=sqrt(n);i++){
if(n%i==0&&gcd(i,n/i)==m) ans+=2;
}
printf("%lld\n",ans);
return 0;
}
点击查看代码
#include<stdio.h>
int main()
{
int n,j,m,k,x,y;
scanf("%d", &n);
for (j = 1; j <= n; j++)
{
scanf("%d", &m);
for (k = 0;; k++)
{
for (x = 2; x < m-k; x++)
if ((m-k) % x == 0) break;
for (y = 2; y < m+k; y++)
if ((m+k) % y == 0) break;
if ((m - k) == x)
{
printf("%d\n", m - k);
break;
}
else if ((m + k) == y && (m - k) != x)
{
printf("%d\n", m + k);
break;
}
}
}
return 0;
}
点击查看代码
#include<stdio.h>
int n, dp[1005][1005], a[1005][1005];
int max(int x, int y) { return x > y ? x : y; }
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
scanf("%d", &a[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 0; j <= i + 1; j++)
dp[i][j] = -1e9;
dp[1][1] = a[1][1];
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i; j++)
dp[i][j] = max(dp[i - 1][j - 1] + a[i][j], dp[i - 1][j] + a[i][j]);
int rex = -1e9;
for (int i = 1; i <= n; i++) rex = max(rex, dp[n][i]);
printf("%d", rex);
return 0;
}
点击查看代码
#include<stdio.h>
int t, n;
int main()
{
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
printf("%d ", i * j);
printf("\n");
}
}
return 0;
}
点击查看代码
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
for (int case_num = 1; case_num <= n; case_num++) {
char A[201], B[201], C[402];
scanf("%s %s %s", A, B, C);
int lenA = strlen(A),lenB = strlen(B),lenC = strlen(C);
int dp[1005][1005];
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i <= lenA; i++)
if (A[i - 1] == C[i - 1])
dp[i][0] = dp[i - 1][0];
else
break;
for (int j = 1; j <= lenB; j++)
if (B[j - 1] == C[j - 1])
dp[0][j] = dp[0][j - 1];
else
break;
for (int i = 1; i <= lenA; i++) {
for (int j = 1; j <= lenB; j++) {
int k = i + j - 1;
if ((dp[i - 1][j] && A[i - 1] == C[k]) ||(dp[i][j - 1] && B[j - 1] == C[k]))
dp[i][j] = 1;
}
}
printf("Case %d: %s\n", case_num, (dp[lenA][lenB]) ? "yes" : "no");
}
return 0;
}
点击查看代码
#include<stdio.h>
long long n, k1;
long long shu[1005], tep[1005];
void gui(long long shu[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
gui(shu, l, mid);
gui(shu, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
if (shu[i] <= shu[j])
tep[k++] = shu[i++];
else
{
tep[k++] = shu[j++];
k1 += mid - i + 1;
}
while (i <= mid)
tep[k++] = shu[i++];
while (j <= r)
tep[k++] = shu[j++];
for (i = l, j = 0; i <= r; i++, j++)
shu[i] = tep[j];
}
int main()
{
while(1)
{
scanf("%d", &n);
if (n == 0) break;
for (int i = 0; i < n; i++)
scanf("%d", &shu[i]);
gui(shu, 0, n - 1);
printf("%d\n", k1);
k1 = 0;
}
return 0;
}
注:部分代码是我大一的时候写的,可能有更加简单的方法实现;部分是我用c++改写为c的可能会有点奇怪,但是全部都是可以通过的。

浙公网安备 33010602011771号