新浪博客

1、利用循环迭代法求和

2009-06-14 13:02阅读:
【例 3】用∏/4=1-1/3+1/5-1/7+1/9…公式求∏的近似值,直到最后一项的绝对值小于 10的-6次方为止。
【参考程序】
#include <stdio.h>

#include <math.h>
int main()
{ double pi,term;
long n=1, t=1;
pi=0;
do
{ term=t*1.0/n;
pi+=term;
n+=2;
t=-t;
}while (fabs(term)>1e-6);
pi=pi*4;
printf('pi=%-10.6f',pi);

}
【例 4】利用泰勒级数 e=1+1/1!+1/2!+1/3!+……1/n!计算 e 的近似值。当最后一
项的绝对值小于 10的-5次方时,认为达到了精度要求,要求统计总共累加了多少项。
【参考程序】
#include <math.h>
#include <stdio.h>
main()
{ int n = 1, count =1;
double e = 1.0, term = 1.0;
long fac = 1;
for (n=1; fabs(term) >= 1e-5; n++)
{
fac = fac * n;
term = 1.0 / fac;
e = e + term;
count++;
}
printf('e = %f, count = %d', e, count);
}

【例 5】利用泰勒级数 sinx=x-x*x*x/3!+x*x*x*x*x/5!-x*x*x*x*x*x*x/7!+……计算 sinx 的值。要求最后一项的绝对值小于10的-5次方,并统计此时累加了多少项。
【参考程序】
#include <math.h>
#include <stdio.h>
main()
{
int n = 1,count = 1;
float x;
double sum , term;

printf('Input x: ');
scanf('%f', &x);
sum = x;
term = x;
do
{ term = -term * x * x / ((n + 1) * (n + 2));
sum = sum + term;
n = n + 2;
count++;
}while (fabs(term) >= 1e-5);
printf('sin(x) = %f, count = %d', sum, count);
}

【例 7】相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自
择何种赏赐。这位聪明的宰相指着 8×8 共 64 格的象棋盘说:陛下,请您赏给我一些麦子吧,就在
的第一个格子中放 1 粒,第 2 格中放 2 粒,第3 格放4 粒,以后每一格都比前一格增加一倍,依此
棋盘上的 64个格子,我就感恩不尽了。
舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗?试编程计算舍罕王共
少麦子赏赐他的宰相,这些麦子合多少立方米?(已知 1立方米麦子约 1.42e8 粒)
【参考程序】
#define CONST 1.42e8
#include <stdio.h>
main()
{ int n;
double term = 1, sum = 1;
for (n=2; n<=64; n++)
{ term = term * 2;

sum = sum + term;
}
printf('sum = %e', sum);
printf('volum = %e', sum/CONST);
}
【例 8】大奖赛评分程序:在唱歌大奖赛评分时,一般要有若干名评委,记分规则为:去掉一个最高分和一
个最低分,再算平均分。按百分制记分,试设计一个算分程序。
基本算法:
(1)一一输入每个评委打分,同时累加求和 sum并记下最高分 max 和最低分 min 。
(2)计算(sum-max-min)/(n-2),并输出结果
【参考程序】
#include 'stdio.h'
#define N 10

main()
{
int score ,i,max,min;
float sum=0;
max=0; //初始时最高分设为 0
min=100; //初始时最低分设为 100
for (i=1;i<=N;i++)
{
printf('Input a socre %d=',i);
scanf('%d',&score);
if ( score>max ) max=score;
if ( score<min ) min=score;
sum+=score;
}
printf('Canceled max score:%d',max);
printf('Canceled min score:%d',min);
printf('Average score :%f',(sum-max-min)/(N-2));
}

【例 9】从键盘输入一个无符号整数,输出它的各位数字之和。如输入1476,则输出格式为: 6+7+4+1=18
【参考程序】
#include <stdio.h>
int main()
{ unsigned n,k,s=0;
printf('请输入一个无符号整数:');
scanf('%u',&n);
while (n/10) //当n 大于10 时循环分解出各位数字
{ k=n%10; //分离出个位数
s+=k; //求和
printf('%d+',k); //输出
n=n/10; //去除分离出的个位数
}
s+=n; //将最后剩余的最高位加入 s
printf('%d=%d',n,s);
return 0;
}

【例 10】将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。
程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成:
(1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果 n!=k,但n能被 k 整除,则应打印出 k 的值,并用 n 除以k 的商,作为新的正整数 n, 重复
执行第一步。
(3)如果n不能被 k 整除,则用 k+1 作为k 的值,重复执行第一步。
【参考程序】
#include <stdio.h>
main()

{ int n,i;
printf('Please input a number:
scanf('%d',&n);
printf('%d=',n);
for (i=2;i<=n;i++)
{
while (n!=i)
{
if (n%i==0)
{
printf('%d*',i);
n=n/i;
}
else
break;
}
}
printf('%d',n);
}

我的更多文章

下载客户端阅读体验更佳

APP专享