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;
}
问题 B: 金蝉素数
点击查看代码
#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;
}
问题 C: 【提高】筛法求素数
点击查看代码
#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;
}
问题 D: 最大公约数和最小公倍数问题 (数论)
点击查看代码
#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;
}
问题 E: 素数的最短距离 (数论)
点击查看代码
#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;
}
问题 F: 数塔(简单动态规划)
点击查看代码
#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;
}
问题 G: 构建矩阵 (输入输出)
点击查看代码
#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;
}
问题 H: 单词游戏 (简单动态规划)
点击查看代码
#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;
}
问题 I: 计算逆序数 (归并排序的步骤数)
点击查看代码
#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的可能会有点奇怪,但是全部都是可以通过的。

posted @ 2025-06-17 21:32  这题太难了  阅读(18)  评论(0)    收藏  举报