【算法笔记题解】《算法笔记知识点记录》第二章——快速入门2[选择结构、循环结构和数组]

请添加图片描述
今天是我开坑的第二天,今天显得有计划了很多。c/c++估计得过两天左右。我保持一天一万字左右的更新量,如果喜欢大家还希望给个收藏点赞呀0.0

相关知识点大家没基础的还是要看一下的,链接:《算法笔记知识点记录》第二章——快速入门2[选择结构、循环结构和数组]

🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
📔源码地址:https://gitee.com/xingleigao/algorithm-notes
全文大约阅读时间: 30min



🍕2.3选择结构

地址合集:2.3选择结构

问题 A: 例题4-1 一元二次方程求根

题目描述

求一元二次方程ax2+bx+c=0的根,三个系数a, b, c由键盘输入,且a不能为0,但不保证b2-4ac>0。
程序中所涉及的变量均为double类型。

输入

以空格分隔的一元二次方程的三个系数,双精度double类型

输出

分行输出两个根如下(注意末尾的换行):
r1=第一个根
r2=第二个根
结果输出时,宽度占7位,其中小数部分2位。
如果方程无实根,输出一行如下信息(注意末尾的换行):
No real roots!

样例输入

1 2 3

样例输出

1 2 3

解题思路

判断判别式的值 然后选择不同分支就好了。

#include<stdio.h>
int main(){
    double a, b, c;
    scanf("%lf%lf%lf", &a, &b, &c);
    double temp = b * b - 4 * a * c;
    if(temp < 0)  printf("No real roots!\n");
    else printf("r1=%7.2f\nf2=%7.2f\n",(-b + temp)/(2 * a),(-b - temp)/(2 * a));
    return 0;
}

问题 B: 例题4-2 比较交换实数值

题目描述

从键盘输入2个实数,按照代数值由小到大的顺序输出这两个数。

输入

从键盘输入2个实数,按照代数值由小到大的顺序输出这两个数。

输出

从小到大输出这两个实数,中间以空格来分隔,小数在前,大数在后。
小数点后保留2位小数。
末尾输出换行符。

样例输入

3.6 -2.3

样例输出

-2.30 3.60

解题思路

如果a>b就交换就好了。

#include<stdio.h>
int main(){
    double a, b;
    scanf("%lf%lf", &a, &b);
    if(a > b){
        double temp = a;
        a = b;
        b = temp;
    }
    printf("%.2f %.2f\n", a, b);
    return 0;
}

问题 C: 例题4-3 比较交换3个实数值,并按序输出

题目描述

从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。
末尾输出换行。

输入

输入以空格分隔的三个实数

输出

按照从小到大的顺序输出这三个实数,中间以空格分隔,最小值在前,最大值在后。小数点后保留2位小数。
注意末尾的换行。

样例输入

3 7 1

样例输出

1.00 3.00 7.00

解题思路

其实进行三次上面的那个程序就好了。

#include<stdio.h>
int main(){
    double a, b, c;
    scanf("%lf%lf%lf", &a, &b,&c);
    if(a > b){
        double temp = a;
        a = b;
        b = temp;
    }
    if(b > c){
        double temp = c;
        c = b;
        b = temp;
    }
    if(a > b){
        double temp = a;
        a = b;
        b = temp;
    }
    printf("%.2f %.2f %.2f\n", a, b, c);
    return 0;
}

问题 D: 习题4-4 三个整数求最大值

题目描述

有3个整数a, b, c,由键盘输入,输出其中最大的数。

输入

以空格分割的三个整数。

输出

三个数中的最大值,末尾换行。

样例输入

1 3 2

样例输出

3

解题思路

用上面的思路把c弄成最大就好了,但是这里也不用交换 只要保证c最大就好了。

#include<stdio.h>
int main(){
    int a, b, c;
    scanf("%d%d%d",&a,&b,&c);
    if(a > b)   b = a;
    if(b > c)   c = b;
    printf("%d\n",c);
    return 0;
}

问题 E: 习题4-10-1 奖金计算

题目描述

