C语言求1-1/3+1/5-1/7+...——小程序,大道理

问题:用C语言编写程序求1-1/3+1/5-1/7+...

示例:

 1 #include <stdio.h>
 2 void main(){
 3     int n=1;
 4     float sum=0,a=1;
 5     while(a<=100){
 6         sum=sum+n/a;
 7         n=-n;
 8         a=a+2;
 9     }
10     printf("%f\n",sum);
11 }

分析:

数列的求和问题,每一项正负交替,并且分母递增2。

首先,这是一个加法(累加)问题,涉及到被加数,加数,和的概念。每一次加法运算产生的和又作为新的被加数,然后加上一个新的加数,并且新的加数之间(即每一项之间)具有规律性。这样不断重复做加法运算。

计算离不开记忆,对于人,每一次运算的中间结果都要记住或者记到草稿纸上才能进行下一步计算,并且求出新结果后旧的结果无需再记忆;计算机也是如此,对于计算机来说,数据保存在存储单元中,在程序中用变量来表示,用来暂存各种数据,包括原始数据,中间结果和最终结果。并且,变量的值可以改变,当旧的值不再需要并且产生新值之后,变量便更新为新值。只从这点来看,草稿纸就毫无优势可言~

对于累加问题,被加数以及和(新的被加数)可以用同一个变量(sum)来保存,它不断地被更新。一开始为0,然后为各种中间结果,直到最后为最终结果并输出。另外,加数也是一个变量,它每次更新为新的值,并且这种更新是有规律可循的:作为一个分数,每次分子更新为相反数,分母则递增2。分子分母都在变化,因此可分别作为一个变量。

但是,我们并没有用一个真正的变量来表示加数,而是用一个含有变量的表达式n/a,这样可以节省一个变量。

然后,C代码要做的除了声明和初始化变量,就是根据逻辑(规律)更新变量(包括变量的引用和赋值)。并且,正因为变量的更新都是有规律可循的,都是在旧值的基础上做运算,可以用一个通用公式来表示,即具有相同的形式,所以可以采用循环结构来实现(这里,我们只循环到分母为99的项)。

小结:

我们从变量的角度分析了这个程序。做的事情无非是变量的声明和初始化(有时变量的输入取代了初始化),以及变量的多次引用和更新(首次赋值称为初始化,再次赋值便是更新),最终可能还要输出它,输出到屏幕或磁盘等。

从形式上来看,变量出现在赋值符(=)的左边(声明并初始化时,赋值时),或右边(引用)。

 1 #include <stdio.h>
 2 void main(){
 3     /*变量的声明及初始化*/
 4     int n=1;
 5     float sum=0,a=1;
 6     /*变量的循环引用及赋值*/
 7     while(a<=100){
 8         sum=sum+n/a;
 9         n=-n;
10         a=a+2;
11     }
12     /*变量的输出*/
13     printf("%f\n",sum);
14 }

注意:

这里面有一个坑,就是如果n和a都是整型变量的话,n/a也会是整型,而不是浮点型,结果就会有错误。因此,我们将a声明为浮点型。

拓展:

比较有意思的是,利用这个数列(无穷级数)可以求得圆周率。即将其乘以4便得到π的近似值,项数越多越精确。

原文地址:https://www.cnblogs.com/madbean/p/9121483.html

时间: 2024-11-01 16:16:15

C语言求1-1/3+1/5-1/7+...——小程序,大道理的相关文章

C语言之如何上机运行第一个Hello World小程序

一.首先,打开我们的Visual C++ 6.0软件,我使用的为中文版,软件主界面如下图所示: 1.然后点击上图工具栏中的文件,里面有个新建菜单,然后我们可以设置一下我们的工作空间,如下图所示: 2.然后在一步步默认点击确定,完成即可,此时工作空间就建立起来了! 二.接下来,再点击工具栏下的文件,里面有个新建菜单,点击它,出现下图的对话框: 1.点击确定即可,创建出一个helloworld.c的小程序,然后我们就可以编写我们的Hello World小程序了. 2.程序代码如下: #include

C语言求质数的算法

前言 上次被出了一题质数的C语言求解题目(面试),当时用了最粗暴的算法,回来仔细参考资料,其实答案有很多种: 1,小学生版本: 判断 x 是否为质数,就从 2 一直算到 x-1. static rt_uint32_t array1[ARRAY_LEN]; void func1(void) { for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++) { array1[i - 1] = 0; } rt_uint32_t x, y = 0, z = 0; rt_uin

C语言求x的y次方,自定义函数,自己的算法

我是一名高二中学生,初中时接触电脑,非常酷爱电脑技术,自己百度学习了有两年多了,编程语言也零零散散的学习了一点,想在大学学习计算机专业,所以现在准备系统的学习C语言,并在博客中与大家分享我学习中的心得与思路.希望大牛路过的时候指点指点. 可以说是第N次学习C语言了,都是学到数组和函数这里停止了,这次下定了决心要学完C语言,不光要学完,还要学好下面是利用自定义函数写的一个模仿pow()函数工作的一个小程序[求x的y次方] 1 #include<stdio.h> 2 3 int main(void

用c语言求ax^2+bx+c=0方程的解

用c语言求ax^2+bx+c=0方程的解.#include <stdio.h>#include <math.h>#define m 0.000001int main(){     float a,b,c,x,x2,n,q,p;     scanf ("%f%f%f",&a,&b,&c);     n=b*b-4*a*c;     if ((a<m)&&(a>-m))     {         x=(-c)/b

C语言求积分

编一个程序,求定积分. 1 #include<stdio.h> 2 int main() 3 { 4 float x,n=100000,integral=0,i; 5 for(i=0;i<100000;) 6 { 7 i++; 8 x=n*n; 9 integral+=i/x; 10 } 11 printf("%0.5f\n",integral); 12 return 0; 13 } C语言求积分

C语言求最大公约数和最小公倍数

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和

C语言——求最大公约数及最小公倍数

基本概念 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数.整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号. 最大公约数:也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号. 关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数). 方法分析 最大公

解剖被称为「外星人程序」的求PI小程序

|版权声明:本文为博主原创文章,未经博主允许不得转载. 原代码如下: 1 /*某年Obfuscated C Contest佳作选录:*/ 2 long a=10000,b,c=2800,d,e,f[2801],g; 3 main(){for(;b-c;)f[b++]=a/5; 4 for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) 5 for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);} 输出: 3

编程小课堂:10个经典的C语言小程序

今天给大家分享10个比较基础的C语言的小程序,希望给C语言初学者带来一定帮助. (IT之家配图) 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的排列. 程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;

实用C语言管道小程序

编写使用管道的程序]我们在文件夹下,c语言做的每个程序都有一个独立的功能,我们可以将多个小程序使用管道连接到一起.我们现在写一个程序aver.c,求任意个数的平均值:#include <stdio.h> int main(){int s, n;scanf("%d,%d", &s, &n);float v = s / n;printf("v = %f\n", v);return 0;}退出vim进行编译cc aver.c -o aver.o