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);
}
}
}
}
}
}
}