某企业发放的奖金根据利润提成。利润I低于或等于100000时,奖金可提10%;利润高于100000元,低于200000元(100000<I<=200000)时,低于100000元的部分仍按10%提成,高于100000元的部分提成比例为7.5%;200000<I<=400000时,低于200000元的部分仍按上述方法提成(下同),高于200000元的部分按5%提成;400000<I<=600000元时,高于400000元的部分按3%提成;600000<I<=1000000时,高于600000元的部分按1.5%提成;I>1000000元时,超过1000000元的部分按1%提成。
从键盘输出当月利润I,求应发奖金数,奖金精确到分。
要求用if语句实现。

输入

企业利润,小数,双精度double类型

输出

应发奖金数,保留2位小数,末尾换行。

样例输入

1050

样例输出

105.00

解题思路

除了费劲其实也都还好。

#include<stdio.h>
int main(){
    double lirun, ans = 0;
    scanf("%lf",&lirun);
    if(lirun <= 100000)    ans = lirun * 0.1;
    else if(lirun <= 200000)    ans = 10000 + (lirun - 100000) * 0.075;
    else if(lirun <= 400000)    ans = 10000 + (200000 - 100000) * 0.075 + (lirun - 200000) * 0.05;
    else if(lirun <= 600000)    ans = 10000 + (200000 - 100000) * 0.075 + (400000 - 200000) * 0.05 + (lirun - 400000) * 0.03;
    else if(lirun <= 1000000)   ans = 10000 + (200000 - 100000) * 0.075 + (400000 - 200000) * 0.05 + (600000 - 400000) * 0.03 + (lirun - 600000) * 0.015;
    else                        ans = 10000 + (200000 - 100000) * 0.075 + (400000 - 200000) * 0.05 + (600000 - 400000) * 0.03 + (1000000 - 600000) * 0.015 + (lirun - 1000000) * 0.01;
    printf("%.2f\n",ans);
    return 0;
}

🍔2.4 选择结构

地址合集:2.4循环结构

问题 A: 例题5-1-1 连续自然数求和

题目描述
求1+2+3+…+100
要求用while语句实现

输入

输出

要求的和,末尾输出换行。

样例输入

样例输出

5050

解题思路

让咋咋呗。

#include<stdio.h>
int main(){
    int i = 1, sum = 0;
    while(i <= 100){
        sum += i;
        i++;
    }
    printf("%d\n",sum);
    return 0;
}

问题 B: 例题5-1-2 连续自然数求和

题目描述
求1+2+3+…+100
要求用do…while语句实现

输入

输出

计算结果,注意末尾输出换行。

样例输入

样例输出

5050

解题思路

让咋咋呗。while后面的;别丢了

#include<stdio.h>
int main(){
    int i = 1, sum = 0;
    do{
        sum += i;
        i++;
    }while(i<=100);
    printf("%d\n",sum);
    return 0;
}

问题 C: 例题5-1-3 连续自然数求和

题目描述
求1+2+3+…+100
要求用for语句实现

输入

输出

计算结果,注意末尾输出换行。

样例输入

样例输出

5050

解题思路

让咋咋呗。有没有感觉for很好用?

#include<stdio.h>
int main(){
    int sum = 0;
    for(int i = 1;i <= 100; ++i)
        sum += i;
    printf("%d\n",sum);
    return 0;
}

问题 D: 例题5-1-4 连续自然数求和

题目描述
求1+2+3+…+100
要求在程序中使用break语句。

输入

要求输入的数据一定是一个正整数。

输出

计算的结果,连续N个自然数的和,末尾输出换行。

样例输入

100

样例输出

5050

解题思路

让咋咋呗。这里就是先判断i值再++的,所以等于N就可以跳出了。

#include<stdio.h>
int main(){
    int sum = 0,N;
    scanf("%d",&N);
    for(int i = 1;; ++i){
        sum += i;
        if(i == N)  break;
    }
    printf("%d\n",sum);
    return 0;
}

问题 E: 例题5-1-5 连续自然数求和

题目描述
编程实现求1+2+3+…和的程序,要求得到使使和数大于1000的最小正整数。

