潭浩强C语言.docx
《潭浩强C语言.docx》由会员分享,可在线阅读,更多相关《潭浩强C语言.docx(29页珍藏版)》请在冰点文库上搜索。
潭浩强C语言
第6章循环控制
6.1输入两个带有整数m和n,求其最大公约数和最小公倍数。
程序如下:
#include
voidmain()
{
longm,n,i=1,j,s;
scanf(“%ld,%ld”,&m,&n);
for(;i<=m&&i<=n;i++)
{
if(m%i==0&&n%i==0)
s=i;
}
if(m>=n)
j=m;
else
j=n;
for(;j%m==0&&j%n==0;j++);
printf(“s=%ld,j=%ld\n”,s,j);
}
6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。
程序如下:
#include
voidmain()
{
charc;
inti=0,j=0,k=0,l=0;
while((c=getchar())!
=’\n’)
{
if(c>=65&&c<=90||c>=97&&c<=122)
i++;
elseif(c>=48&&c<=57)
j++;
elseif(c==32)
k++;
else
l++;
}
printf(“i=%d,j=%d,k=%d,l=%d”,i,j,k,l);
}
6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。
例如:
2+22+222++2222+22222(n=5),n由键盘输入。
#include
voidmain()
{
intn,sum=0,i=1,s=2;
scanf(“%d”,&n);
while(i<=n)
{
sum=sum+s;
s=s+2*pow(10,i);
i++;
}
printf(“sum=%d\n”,sum);
}
6.4求
,(即求1!
+2!
+…+20!
)。
程序如下:
#include
voidmain()
{
intn,i=1;
longsum=0,s=1;
scanf(“%d”,&n);
while(i<=n)
{
s=s*i;
sum=sum+s;
i++;
}
printf(“sum=%ld\n”,sum);
}
6.5求
。
#include
voidmain()
{
doublei=1,j=1,k=1,s1=0,s2=0,s3=0,sum;
for(;i<=100;i++)
s1=s1+i;
for(;j<=50;j++)
s2=s2+j*j;
for(;k<=10;k++)
s3=s3+1/k;
sum=s1+s2+s3;
printf(“sum=%f\n”,sum);
}
6.6打印出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
例如:
153是一个水仙花数,因为153=1^3+5^3+3^3。
程序如下:
#include
voidmain()
{
intx=100,a,b,c;
while(x>=100&&x<=1000)
{
a=0.01*x;
b=10*(0.01*x-a);
c=x-100*a-10*b;
if(x==(pow(a,3)+pow(b,3)+pow(c,3)))
printf(“%5d”,x);
x++;
}
}
6.7一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如,6的因子为1,2,3而6=1+2+3,因此6是“完数”。
编程找出1000以内的所有完数,并按下面格式输出其因子:
6itsfactorsare1,2,3
程序如下:
(方法一:
)
#include
voidmain()
{
intm,i,j,s;
for(m=6;m<1000;m++)
{
s=1;
for(i=2;iif(m%i==0)
s=s+i;
if(m-s==0)
{
printf(“%5sitsfatorsare1”,m);
for(j=2;jif(m%j==0)
printf(“%d”,j);
printf(“\n”);
}
}
}
(方法二:
)
#include
voidmain()
{
for(m=6;m<1000;m++)
{
s=m-1;
for(i=2;iif(m%i==0)
s=s-i;
if(s==0)
{
printf(“%5ditsfactorsare1”,m);
for(j=2;jif(m%j==0)
printf(“%d”,j);
printf(“\n”);
}
}
}
6.8有一分数序列2/1,3/2,5/3,8/5,13/8,21/13,…求出这个序列的前20项之和。
程序如下:
#include
voidmain()
{
inti=1,n;
doublet,x=1,y=2,sum=0;
scanf(“%ld”,&n);
while(i<=n)
{
s=y/x;
sum=sum+s;
t=y;
y=y+x;
x=t;
i++;
}
printf(“%f”,sum);
}
6.9一个球从100m高度自由落下,每次落下地后反跳回原高度的一半,再落下,再反弹。
求它在第10次落下地时,共经过多少米?
第10次反弹多高?
程序如下:
#include
voidmain()
{
inti;
floatsn=100,hn=sn/2;
scanf(“%d”,&n);
for(i=2;i<=10;i++)
{
sn=sn+2*hn;/*第n次落地时共经过的米数*/
hn=hn/2;
}
printf(“第10次落地时共经过%f米\n”,sn);
printf(“第10次反弹%f米\n”,hn);
}
6.10猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,就只剩下一个桃子了。
求第一天共摘多少个桃子?
程序如下:
#include
voidmain()
{
inti=1,sum=0;
for(;i<=10;sum=2*sum+1,i++)
printf(“sum=%d\n”,sum);
}
6.11用迭代法求
。
求平方根的迭代公式如下:
,要求前后两次求出的x的差的绝对值小于10-5。
程序如下:
#include
voidmain()
{
floatx0,x1,a;
scanf(“%f”,&a);
x1=a/2;
do
{
x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x0-x1)>=0.00001);
printf(“%.3f\n”,x1);
}
6.12用牛顿法求下面方程在1.5附近的根:
程序如下:
#include
voidmain()
{
doublex,y;
x=1.5;
do
{
y=2*x*x*x-4*x*x+3*x-6;
x=x-y/(6*x*x-8*x+3);
}while(y!
=0);
printf(“x=%.3f\n”,x);
}
说明:
牛顿法是牛顿在17世纪提出的一种求解方程f(x)=0的方法,多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。
设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值,过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程,得r的近似值序列{Xn},其中Xn+1=Xn-f(Xn)/f'(Xn),称为r的n+1次近似值。
上式称为牛顿迭代公式。
6.13用二分法求下面方程在(-10,10)之间的根:
程序如下:
#include
voidmain()
{
doublex1,x2,y1,y2;
x1=-10;
x2=10;
do
{
y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
x1=x1-y1/(6*x1*x1-8*x1+3);
}while(y1!
=0);
do
{
y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
x2=x2-y2/(6*x2*x2-8*x2+3);
}while(y2!
=0);
printf(“x1=%.3f,x2=%.3f\n”,x1,x2);
}
说明:
一般地,对于函数f(x),如果存在实数c,当x=c是f(c)=0,那么把x=c叫做函数f(x)的零点。
解方程即要求f(x)的所有零点。
先找到a、b,使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b)>0,a
如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,按上述方法在求该区间中点的函数值,这样就可以不断接近零点。
如果f[(a+b)/2]>0,同上。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
6.14输出以下图案:
*
***
*****
*******
*****
***
*
程序如下:
#include
voidmain()
{
inti,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2;j++)
printf(“”);
for(k=0;k<=2;k++)
printf(“*”);
printf(“\n”);
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(“”);
for(k=0;k<=4-2*i;k++)
printf(“*”);
peinrd(“\n”);
}
}
6.15两个乒乓球队进行比赛,各出3人。
甲队为A,B,C3人,乙队为X,Y,Z3人。
已抽签决定比赛名单。
有人向队员打听比赛的名单,Ay产他不和X比,C说他不和X,Z比,请编程度找出3对赛手的名单。
程序如下:
#include
voidmain()
{
chari,j,k;/*i是a的对手,j是b的对手,k是c的对手*/
for(i=’x’;i<=’z’;i++)
for(j=’x’;j<=’z’;j++)
{
if(i!
=j)
for(k=’x’;k<=’z’;k++)
{
if(i!
=k&&j!
=k)
{
if(i!
=’x’&&k!
=’x’&&k!
=’z’)
printf(“顺序为:
\na-%c\tb-%c\tc-%c\n”,i,j,k);
}
}
}
}
第7章
7.1用筛选法求100之内的素数。
程序如下:
(方法一:
)
#include
#include
voidmain()
{
inti,j,a[100];
for(i=2;i<100;i++)
{
a[i]=i;
for(j=2;j<=i;j++)
{
if(j
if(a[i]%j==0)
break;
if(a[i]-j==0)
printf(“%5d”,a[i]);
}
}
printf(“\n”);
}
(方法二:
)
#include
#include
voidmain()
{
staticinti,j,k,a[98];
for(i=2;i<100;i++)
{
a[i]=i;
k=sqrt(i);
for(j=2;j<=a[i];j++)
if(jif(a[i]%j==0)
break;
if(j>=k+1)
printf(“%5d”,a[i]);
}
Printf(“\n”);
}
7.2用选择法对10个整数排序。
程序如下:
#include
voidmain()
{
inti,j,a[10],t;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
for(j=1;j<10;j++)
for(i=0;i<=9-j;i++)
if(a[i]>a[i+1])
{
t=a[i+1];
a[i+1]=a[i];
a[i]=t;
}
for(i=0;i<10;i++)
printf(“%5d”,a[i]);
}
7.3求一个3*3的整型矩阵对角线元素之和。
程序如下:
#include
voidmain()
{
inti,j,a[3][3],s1=0,s2=0;
printf(“请输入矩阵元素”);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf(“%d”,&a[i][j]);
for(i=0;i<3;i++)
{
s1=s1+a[i][i];
s2=s2+a[i][2-i];
}
Printf(“s1=%d,s2=%d”,s1,s2);
}
7.4已有一个忆排好序的数组,今输入一个数要求按原来的规律把它插入数组中。
程序如下:
#include
voidmain()
{
inti,j,t;
inta[10]={1,7,8,17,23,24,59,62,101};
scanf(“%d”,&a[9]);
for(i=9;i>0;i--)
if(a[i]{
t=a[i-1];
a[i-1]=a[i];
a[i]=t;
}
for(i=0;i<10;i++)
printf(“%5d”,a[i]);
printf(“\n”);
}
7.5将一个数组中的值按逆序重新存放。
例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。
程序如下:
#include
#defineN10
voidmain()
{
inti,b[N],temp;
for(i=0;iscanf(“%d”,&a[i]);
printf(“初始数组为:
”);
for(i=0;iprintf(“%5d”,a[i]);
printf(“\n”);
for(i=0;i{
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf(“交换后的数组为:
”);
for(i=0;iprintf(“%5d”,a[i]);
printf(“\n”);
}
7.6输出以下杨辉三角形(要求输出10行)
1
11
121
1331
14641
15101051
…
…
…
程序如下:
#include
#defineN11
voidmain()
{
inti,j,a[N][N];
for(i=1;i{
a[i][i]=1;
a[i][1]=1;
}
for(i=3;ifor(j=2;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i{
for(j=1;j<=i;j++)
printf(“%6d”,a[i][j]);
printf(“\n”);
}
Printf(“\n”);
}
7.7输出“魔方阵”。
所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。
例如,三阶魔方阵为:
816
357
492
要求输出1~n2的自然数构成的魔方阵。
程序如下:
#include
voidmain()
{
inta[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{
printf(“Entern(n=1~15)”);
scanf(“%d”,&n);
if((n!
=0)&&(n<=15)&&(n%2!
=0))
p=0;
}
for(i=1;i<=n;i++)/*初始化*/
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;/*建立魔方阵*/
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)
i=n;
if(j>n)
j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf(“%4d”,a[i][j]);
printf(“\n”);
}
}
7.8找出一个二维数组中的鞍点,即该位置上的元素在该行是大,该列最小。
也可能没有鞍点。
程序如下:
#include
#defineN5
voidmain()
{
inta[N][N],b[N],d[N][N],k=0,l=0;
inti,j;
for(i=0;ifor(j=0;jscanf(“%d”,&d[i][j]);
for(i=0;ifor(j=0;jfor(i=0,k=0;ifor(j=0;j{
if(a[i][j]>=a[i][j+1])
b[k]=a[i][j+1]=a[i][j];
else
b[k]=a[i][j+1];
}
for(j=0,l=0;jfor(i=0;i{
if(a[i][j]<=a[i+1][j])
c[l]=a[i+1][j]=a[i][j];
else
c[l]=a[i+1][j];
}
for(i=0,k=0;ifor(j=0,l=0;jif(d[i][j]-b[k]==0)
{
if(d[i][j]-c[l]==0)
printf(“d[%d][%d]=%d\n”,i,j,d[i][j]);
else
printf(“d[%d][%d]=%disnotandi\n”,i,j,d[i][j]);
}
}
7.9有15个数按由大到小的顺序放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值。
如果该数不在数组中,则输出“无此数”。
程序如下:
#include
voidmain()
{
inti,j,m,a[15]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812};
scanf(“%d”,&m);
printf(“原来的15个数为:
”);
for(i=0;i<15;i++)
printf(“%5d”,a[i]);
printf(“\n”);
i=7;
while(fabs(i-1)<8)
{
if(m{
if(a[i]-m==0)
{
printf(“itisat(%d)\n”,i+1);
break;
}
i--;
}
elseif(m>a[7])
{
if(a[i]-m==0)
{
printf(“itisan(%d)\n”,i+1);
break;
}
i++;
}
else
printf(“8\n”);
}
if(fabs(i-7)-8==0)
printf(“Thereisnot\n”);
}
7.10有一篇文章,共有3行文字,每行有80个字符。
要求分别统计出其中英文大写字母,小写字母,数字,空格以及其它字符的个数。
程序如下:
#include
voidmain()
{
inti,j=0,k=0,l=0,m=0,n=0;
charstr0[301],str1[100],str2[100],str3[100];
gets(str1);
gets(str2);
gets(str3);
strcat(str0,str1);
strcat(str0,str2);
strcat(str0,str3);
for(i=0;str0[i]!
=’\0’;i++)
{
if(str0[i]>=65&&str0[i]<=90)
j++;
elseif(str0[i]>=97&&str0[i]<=122)
k++;
elseif(str0[i]>=48&&str0[i]<=57)
l++;
elseif(str0[i]==32)
m++;
else
n++;