算法笔记习题 2-4小节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ada_lake/article/details/87818403

算法笔记@Ada_Lake

算法笔记代码保留地~~~

2.4小节——C/C++快速入门->循环结构

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

  1. 题目描述 ,求1+2+3+…+100
    要求用while语句实现
  2. 输入,无
  3. 输出,要求的和,末尾输出换行。 (注意末尾的换行)
    No real roots!
  4. 样例输入,
  5. 样例输出, 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. 题目描述 ,求1+2+3+…+100,
    要求用do…while语句实现
  2. 输入,无
  3. 输出,计算结果,注意末尾输出换行。
  4. 样例输入,
  5. 样例输出, 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. 题目描述 ,求1+2+3+…+100
    要求用for语句实现
  2. 输入,无
  3. 输出,计算结果,末尾输出换行。
  4. 样例输入,
  5. 样例输出, 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 连续自然数求和

  1. 题目描述 ,输入一个正整数N,求1+2+…+N,即求
    要求在程序中使用break语句。
  2. 输入,要求输入的数据一定是一个正整数。
  3. 输出,计算的结果,连续N个自然数的和,末尾输出换行。
  4. 样例输入, 100
  5. 样例输出, 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. 题目描述 ,编程实现求1+2+3+…和的程序,要求得到使和数大于1000的最小正整数。
  2. 输入,无
  3. 输出,输出使1+2+3+…+N>1000的最小正整数N,末尾输出换行。
  4. 样例输入,
  5. 样例输出, 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 矩阵输出

  1. 题目描述 ,输出以下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的近似值

  1. 题目描述
    用如下公式 π/4=1-1/3+1/5-1/7…
    求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
    要求输出的结果总宽度占10位,其中小数部分为8位。
    程序中使用浮点型数据时,请定义为双精度double类型。
    如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).
  2. 输入,无
  3. 输出
    PI=圆周率的近似值
    输出的结果总宽度占10位,其中小数部分为8位。
    末尾输出换行。
  4. 样例输入, 无
  5. 样例输出 ,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 = n
sign ;
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数列

  1. 题目描述
    输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
    要求输入的正整数n不超过50.
  2. 输入,一个不超过50的正整数
  3. 输出,Fibonacci数列的第n个数,末尾输出换行。
  4. 样例输入, 20
  5. 样例输出, 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 分数序列求和

  1. 题目描述
    有如下分数序列 2/1,3/2,5/3,8/5,13/8,21/13。
    求出次数列的前20项之和。请将结果的数据类型定义为double类型。
  2. 输入,无
  3. 输出,小数点后保留6位小数,末尾输出换行。
  4. 样例输入,
  5. 样例输出, 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;
} 

猜你喜欢

转载自blog.csdn.net/Ada_lake/article/details/87818403
今日推荐