输入

输出

输出使1+2+3+…+N>1000的最小正整数N,末尾输出换行。

样例输入

样例输出

45

解题思路

让咋咋呗。

#include<stdio.h>
int main(){
    int sum = 0,i = 1;
    for(i = 1;; ++i){
        sum += i;
        if(sum > 1000) break;
    }
    printf("%d\n",i);
    return 0;
}

问题 F: 例题5-6 矩阵输出

题目描述
输出以下4*5的矩阵
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
要求使用循环实现,注意每行输出5个数字,每个数字占3个字符的宽度,右对齐。

输入

输出

每行输出5个数字,每个数字占3个字符的宽度,右对齐。

样例输入

样例输出

1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20

解题思路

让咋咋呗。

#include<stdio.h>
int main(){
    for(int i = 1;i < 6;++i)    printf("%3d",i);
    puts("");   //输出换行
    for(int i = 2;i < 11;i+=2)    printf("%3d",i);
    puts("");   //输出换行
    for(int i = 3;i < 16;i+=3)    printf("%3d",i);
    puts("");   //输出换行
    for(int i = 4;i < 21;i+=4)    printf("%3d",i);
    puts("");   //输出换行
    return 0;
}

问题 G: 例题5-7 求圆周率pi的近似值

题目描述
用如下公式
在这里插入图片描述
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
要求输出的结果总宽度占10位,其中小数部分为8位。
程序中使用浮点型数据时,请定义为双精度double类型。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).

输入

输出

PI=圆周率的近似值
输出的结果总宽度占10位,其中小数部分为8位。
末尾输出换行。

样例输入

样例输出

PI=3.14159065

解题思路

让咋咋呗。不过浮点数不让我比较大小,只能做差来比较了!!

#include<stdio.h>
int main(){
    double pi = 1;
    for(int i = 1;(1.0/(2*i + 1)) - 1e-6 > 0;i++){
        if(i % 2 == 1)  pi -= 1.0/(2*i + 1);
        else pi += 1.0/(2*i + 1);
    }
    printf("PI=%10.8f\n",4 * pi);
    return 0;
}

问题 H: 例题5-8 Fibonacci数列

题目描述
输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
在这里插入图片描述
要求输入的正整数n不超过50.

输入

一个不超过50的正整数

输出

Fibonacci数列的第n个数,末尾输出换行。

样例输入

20

样例输出

6765

解题思路

我仔细想了想,还是用数组把。函数也还没学是吧?之后再用递归。这里想想。还能压缩空间,我好可怕。。。不懂可以问我

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    if(n <= 2){
        printf("%d\n",1);
        return 0;
    }
    int a = 1, b = 1;
    for(int i = 2;i < n;i++){
        int c = a + b;
        a = b;
        b = c;
    }
    printf("%d\n",b);
    return 0;
}

问题 I: 习题5-10 分数序列求和

题目描述
有如下分数序列
在这里插入图片描述
求出次数列的前20项之和。
请将结果的数据类型定义为double类型。

输入

输出

小数点后保留6位小数,末尾输出换行。

样例输入

样例输出

32.660261

解题思路

这个东东好像分子就是上一个分子的和,分母就是上一个分子?这不就是斐波拉西数列嘛?刚才的思路变成分数求和就好了0.0

#include<stdio.h>
int main(){
    double ans = 0;
    double a = 1.0, b = 2.0;
    for(int i = 0;i < 20; i++){
        ans += b / a;
        double c = a + b;
        a = b;
        b = c;
    }
    printf("%.6f\n",ans);
    return 0;
}

🍟2.5 数组

地址合集:2.5数组

问题 A: 习题6-4 有序插入

题目描述
有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。

输入

有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。

输出

从小到大输出这10个数,每个数一行。

样例输入

1 11 21 31 41 51 61 71 81
45

样例输出

1
11
21
31
41
45
51
61
71
81

解题思路

让咋咋呗。后移是为了给插入元素腾出来位置。

