C/C++语言基础进阶算法备赛面试 经典、实用、趣味 程序设计编程300例精解每日一练第42天

文章介绍了作者为参加蓝桥杯和电子设计大赛进行的C语言及算法训练,包括每日基础题、趣味题和经典算法题。基础题涉及创建链表,趣味题展示了求最大公约数和最小公倍数的程序,经典算法题则讲解了使用卫兵优化的循序搜寻法。作者强调这种训练方式适合有一定基础并希望提升的同学,并鼓励持续练习。

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

前言:

备赛蓝桥杯,大学电子设计大赛,C语言提高,算法准备,定位大厂刷题,所以每天一练,不是很适合新手,适合长期规划有一定基础的同学跟上,每日文档由三部分组成,基础题(适合备赛国二),趣味题(适合有兴趣的同学),经典算法题(适合更高要求)组成。当然本意是记录自己训练的过程,基础题基本能做出来,能给自己一个正面回馈,趣味题可以培养兴趣,经典算法题用于真正来训练自己,开眼见长见识,在遇到困难的问题有更好的解决办法,最关键是每天三个题充分利用了零碎时间,细水才能长流,共勉坚持!!!!

基础题:

题目:创建一个链表。

1.程序分析:

2.程序源代码:

/*creat a list*/ 

#include "stdlib.h" 

#include "stdio.h" 

struct list 

{ int data; 

struct list *next; 

}; 

typedef struct list node; 

typedef node *link; 

void main() 

{ link ptr,head; 

int num,i; 

ptr=(link)malloc(sizeof(node)); 

ptr=head; 

printf("please input 5 numbers==>\n"); 

for(i=0;i<=4;i++) 

{ 

 scanf("%d",&num); 

 ptr->data=num; 

 ptr->next=(link)malloc(sizeof(node)); 

 if(i==4) ptr->next=NULL; 

 else ptr=ptr->next; 

} 

ptr=head; 

while(ptr!=NULL) 

{ printf("The value is ==>%d\n",ptr->data); 

 ptr=ptr->next; 

} 

} 

趣味题:

42.最大公约数和最小公倍数

求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM)

*问题分析与算法设计

手工方式求两个正整数的蝚大公约数的方法是用辗转相除法,在程序中可以模拟这种方式。

*程序说明与注释
#include<stdio.h>
int main()
{
int a,b,num1,num2,temp;
printf("Input a & b:");
scanf("%d%d",&num1,&num2);
if(num1>num2) /*找出两个数中的较大值*/
{
temp=num1; num1=num2; num2=temp; /*交换两个整数*/
}
a=num1; b=num2;
while(b!=0) /*采用辗转相除法求最大公约数*/
{
temp=a%b;
a=b;
b=temp;
}
printf("The GCD of %d and %d is: %d\n",num1,num2,a); /*输出最大公约数*/
printf("The LCM of them is: %d\n",num1*num2/a); /*输出最小公倍数*/
}

*运行结果
1.Input a & b: 20 55
The GCD of 20 and 55 is: 5
The LCM of them is: 220
2.Input a & b: 17 71
The GCD of 17 and 71 is: 1
The LCM of them is: 1207
3.Input a & b: 24 88
The GCD of 24 and 88 is: 8
The LCM of them is: 264
4.Input a & b: 35 85
The GCD of 35 and 85 is: 5
The LCM of them is: 595

*思考题

求一个最小的正整数,这个正整数被任意n(2<=n<=10)除都是除不尽的,而且余数总是(n-1)。例如:被9除时的余数为8。要求设计一个算法,不允许枚举与除2、除3、….、除9、除10有关的命令,求出这个正整数。

经典算法题:

42.循序搜寻法(使用卫兵)

说明
搜寻的目的,是在「已排序的资料」中寻找指定的资料,而当中循序搜寻是最基本的搜寻法,只要从资料开头寻找到最后,看看是否找到资料即可。
解法
初学者看到循序搜寻,多数都会使用以下的方式来进行搜寻:
while(i < MAX) {
if(number[i] == k) {
printf(“找到指定值”);
break;
}
i++;
}

这个方法基本上没有错,但是可以加以改善,可以利用设定卫兵的方式,省去if判断式,卫兵通常设定在数列最后或是最前方,假设设定在列前方好了(索引0的 位置),我们从数列后方向前找,如果找到指定的资料时,其索引值不是0,表示在数列走访完之前就找到了,在程式的撰写上,只要使用一个while回圈就可 以了。

下面的程式为了配合卫兵的设置,自行使用快速排序法先将产生的数列排序,然后才进行搜寻,若只是数字的话,通常您可以使用程式语言函式库所提供的搜寻函式。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define MAX 10 
#define SWAP(x,y) {int t; t = x; x = y; y = t;} 

int search(int[]); 
int partition(int[], int, int); 
void quicksort(int[], int, int); 

int main(void) { 
    int number[MAX+1] = {0}; 
    int i, find; 

    srand(time(NULL)); 

    for(i = 1; i <= MAX; i++) 
        number[i] = rand() % 100; 

    quicksort(number, 1, MAX); 

    printf("数列:"); 
    for(i = 1; i <= MAX; i++) 
        printf("%d ", number[i]); 
    
    printf("\n输入搜寻值:"); 
    scanf("%d", &number[0]); 

    if(find = search(number)) 
        printf("\n找到数值于索引 %d ", find); 
    else 
        printf("\n找不到数值"); 

    printf("\n"); 

    return 0; 
} 

int search(int number[]) { 
    int i, k; 
    
    k = number[0]; 
    i = MAX; 
    
    while(number[i] != k) 
        i--; 

    return i; 
} 

int partition(int number[], int left, int right) { 
    int i, j, s; 

    s = number[right]; 
    i = left - 1; 

    for(j = left; j < right; j++) { 
        if(number[j] <= s) { 
            i++; 
            SWAP(number[i], number[j]); 
        } 
    } 

    SWAP(number[i+1], number[right]); 
    return i+1; 
} 

void quicksort(int number[], int left, int right) { 
    int q; 

    if(left < right) { 
        q = partition(number, left, right); 
        quicksort(number, left, q-1); 
        quicksort(number, q+1, right); 
    } 
} 

后续

有更优秀的解法和更优秀的训练题评论区留言,多交流!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄黄在深夜里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值