初入C语言——循环结构经典题型讲解(一)有规律的一组数的累加求解


前言

今天将介绍C语言中的循环结构经典基础题,与选择结构相比,循环结构更增大了对数学思维的运用。它不是非此即彼,一次次的循环下去该怎样设计程序才能使循环结构有意义?怎样才能达到题中要求的目的?我认为这是循环结构对于我们初学者的难点,重在将数学逻辑与程序与语言的结合,转换以往数学解题思维,从而实现让计算机巧妙、简单解题的目的。

一、简述循环结构

C语言循环结构有(while循环,for循环,do…while循环),具体使用方法不再赘述,
主要提醒自己以下几个点:
**(1)**do…while 循环在控制表达式被第一次计算之前,循环体语句会首先被执行一次。与 while 和 for 循环不同,do…while 循环会确保循环体语句至少执行一次。如果控制表达式的值为 true,那么另一次循环就会继续;如果是 false,则循环结束。
**(2)**for 循环头部中的三个表达式可以省略一个或多个。这意味着 for 循环头部最短的形式是: for ( ; ; )
如果没有控制表达式,则表示循环条件始终是 true,也就是说,这定义了一个死循环。
**(3)**每个while循环都可写成for循环 。
示例:

         for ( ;表达式; )这样的循环,
 可写成 
         while(表达式)

**(4)**每个for循环也都可写成while循环。
示例:

         for(i=1;i++;i<n)
         a+=2;
  可写成
         i=1 ;
        while(i<n)
        {
         i++;
         a+=2;
         }

注:理论上for循环和while循环是可以相互转换,但实际中一定是看哪个表示更方便、整洁 用哪个的,就像(4)中的用for循环只用两行代码,而用while则需要四五行,所以当然选择最优解。

二、经典例题讲解

1.计算a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。

测试用例:
输入 Input a,n:2 4
输出 sum=2468

解答:
分析: 这道题主要突破的点就是如何实现a,aa,aaa…a(n个)的输入,就要想到设出另一个数X,依次让X乘10,a只用加到个位上即可。

代码如下:

#include <stdio.h>
int main()
{
	int sum = 0, a, n, i, x = 0;
	printf("Input a,n:");
	scanf_s("%d%d", &a, &n);
	for (i = 1; i <= n; i++)
	{
		x = x * 10 + a;  //这点一定要记住,实现a...(n个)的方法
		                //第一次循环的目的即先让x=a
		sum += x;
	}
	printf("sum=%d\n", sum);
	return 0;
}

运行结果:
在这里插入图片描述

2.计算1-1/2+1/3-1/4+…+1/99-1/100+…,直到最后一项的绝对值小于10-4(10的-4次方)为止。

程序运行结果: sum=0.693092

解答:
分析:分母依次加一,设出a=1,在循环结构中进行a++。分子+1、-1交替出现,设出b=1,循环中进行b=0-b。循环结束条件是最后一项绝对值小于10的-4次方,还要使用绝对值函数fabs,注意要引头文件include<math.h>
代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int a = 1;
	float sum = 0, term = 1.0, b = 1;
	while (fabs(term) >= 0.0001) //这里10的n次方表示方法有三种,详见上一篇博客
	{
		term = b / a;
		sum += term;
		a++;
		b= 0-b ;  //实现一正一负相加的方法其实很简单,就是依次循环用0-b !!!
	}
	printf("sum=%f", sum);
	return 0;
}

运行结果
在这里插入图片描述

3.利用e=1+1/1!+1/2!+1/3!+…+1/n!,编程计算e的近似值,直到最后一项的绝对值小于10-5为止,输出e的值并统计累加的项数。

程序运行结果: e=2.718282,count=10

解答:
分析:此题主要是要想到如何表示出阶乘,那就要设出一个中间变量term,因为是阶乘分之一,所以就是运用循环让这次运算的term等于上次运算的term/a,a再依次加一即可。
代码如下:

#include<stdio.h>
#include<math.h>   //用绝对值函数fabs()要引头文件
int main()
{
	float e = 1, term = 1;
	int a = 1, count = 1;
	while (fabs(term) >= 1e-5)
	{
		term = term / a;    //这次运算的term等于上次运算的term/a,这样就能达到阶乘的目的
		e += term;
		a++;
		count++;  //统计相加的项数
	}
	printf("e=%f,count=%d", e, count);
	return 0;
}

运行结果:
在这里插入图片描述

4.求一分数序列2/1,3/2,5/3,8/5,13/8,21/13…的前n项之和,n的值由键盘输入。

测试用例:

输入 Input n:20
输出 sum=32.66

解答:
分析:观察规律,后一项数的分子等于前一项数的分子分母相加,后一项数的分母等于前一项数的分子(具体数学分析见下方的代码注释)。所以就想到用for循环。
代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int n = 1, i = 1;
	float x=0,sum = 0,a , b;
	printf("Input n:");
	scanf_s("%d",&n);   
	for(a=1,b=2;i<=n; i++)
	{x =b/a;
	sum += x;
	b=a+b;
	a = b - a;
	//(a=b-a)这点一定要注意!!!最终目的是实现a2=b1,b2=a1+b1
	// 因为若上面第一次循环为a1、b1则要想让b2=a1+b1,a2=b1
	//这种形式,当经过b=a+b后,b2=a1+b1了,
	//所以要想让a2=b1,则需要b-a(即b2-a1即a1+b1-a1)
	//从而类推到n和n+1  
	//!!!且给b的赋值一定先于a的赋值,因为最终目的是让a2=b1,b2=a1+b1,若
	//a2一旦等于b1,则再做加减运算就无法得到a1+b1(因为a被赋值成b1,a1已经消失了无法表示出来了)
	}
	printf("sum=%.2f", sum);
	return 0;
}

运行结果:
在这里插入图片描述

总结

循环结构初学时我是晕了半天的,但我觉得它又不像是高考试卷中的数学题一样不会做就是干瞪眼,程序设计是很耐人寻味的,只要一点一点的去看去学,还是可以接受的。当把一道程序题琢磨透,就会豁然开朗,就会明白它理所当然就该这么去想。当从去模仿去查找甚至是去直接记住某些代码,到逐渐尝试自己边理解边不借助外物写出来时,就会油然而生一种成就感,正是这些小小的激励才让我这样的小白有动力去学下去。哈哈哈,今天也是有感而发,分享一句自己摘抄的话:生命中最遗憾的事不是失败,而是我本可以。加油!

  • 51
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值