#include<stdio.h>
int main(){
    int a[10], i;
    for(i = 0;i < 9;++i)
        scanf("%d",&a[i]);//读入元素
    int c;
    scanf("%d",&c);
    for(i = 8;i && a[i] > c;--i){
        a[i + 1] = a[i];    //后移
    }
    a[i+1] = c;
    for(i = 0;i < 10;i++)
        printf("%d\n",a[i]);
    return 0;
}

问题 B: 习题6-5 数组元素逆置

题目描述
将一个长度为10的整型数组中的值按逆序重新存放。
如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1

输入

从键盘上输入以空格分隔的10个整数。

输出

按相反的顺序输出这10个数,每个数占一行。

样例输入

1 2 3 4 5 6 7 8 9 0

样例输出

0
9
8
7
6
5
4
3
2
1

解题思路

倒序输出就好了啊

#include<stdio.h>
int main(){
    int a[10];
    for(int i = 0;i < 10;++i)
        scanf("%d",&a[i]);//读入元素
    for(int i = 9;i >= 0;--i)
        printf("%d\n",a[i]);
    return 0;
}

问题 C: 习题6-6 杨辉三角

按要求输入如下格式的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多输出10层

输入

输入只包含一个正整数n,表示将要输出的杨辉三角的层数。

输出

对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开

样例输入

5

样例输出

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

解题思路

感觉是要二维数组吧?注意输出格式!

#include<stdio.h>
int main(){
    int a[10][10];
    a[0][0] = 1;
    a[1][0] = 1;
    a[1][1] = 1;
    int n;
    scanf("%d",&n);
    for(int i = 2;i < n;i++){
        a[i][0] = 1;
        for(int j = 1;j < i;j++)
            a[i][j] = a[i-1][j-1] + a[i-1][j];
        a[i][i] = 1;
    }
    for(int i = 0;i < n;i++){
        printf("%d",a[i][0]);
        for(int j = 1;j < i+1;j++)
            printf(" %d",a[i][j]);
        puts("");
    }
    return 0;
}

问题 D: 习题6-12 解密

有一行电文,已按如下规律译成密码:
A–>Z a–>z
B–>Y b–>y
C–>X c–>x
… …
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

输入

输入一行密文

输出

解密后的原文,单独占一行。

样例输入

ZYX123zyx

样例输出

ABC123abc

解题思路

典型字符串的数据啊。不用保存,读一个转一个就好。

#include<stdio.h>
int main(){
    char c;
    while((c = getchar()) != '\n' && c != '\0'){
        if(c >= 'A' && c <= 'Z'){
            putchar('Z' - c + 'A');
            continue;
        }
        else if(c >= 'a' && c <='z'){
            putchar('z' - c + 'a');
            continue;
        }
        else putchar(c);
    }
    return 0;
}

问题 E: 习题6-13 字符串比较

比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。
要求:不用strcpy函数;两个字符串用gets函数读入。
例如:“A"与"C"相比,由于"A”<“C”,应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。
同理:"And"和"Aid"比较,根据第2个字符比较的结果,“n"比"i"大5,因此应该输出"5”

输入

输入2行字符串

输出

一个整数,表示这两个字符串 比较的差值,单独占一行。

样例输入

And
Aid

样例输出

5

解题思路

需要读入一行,所以用了cin.getline,注意头文件和namespace

#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
    char str1[100],str2[100];
    cin.getline(str1,100);
    cin.getline(str2,100);
    int i;
    for(i = 0 ;str1[i] || str2[i];i++){
        if(str1[i] > 'a')   str1[i] -= 32;  //都变成大写
        if(str2[i] > 'a')   str2[i] -= 32;//都变成大写
        if(str1[i] == '\0'){
            printf("%d\n",0 - str2[i]);
            break;
        }
        if(str2[i] == '\0'){
            printf("%d\n",str1[i] - 0);
            break;
        }
        if(str1[i] == str2[i])  continue;
        else {
            printf("%d\n",str1[i] - str2[i]);
            break;
        }
    }
    if(str1[i] == 0 && str2[i] == 0) printf("%d\n",0);
    return 0;
}

