1.请画出例5.6中给出的3个程序段的流程图。
2.请补充例5.7程序,分别统计当“fabs(t)>=1e-6”和“fabs(t)>=1e-8”时执行循环体的次数。
#include<stdio.h>
#include<math.h>
void main()
{
int sign=1;//符号
int count=0;//计数
double pi=0.0,n=1.0,term=1.0;//pi多项式,n分母,term当前项
while(fabs(term)>=1e-6)//fabs(term)>=1e-8
{
pi+=term;
n+=2;
sign=-sign;
term=sign/n;
count++;
}
pi*=4;
printf("pi=%10.6f count=%d\n",pi,count);
//printf("pi=%10.8f count=%d\n",pi,count);
}
3.输入两个正整数m和n,求其最大公约数和最小公倍数。
#include<stdio.h>
void main()
{
int m,n,t,p;//t,p中间变量
printf("请输入两个正整数m和n:");
scanf("%d%d",&m,&n);
p=m*n;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
printf("最大公约数=%d\n",m);
printf("最小公倍数=%d\n",p/m);
}
4.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include<stdio.h>
void main()
{
int c1=0,c2=0,c3=0,c4=0;//分别统计四种字符的数量
printf("请输入字符串:");
for(char a;(a=getchar())!='\n';)//加括号,关系运算符的优先级大于赋值运算符
{
if((a>='A'&&a<='Z')||(a>='a'&&a<='z'))
c1++;
else if(a==' ')
c2++;
else if(a>='0'&&a<='9')
c3++;
else
c4++;
}
printf("英文字母的个数=%d\n空格的个数=%d\n数字的个数=%d\n其他字符的个数=%d\n",c1,c2,c3,c4);
}
5.求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:2+22+222+2222+22222(此时n=5)
#include<stdio.h>
void main()
{
int a,n,t=0,S=0;//中间量t
printf("Please input a&n:");
scanf("%d%d",&a,&n);
for(int i=0;i<n;i++)
{
t=t*10+a;
S+=t;
}
printf("Sn=%d\n",S);
}
6.求1!+2!+3!+4!+…+20!。
#include<stdio.h>
void main()
{
float n=1,sum=0;//定义成int型产生溢出
for(int i=1;i<=20;i++)
{
n*=i;
sum+=n;
}
printf("sum=%f\n",sum);
}
7.求(1+2+…+100)+(1^ 2+2^ 2+…+50^ 2)+(1/1+1/2+…+1/10)。
#include<stdio.h>
void main()
{
int n2,s1=0,s2=0;
float n3,s3=0.0,s;
for(int i=1;i<=100;i++)
{
s1+=i;
if(i<=50)
{
n2=i*i;
s2+=n2;
}
if(i<=10)
{
n3=1.0/(float)i;
s3+=n3;
}
}
s=s3+(float)s2+(float)s1;
printf("s=%f\n",s);
}
8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数。
#include<stdio.h>
void main()
{
int a,b,c;//分别存放个位、十位、百位
for(int i=100;i<=999;i++)
{
a=i%10;
b=(i%100)/10;
c=i/100;
if(a*a*a+b*b*b+c*c*c==i)
printf("%d ",i);
}
}
9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1,2,3
#include<stdio.h>
void main()
{
for(int i=2;i<=1000;i++)
{
int sum=1;//因子的和
for(int j=2;j<=i/2;j++)
{
if(i%j==0)
sum+=j;
}
if(i==sum)
{
printf("%d its factors are 1",i);
for(int j=2;j<=i/2;j++)
{
if(i%j==0)
printf(",%d",j);
}
printf("\n");
}
}
}
10.有一个分数序列,求出这个数列的前20项之和。
2/1,3/2,5/3,8/5,13/8,21/13,…
#include<stdio.h>
void main()
{
float term,sum=0.0;//term每项,sum和
int f1=1,f2=2,t;
for(int i=0;i<20;i++)
{
term=(float)f2/(float)f1;
sum+=term;
t=f1;//1、2
f1=f2;//2、3
f2=t+f2;//3、5
}
printf("sum=%f\n",sum);
}
11.一个球从100m高度落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
#include<stdio.h>
void main()
{
float h=100.0,s=100.0;//h代表高度 s代表路程
for(int i=0;i<10;i++)
{
if(i>=1)
s+=2*h;
h/=2;
}
printf("第10次落地时共经过%f米\n第10次反弹高度为%f米\n",s,h);
}
12. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,就只剩一个桃子了。求第一天共摘多少个桃子。
#include<stdio.h>
void main()
{
int n=1;//表示桃子的总数
for(int i=0;i<9;i++)
{
n=(n+1)*2;
}
printf("第一天一共摘了%d个桃子\n",n);
}
13.用迭代法求x=根号a。求平方根的迭代公式为
Xn+1=1/2(Xn+a/Xn)
要求前后两次求出的x的差的绝对值小于10^(-5)
#include<stdio.h>
#include<math.h>
void main()
{
double a,x0,x1;
printf("Please input a:");
scanf("%lf",&a);
x0=a/2;
x1=(x0+a/x0)/2;
while(fabs(x1-x0)>=1e-5)
{
x0=x1;
x1=(x0+a/x0)/2;
}
printf("%lf的平方根为%lf\n",a,x1);
}
14.用牛顿迭代法求下面方程在1.5附近的根:
2x^3 - 4x^2 + 3x - 6 = 0
#include<stdio.h>
#include<math.h>
void main()
{
double x0,x1,f,f1;
x0=1.5;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x1=x0-f/f1;
while(fabs(x1-x0)>=1e-5)
{
x0=x1;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x1=x0-f/f1;
}
printf("1.5附近的实根为%lf\n",x1);
}
15.用二分法求下面方程在(-10,10)的根:
2x^3 - 4x^2 + 3x - 6 = 0
#include<stdio.h>
#include<math.h>
void main()
{
double x0,x1,x2,f0,f1,f2;
do{
printf("enter x1&x2:");
scanf("%lf%lf",&x1,&x2);
f1=((2*x1-4)*x1+3)*x1-6;
f2=((2*x2-4)*x2+3)*x2-6;
}while(f1*f2>0);
do{
x0=(x1+x2)/2;
f0=((2*x0-4)*x0+3)*x0-6;
if(f0*f1<0)
{
x2=x0;
f2=f0;
}
else
{
x1=x0;
f1=f0;
}
}while(fabs(f0)>=1e-5);
printf("%lf",x0);
}
16.输出以下图案:
*
***
*****
*******
*****
***
*
#include<stdio.h>
void main()
{
int i,j,k;
for(i=0;i<4;i++)
{
for(j=0;j<=2-i;j++)
{
printf(" ");
}
for(k=0;k<2*i+1;k++)
{
printf("*");
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<i+1;j++)
{
printf(" ");
}
for(k=0;k<5-2*i;k++)
{
printf("*");
}
printf("\n");
}
}
17。两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。以抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。
#include<stdio.h>
void main()
{
for(char i='X';i<='Z';i++)
{
for(char j='X';j<='Z';j++)
{
if(i!=j)
{
for(char k='X';k<='Z';k++)
{
if(i!=k&&j!=k)
{
if(i!='X'&&k!='X'&&k!='Z')
{
printf("A--%c\nB--%c\nC--%c\n",i,j,k);
}
}
}
}
}
}
}