今天是我开坑的第二天,今天显得有计划了很多。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;
}
📑写在最后
大家一起来刷题啊。这基本上是最基础的开始,慢慢到竞赛级别。一起成长!