问题 F: 例题6-1 逆序输出数组元素

从键盘上输入10个整数,存储在一个长度为10的整型数组中,要求将输入的10个数逆序输出。
如输入为:0,1,2,3,4,5,6,7,8,9 输出为9,8,7,6,5,4,3,2,1,0

输入

10个整数,以空格分隔

输出

将输入的10个整数逆序输出,每个数占一行。

样例输入

0 1 2 3 4 5 6 7 8 9

样例输出

9
8
7
6
5
4
3
2
1
0

解题思路

啊这,刚写过啊。。。

#include<stdio.h>
int main(){
    int a[10];
    for(int i = 0;i < 10;++i)
        scanf("%d",&a[i]);//读入元素
    for(int i = 9;i >= 0;--i)
        printf("%d\n",a[i]);
    return 0;
}

问题 G: 例题6-2 数组求解Fibonacci数列问题

Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
要求输出Fibonacci数列的前20个数。

输入

输出

Fibonacci数列的前20个数,每个数占一行。

样例输入

样例输出

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

解题思路

思路还是老思路,就是要开数组罢了。

#include<stdio.h>
int main(){
    int a[20];
    a[0] = 1;
    a[1] = 1;
    for(int i = 2;i < 20;i++)
        a[i] = a[i-1] + a[i-2];
    for(int i = 0;i < 20;i++)
        printf("%d\n",a[i]);
    return 0;
}

问题 H: 例题6-3 冒泡排序

从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。

输入

以空格分隔的10个整数

输出

依次输出排好序的10个整数,每个数占一行。

样例输入

1 3 5 7 9 2 4 6 8 0

样例输出

0
1
2
3
4
5
6
7
8
9

解题思路

就是冒泡排序的一个练习罢了。

#include<stdio.h>
int main(){
    int a[10];
    for(int i = 0;i < 10;i++)
        scanf("%d",&a[i]);
    for(int i = 10;i > 1 ;i--){ //n-1躺排序
        int flag = 1;
        for(int j = 1;j < i;j++)
            if(a[j] < a[j - 1]){
                int temp = a[j-1];
                a[j-1] = a[j];
                a[j] = temp;
                flag = 0;
            }
            if(flag) break;
    }
    for(int i = 0;i < 10;i++)
        printf("%d\n",a[i]);
    return 0;
}

问题 I: 例题6-4 矩阵转置

将一个2行3列的矩阵(二维数组)行列互换,存储到另一个3行2列的矩阵中。
要求以整型数据为例来解答。

输入

输入2行数据,每行3个整数,以空格分隔。

输出

行列互换后的矩阵,3行,每行2个数据,以空格分隔。

样例输入

1 2 3
4 5 6

样例输出

1 4
2 5
3 6

解题思路

这个不一定非要转置,你说对吧?

#include<stdio.h>
int main(){
    int a[2][3];
    for(int i = 0;i < 2;i++)
        for(int j = 0;j < 3;j++)
            scanf("%d",&a[i][j]);
    for(int j = 0;j < 3;j++){
        printf("%d",a[0][j]);
        for(int i = 1;i < 2;i++)
            printf(" %d",a[i][j]);
        puts("");
    }
    return 0;
}

问题 J: 例题6-9 字符串求最大值

从键盘上输入3个字符串,求出其中最大者。

输入

输入3行,每行均为一个字符串。

输出

一行,输入三个字符串中最大者。

样例输入

England
China
America

样例输出

England

解题思路

这不用strcmp会行?

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main(){
    char a[3][100];
    for(int i = 0;i < 3;i++)
        cin.getline(a[i],100);
    if(strcmp(a[0],a[1]) > 0){
        if(strcmp(a[0],a[2]) > 0)   puts(a[0]);
        else puts(a[2]);
    }
    else{
        if(strcmp(a[1],a[2]) > 0)   puts(a[1]);
        else puts(a[2]);
    }
    return 0;
}

📑写在最后

大家一起来刷题啊。这基本上是最基础的开始,慢慢到竞赛级别。一起成长!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XingleiGao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值