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

文章讲述了作者为参加蓝桥杯和电子设计大赛进行的C语言及算法训练,包括每日的基础题、趣味题和经典算法题。基础题涉及图形化编程,趣味题举例为寻找特定五位数,经典算法题涵盖最大公因数、最小公倍数和因式分解的实现。作者强调训练过程中的持续性和逐步提高。
摘要由CSDN通过智能技术生成

前言:

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

基础题:

【程序18】 题目:画图,学用rectangle画方形。

1.程序分析:
利用for循环控制100-999个数,每个数分解出个位,十位,百位。

2.程序源代码:

#include "graphics.h" 

main() 

{int x0,y0,y1,x1,driver,mode,i; 

driver=VGA;mode=VGAHI; 

initgraph(&driver,&mode,""); 

setbkcolor(YELLOW); 

x0=263;y0=263;y1=275;x1=275; 

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

{ 

setcolor(1); 

rectangle(x0,y0,x1,y1); 

x0=x0-5; 

y0=y0-5; 

x1=x1+5; 

y1=y1+5; 

} 

settextstyle(DEFAULT_FONT,HORIZ_DIR,2); 

outtextxy(150,40,"How beautiful it is!"); 

line(130,60,480,60); 

setcolor(2); 

circle(269,269,137); 

} 


趣味题:

18.有限5位数

个位数为6且能被3整除的五位数共有多少?

*问题分析与算法设计

根据题意可知,满足条件的五位数的选择范围是10006、10016。。。99996。可设基础数i=1000,通过计算i*10+6即可得到欲选的数(i的变化范围是1000~999),再判断该数能否被3整除。

*程序说明与注释
#include<stdio.h>
int main()
{
long int i;
int count=0; /*count:统计满足条件的五位数的个数*/
for(i=1000;i<9999;i++)
if(!((i*10+6)%3)) /*判断所选的数能否被3整除*/
count++; /*若满足条件则计数*/
printf("count=%d\n",count);
}

*运行结果
count=2999

*思考题

求100到1000之间有多少个其数字之和为5的整数。
(答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500)

经典算法题:

18.最大公因数、最小公倍数、因式分解

说明
最大公因数使用辗转相除法来求,最小公倍数则由这个公式来求:
GCD * LCM = 两数乘积
解法
最大公因数可以使用递回与非递回求解,因式分解基本上就是使用小于输入数的数值当作除数,去除以输入数值,如果可以整除就视为因数,要比较快的解法就是求出小于该数的所有质数,并试试看是不是可以整除,求质数的问题是另一个课题,请参考 Eratosthenes 筛选求质数。
实作(最大公因数、最小公倍数)

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int m, n, r; 
    int s;

    printf("输入两数:"); 
    scanf("%d %d", &m, &n); 
    s = m * n;

    while(n != 0) { 
        r = m % n; 
        m = n; 
        n = r; 
    } 

    printf("GCD:%d\n", m); 
    printf("LCM:%d\n", s/m); 

    return 0; 
} 

实作(因式分解)C(不用质数表)

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int i, n; 

    printf("请输入整数:"); 
    scanf("%d", &n); 
    printf("%d = ", n); 

    for(i = 2; i * i <= n;) { 
        if(n % i == 0) { 
            printf("%d * ", i); 
            n /= i; 
        } 
        else 
            i++; 
    } 

    printf("%d\n", n); 

    return 0; 
} 

C(使用质数表)

#include <stdio.h> 
#include <stdlib.h> 

#define N 1000 

int prime(int*);  // 求质数表 
void factor(int*, int);  // 求factor 

int main(void) { 
    int ptable[N+1] = {0}; 
    int count, i, temp; 

    count = prime(ptable); 

    printf("请输入一数:"); 
    scanf("%d", &temp); 
    factor(ptable, temp); 
    printf("\n"); 
    return 0; 
 } 

 int prime(int* pNum) { 
    int i, j; 
    int prime[N+1]; 
    for(i = 2; i <= N; i++) 
        prime[i] = 1; 

    for(i = 2; i*i <= N; i++) { 
        if(prime[i] == 1) { 
            for(j = 2*i; j <= N; j++) { 
                if(j % i == 0) 
                    prime[j] = 0; 
            } 
        } 
    } 

    for(i = 2, j = 0; i < N; i++) { 
        if(prime[i] == 1) 
            pNum[j++] = i; 
    } 
    return j; 
} 

void factor(int* table, int num) { 
    int i; 

    for(i = 0; table[i] * table[i] <= num;) { 
        if(num % table[i] == 0) { 
            printf("%d * ", table[i]); 
            num /= table[i]; 
        } 
        else 
            i++; 
    } 
    printf("%d\n", num); 
}

后续

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄黄在深夜里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值