数据结构与算法(程序设计能力评估)

本文介绍了四个编程题目,涉及等差数列求和、素数对查找、数组元素循环右移以及大数乘法模拟。通过C语言实现,分别探讨了数列计算、循环与函数应用、数组操作技巧及大数运算的模拟方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0-1打印沙漏

这道题主要考察等差数列求和问题

思路:先求出上半三角一共有多少行,再根据等差数列求出最大行星星个数
从上到下遍历每一行,求出每一行星星个数。
输出时,空格个数=(最大行星星个数 - 该行星星个数)/2 (因为后面1/2空格不用输出)

代码如下:

#include <stdio.h>
// #include <cmath>
// using namespace std;
int main()
{
    int num;
    int row, rt, rm;
    char symbol;
    
    scanf("%d %c",&num,&symbol);
    for(int i=0; i<501; i++)
    {
        if(i*i*2-1<=num && (i+1)*(i+1)*2-1>num)
        {
            row = i;
            break;
        }
    }
    rm = 2*row-1;
    for(int i=row-1; i>-row; i--)
    {
        if(i<0)
        {
            rt = (-i+1)*2-1;
        }
        else rt = (i+1)*2-1;
    for(int j=0; j<(rm-rt)/2; j++)printf(" ");
    for(int k=0; k<rt; k++)
        {
            printf("%c",symbol);
        }
        printf("\n");
    }
    printf("%d", num-(row*row*2-1));

  return 0;
}

0-2 素数对猜想

本道题考察循环和函数

思路:先写个判断素数的函数,再通过主函数遍历时调用,总体较为简单
PS:不要用数组,不仅会超限,而且蠢(XH看到这里你是不是含羞了)
代码如下:

#include<stdio.h>
#include<math.h>
int C[10010];
int IsPrime(int num)
{
    int i;
    int flag=1;
    for(i=2;i<=sqrt(num);i++)
    {
        if(num%i==0)flag=0;
    }
    return flag;
}
int main()
{
    int N;
    int cnt=0;
    scanf("%d",&N);
    for(int i=5;i<=N;i++)
    {
        if(IsPrime(i) && IsPrime(i-2))cnt++;
    }
    printf("%d", cnt);
    return 0;
}

0-3 数组元素循环右移问题

本题考查数组

思路:由于不让用两个数组,所以把数组先移动到后面,再把【n,n+num-1】的数组元素和【1,num-1】交换一下即可
要注意num>n的情况

代码如下:

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


int mov[210];

int main(){
	int n,num,temp;
	scanf("%d %d",&n,&num);
	num=num%n;
	for(int i=0;i<n;i++){
		scanf("%d",&mov[i]);
	}
    for(int i=n-1;i>=0;i--){
    	mov[i+num]=mov[i];
	}

	for(int j=n;j<=n+num-1;j++){
		temp=mov[j];
		mov[j]=mov[j-n];
		mov[j-n]=temp;
	}
	for(int i=0;i<n-1;i++)  printf("%d ",mov[i]);
	printf("%d",mov[n-1]);
	return 0;
}

0-4 Have Fun with Numbers

本题考查模拟

思路:由于C不支持大数运算,所以用字符数组模拟大数。
按照乘法模拟即可,注意进位

代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAXN 25

int a[10], b[10], N[MAXN], M[MAXN], len;
char tmp, str[MAXN];

int output(int flag,int M[MAXN])
{
    if(flag)printf("Yes\n");
	else printf("No\n");
	if(M[0] > 0)printf("%d", M[0]);
	for(int i = 1; i < len+1; i++)printf("%d", M[i]);
}

int main()
{
	scanf("%s", str);
	len = strlen(str);
	for(int i = 0; i < len; i++)N[i] = str[i] - '0';
	for(int j = 0; j < len; j++)a[N[j]]++;
	int carry = 0;
	for(int j = len-1; j>=0; j--)
	{
		M[j+1] = carry + N[j]*2 % 10;
		carry = N[j]*2 / 10;
	}
	M[0] = carry;

	int flag = 1;
	if(M[0] > 0)flag = 0;
	else
	{
		for(int j = 1; j < len+1; j++)b[M[j]]++;
		for(int i = 0; i < 10; i++)
		{
			if(a[i] != b[i])
			{
				flag = 0;
				break;
			}
		}
	}
    output(flag,M);
	return 0;
 }


0-5 Shuffling Machine

本题考查数组和模拟

思路:开三个数组模拟洗牌即可,大家可以试试用不同花色取模实现输出
(我比较懒就没有试)

代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAXN 25
//using namespace std;


char *card_color[55]={"","S1","S2","S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13"
                        ,"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13"
                         ,"C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13"
                          ,"D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13"
                          ,"J1","J2"};
int N;
int order[55],previous_order[55],set_order[55];
int main()
{
	scanf("%d", &N);
	for(int i=1;i<=54;i++)
    {
        scanf("%d",&set_order[i]);
        previous_order[i] = i;
    }
	for(int step=1;step<=N;step++)
    {
        for(int i=1;i<=54;i++)
        {
            order[set_order[i]] = previous_order[i];
        }
         for(int i=1;i<=54;i++)
        {
            previous_order[i] = order[i];
        }
    }
    for(int i=1;i<=54;i++)
    {
        if(i!=1)printf(" ");
        printf(card_color[order[i]]);
    }

	return 0;
 }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值