算法笔记@Ada_Lake
算法笔记代码保留地~~~
2.4小节——C/C++快速入门->循环结构
问题 A: 例题5-1-1 连续自然数求和
- 题目描述 ,求1+2+3+…+100
要求用while语句实现 - 输入,无
- 输出,要求的和,末尾输出换行。 (注意末尾的换行) :
No real roots! - 样例输入, 无
- 样例输出, 5050
我的理解
太基础了
**以下是代码**
// Ada
#include <stdio.h>
int main(){
int i = 1, sum = 0;
while( i <= 100 ) {
sum = sum + i;
i++;
}
printf("%d\n", sum);
return 0;
}
问题 B: 例题5-1-2 连续自然数求和
- 题目描述 ,求1+2+3+…+100,
要求用do…while语句实现 - 输入,无
- 输出,计算结果,注意末尾输出换行。
- 样例输入, 无
- 样例输出, 5050
我的理解
先循环后判断
**以下是代码**
// Ada
#include<stdio.h>
int main(){
int i = 1, sum = 0;
do {
sum = sum + i;
i++;
}while( i <= 100 );
printf("%d\n", sum);
return 0;
}
问题 C: 例题5-1-3 连续自然数求和
- 题目描述 ,求1+2+3+…+100
要求用for语句实现 - 输入,无
- 输出,计算结果,末尾输出换行。
- 样例输入, 无
- 样例输出, 5050
我的理解
三个数相比较,平级关系用if
**以下是代码**
// Ada
#include<stdio.h>
int main(){
int sum = 0;
for( int i = 1; i <= 100; i++) {
sum = sum + i;
}
printf("%d\n", sum);
for
return 0;
}
问题 D: 例题5-1-4 连续自然数求和
- 题目描述 ,输入一个正整数N,求1+2+…+N,即求
要求在程序中使用break语句。 - 输入,要求输入的数据一定是一个正整数。
- 输出,计算的结果,连续N个自然数的和,末尾输出换行。
- 样例输入, 100
- 样例输出, 5050
我的理解
要用到break,应当是判断条件不符合时或者有其他情况跳出。如果是用for循环,则只有一个判断但已经在for里面了。而while 和 do while 相比用 while
以下是代码
// Ada
#include<stdio.h>
int main(){
int N, sum = 0, i = 1;
scanf("%d", &N);
while( N >= 0 ){
sum = sum + i;
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
我的理解
没有明确表明判断条件,因此用while
**以下是代码**
// Ada
#include<stdio.h>
int main(){
int sum = 0, N = 1;
while ( sum <= 1000 ) {
N++;
sum = sum + N;
}
printf("%d\n", N);
return 0;
}
**这里注意!!要先N加1,后运算sum.**
** 若 :N++;
sum = sum + N;
改为: N++;
sum = sum + N;
则N将变成46而不是45**
**因为若N放在后面,则sum被判断时的值永远是前一个N时的值,这样势必导致,如果想得到最终输出值,则一定会比原本的次数多加一次 **
要看输出值的个数,一定要注意i++放在前面还是放在后面
问题 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个字符的宽度,右对齐。
2. 输入,无
3. 输出,每行输出5个数字,每个数字占3个字符的宽度,右对齐。
4. 样例输入, 无
5. 样例输出,
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
我的理解
矩阵 二重循环
每个数字占3个字符的宽度,右对齐。 %md
以下是代码
// Ada
#include<stdio.h>
int main(){
int i, j;
for( i = 1; i <= 4; i++) {
for( j = 1; j <= 5; j++){
printf("%3d", i * j);
}
printf("\n");
}
return 0;
}
问题 G: 例题5-7 求圆周率pi的近似值
- 题目描述 ,
用如下公式 π/4=1-1/3+1/5-1/7…
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
要求输出的结果总宽度占10位,其中小数部分为8位。
程序中使用浮点型数据时,请定义为双精度double类型。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x). - 输入,无
- 输出,
PI=圆周率的近似值
输出的结果总宽度占10位,其中小数部分为8位。
末尾输出换行。 - 样例输入, 无
- 样例输出 ,PI=3.14159065
我的理解
绝对值 fabs()
该项不累加这句话是可以看出加法要在判断前,这样才能在满足判断时不会继续累加
这题真的不麻烦,但天知道我磨蹭了几天,老是有地方做错,盯着错误的代码怎么看总改不出来。
还记不记得姥姥说过的,有的问题看似复杂是因为在看整体,把它拆分开来,逐个击破,就迎刃而解了。
我其实就是犯了这个错误。正因为看着简单,就想一口吃个胖子,想一下子把表达式写出来。
然后好了。原本各司其职结果乱七八糟了。
这次就换了种思路,再简单也只让每个可爱的小符号只做一件事。
π/4=1-1/3+1/5-1/7…
1.π 就只用右式乘4,右式是累和,就拿sum代替
2.sum由于是累和,就只做加法这一件事,sum = sum + temp;
3.temp中有正有负,则拿出sign只做正负,即sign = sign -1;
让temp 只做乘法变为正负,分式就拿n代替。 即 temp = nsign ;
4.n只做除法变为分式。分母拿i代替。n = 1 / i;
5.i 为 加法,i = i + 2;
优化
合并可以放在一起的
1.✔
2.✔
3. 可以看到3.4右侧都是常量+变量表达式,感觉尽量不要这样混着. sign = -sign;
4. 4中1/i的1刚好可以用3的sign替代。则已经是正负了。省掉n
5.✔
以下是代码
// Ada
#include<stdio.h>
#include<math.h>
int main(){
double PI, sum = 0, temp = 1, sign = 1, i = 1;
while(fabs( temp ) >= pow(10, -6)){
sum = sum + temp;
i = i + 2;
sign = -sign;
temp = sign / i;
}
PI = sum * 4;
printf("PI=%10.8f", PI);
return 0;
}
问题 H: 例题5-8 Fibonacci数列
- 题目描述 ,
输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
要求输入的正整数n不超过50. - 输入,一个不超过50的正整数
- 输出,Fibonacci数列的第n个数,末尾输出换行。
- 样例输入, 20
- 样例输出, 6765
我的理解
1.第1,2个数为1,1。设置两个数,一个代表第一个数 n1, 一个代表第二个数 n2. 均设初始值为1
2.设值为F,只做相加,即F = n1+n2;
3.n1,n2要依此变为后一个数 即 n1 = n2; n2 = F;
注意
由于第一个第二个数值已经定了,因此个数是从3开始计数的。即个数减2
以下是代码
// Ada
#include<stdio.h>
int main(){
int n, F = 0, n1 = 1, n2 = 1, n3 = 0;
scanf("%d", &n);
if( n <= 50){
while( n > 2 ){
F = n1 + n2;
n1 = n2;
n2 = F;
n--;
}
}
printf("%d\n", F);
return 0;
}
问题 I: 习题5-10 分数序列求和
- 题目描述 ,
有如下分数序列 2/1,3/2,5/3,8/5,13/8,21/13。
求出次数列的前20项之和。请将结果的数据类型定义为double类型。 - 输入,无
- 输出,小数点后保留6位小数,末尾输出换行。
- 样例输入, 无
- 样例输出, 32.660261
我的理解
1.前20项之和 有一个数从1-20计数。用sum保存所有的值 sum = sum + temp;
2.temp由分子分母组成。 分子拿n2 分母拿n1, F = n1 + n2;
以下是代码
// Ada
#include<stdio.h>
int main(){
double sum = 0, temp = 1, n1 = 1, n2 = 2, F = 0, i = 1;
while( i <= 20 ) {
temp = n2 / n1;
sum = sum + temp;
F = n1 + n2;
n1 = n2;
n2 = F;
i++;
}
printf("%.6f\n", sum );
return 0;
}