算法设计方法与优化滕国文部分课后习题答案 _第1页
算法设计方法与优化滕国文部分课后习题答案 _第2页
算法设计方法与优化滕国文部分课后习题答案 _第3页
算法设计方法与优化滕国文部分课后习题答案 _第4页
算法设计方法与优化滕国文部分课后习题答案 _第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章:求值法

2-1.有三个数a,b,c,要求按从大到小的顺序把他们输出。

#include"stdio.h"

voidfun(inta,intb,intc)

(

intt;

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

{t=b;b=c;c=t;}

printf("%d,%d,%d",czb,a);

)

voidmain()

(

inta,b,c;

printf("inputnumber:");

scanf("%d%d%d",&a,&b/&c);

fun(a,b,c);

printf("\n");

)

2-2.给定n个数,求这些数中的最大值。

#incluh>voidmain()

{inti,j,temp,n;inta[1000];scanf("%d",n);for(i=0;scanf("%d"za[i]);for(j)

{f-j;i++)

{if(a[i]>a[i+l])

{temp=a[i];a[i]=a[i+1];a[i+l]=temp;}

printf("%d\n"za[n]);

)

2-3.求l+2+3+.・・+100的和。

#include"stdio.h"

voidmain()

(

intnum,sum=0;

for(num=l;num<=100;num++)

(

sum+=num;

)

printf("%d\n",sum);

2-4.判断一个数n能否同时被3和5整数。

include"stdio.h"

intfun(intn)

(

if(n%3==0&&n%5==0)

returnn;

else

return0;

}

2-5.将100至200之间的素数输出。

#include"stdio.h"

#include"math.h"

intisp(intm)

(

inti;

for(i=2;i<=sqrt(m);i++)

(

if(m%i==0)

return0;

)

return1;

)

voidmain()

(

intn;

for(n=100;n<=200;n++)

(

if(isp(n))

printf("%d\t",n);

)

)

2-6.求两个数m和n的最大公约数。

#include"stdio.h"

intnum(intmjntn)

(

intr,t;

if(m<n)

{t=m;m=n;n=t;}

r=m%n;

while(r)

m=n;

n=r;

r=m%n;

)

returnn;

}

voidmain()

{

intx,y,s;

printf("inputxandy:");

scanf("%d%d",&x,&y);

s=num(x,y);

printf("%d\n",s);

}

2-7.使给定的一个4*4的二维数组转置,即行列互换。

#include<stdio.h>

#definex4

inta[x][x];

voidmain()

(

voidzhuan(inta[x][x]);

intm,n;

printf("pleaseinput%dnubbers\n",x*x);

for(m=0;m<x;m++)

for(n=0;n<x;n++)

scanf("%d",&a[m][n]);

p门ntf(”\n原数组:\n");

for(m=0;m<x;m++)

{for(n=0;n<x;n++)

printf(“%5d”,a[m][n]);

printf("\n");}

zhuan(a);

printf("\n转置后的数组:\n");

for(m=0;m<x;m++)

{for(n=0;n<x;n++)

printf(“%5d”,a[m][n]);printf(“\n”);}

)

voidzhuan(inta[x][x])

(

intc,d,e;

for(c=0;c<x;c++)

for(d=c+l;d<x;d++)

{e=a[c][d];

a[c][d]=a[d][c];

a[d][c]=e;

2-8.输出50个学生中成绩高于80分者的学号和成绩。

#include<stdio.h>

intmain()

(

inta[10][5],i,j;

printf("请输入50个学生的成绩");

for(i=0;i<10;i++)

(

for(j=0;j<5;j++)

(

scanf("%d",&a[i][j]);

)

)

for(i=0;i<10;i++)

for(j=0;j<5;j++)

(

if(a[i]Ul>80)

(

printf("这个学生的学号是%d,这个学生的成绩是%d\n",i*l0+j+l,a[i]U]);

return0;

)

2-9.输出年份1990-2500中的所有闰年。

#include"stdio.h"

voidleap()

(

inty;

for(y=1990;y<=2500;y++)

(

jf((y%4==0&&y%100!=0)||y%400==0)

printf("%d",y);

)

printf("\n");

)

voidmain()

leap();

2-10.求1-1/2+1/3-1/4+...+1/99-1/100的值。

#include<stdio.h>

intmain()

doublesum;

inti;

for(sum=0J=l;i<=100;i++)

(

if(i%2==l)

(

sum+=1.0/i;

)

elseif(i%2==0)

(

sum-=1.0/i;

}

)

printf(“结果:%lf",sum);

return0;

)

2-11.输出三角形的三边长,试求三角形的面积。

#include"stdio.h"

#include"math.h"

voidmain()

(

intx,y,z,l;

doublearea;

printf("inputxandyandz:");

scanf("%d%d%d",&x,&y,&z);

l=(x+y+z)/2;

area=sqrt(l*(l-x)*(l-y)*(l-z));

printf("%.2f\n",area);

)

2-12.求ax2+bx+c=0方程的根,a,b,c由键盘输入(假设b2-4ac>0)

#include"stdio.h"

#include"math.h"

voidmain()

(

inta,bzc;

floatxl,x2;

printf("inputaandbandc:");

scanf("%d%d%d",&a,&b,&c);

xl=((-b)+sqrt(b*b-4*a*c))/(2*a);

x2=((-b)-sqrt(b*b-4*a*c))/(2*a);

if(b*b-4*a*c>=0&&a!=0)

printf("%.2f/%.2f\n",xl/x2);

else

printf("flase\n");

)

2-13输出成绩等级“优秀”、“良好”、“中等”。“及格”,“不及格”。其中90分(含90分)

以上为优秀,80-89分为良好,70-79分为“中等”,60-69分为“及格”,60分以下为不及

格。

#incluh>voidmain(){intscrnum;printf("请输入考试成绩");scantnum);if(scrnum>=

90){printf(“优秀\n”);}elseif(scrnum>=70printf("良好\n");}elseif

(scrnum>=6printf(“及格\n”);}elsei0){printf("不及格!\n“);}

)

2・14•给定一个正整数,求它的位数并分别输出每一位数字。

#include"stdio.h"

voidmain()

(

intn,i=0,k;

printf("inputn:");

scanf("%d",&n);

while(n!=0)

(

k=n%10;

printf(H%d",k);

n=n/10;

i++;

)

printf("\n%d\n"/i);

2・15.输出所有水仙花数(水仙花数是指一个三位数,其各个数字立方和等于它本身)。

#include"stdio.h"

voidmain()

(

inta,b,c,i;

for(i=100;j<=999;i++)

(

a=i/100;

b=(i%100)/10;

c=i%10;

if(i==a*a*a+b*b*b+c*c*c)

)

}

printf(H\n");

)

2・16.求1!+2!+3!+-.30!的值。

2・17.求Fibonacci数列前N个数。Fibonacci数列的特点;第一个和第二个数都为1,从第

三个开始,每个数都等于其前两个数的和。

#include"stdio.h"

#defineN100

voidmain()

(

intn,i,f[N];

f[O]=f[l]=l;

printf("inputn:");

scanf("%d"z&n);

for(i=2;i<n;i++)

f[i]=f[i-l]+f[i-2];

for(i=0;i<n;i++)

printf("%d\t",f[i]);

printf("\n");

2-18.把200以内不能被3整除的数输出。

#includeHstdio.h"

voidmain()

(

inti;

for(i=0;i<200;i++)

(

if(i%3!=0)

printf("%d\t"zi);

}

printf("\n");

}

2-19.班级有20名小学生,有语文,数学,英语的成绩,求班级各科的平均分。

#include"stdio.h"voidmain()

{inti;floatavgl,avg2,avg3,sl=0/s2=0,s3=0,a[20],b[20]zc[20];fori++)scanf(fo;i++)

{sl+=a[i];s2+=b[i];s3+=c[i];

}avgl=sl/20;avg2=s2/20;avg3=s3/20;printf("%f,%f,%f”,avgl,avg2,avg3);

)

2-20.输出100以内的所有素数,并且5个一行。

#include"stdio.hn

include"math.h"

intisp(intm)

(

inti;

for(i=2;i<=sqrt(m);i++)

if(m%i==O)

return0;

return1;

)

voidmain()

(

intn,k;

for(n=l;n<100;n++)

(

if(isp(n))

(

printf("%d\t",n);

k++;

if(k%5==0)

printf("\nH);

)

printf("\n");

)

2-21.输出1000到10000以内的可逆素数。

#include<stdio.h>

#include<math.h>

intinverse(intn);

intisPrimer(intn);

main()

(

inti;

for(i=1000;i<=10000;i++)

(

if(isPrimer(i))

{

if(isPrimer(inverse(i)))

printf("%d\n"J);

)

}

intinverse(intn)

intm=O,a;

for(;n>0;n/=10)

(

a=n%10;

m=m*10+a;

)

return(m);

)

intisPrimer(intn)

(

inti,judge=l;

for(i=2;i<=sqrt(n);i++)

{

if(n%i==0)

(

judge=0;

break;

}

)

returnjudge;

}

2-22.两个数之差为2的素数,称谓李生素数。试输出5组李生数。

#include"stdio.h"

main()

{intizj;intflag,n=O;inta[100];for(i=2;i

(

flag=l;f;j++)

{if(i%j==0)

{flag=0;break;

)

}if(flag==l)

{a[n]=i;n++;

)

}f;i++)

{for(j++)

{if(aD]-a[i]==2)

{printf("%d",a[i]);

printf("%d",a[j]);if(a[j+l]-a[j]==2)

{printf("%d",a[j+l]);

i=3;

}printf("\n");

)

2-23.试输出1000到10000以内的对称数,并输出对称的个数。

2-24.输入10个学生5门课的成绩,计算每个学生的平均分,每门课的平均分兵找出各门

课最高分数所对应的学生。

2-25.输入一行字符,统计其中数字,空格,小写字母,大写字母以及其他符号的个数。

include"stdio.h"

voidmain()

(

chars;

inti=0,j=0,k=0,m=0,da=0,xiao=0;

printf("pleaseinputthestring\n");

while((s二getchar())!=\n')/*循环从键盘读入字符直到一行结束(输入回车)*/

(

if((s<='z'&&s>='a')||(s<,Z,&&s>,A'))

(

if(sv=Z&&s>='A')da++;

if(s<='z'&&s>='a')xiao++;

i++;/*i存入字母数*/

}

elseif(s==『)j++;/*j存入空格数,注意s==',里面是有一个空格的*/

elsei47)k++;/*k存入数字数*/

elsem++;/*m存入其它符号数*/

)

printf("字符:%d大写字母:%d小写字母:%d\n空格:%d\n数字:%d\n其它:%d\n",i,da,xi

ao,j,k,m);/*打印行中的字母,空格,数字,其它字符数*/

)

2-26.任意给定n值,按如下螺旋的方式输出方阵:

n=3时输出123

894

765

n=4时输出

1234

1213145

1116156

10987

#include<stdio.h>

Voidspi(intn)

inti=-l/j=0,k=nza[100][100]/r,s=l,t=l;

while(s<=n*n)

(

for(r=0;r<k;r++)

(

i+=t;

a[j][i]=s++;

)

for(r=k;r<2*k-l;r++)

(

j+=t;

a[j][i]=s++;

)

k--;

t=-t;

)

for(i=0;i<n;i++)

(

for(j=0;j<n;j++)

printf("%3d",a[i][j]);

printf("\n");

)

)

voidmain()

(

intn;

printf("inputanumber");

scanf("%d",&n);

spi(n);

}

2-27.输出魔方阵(魔方阵是它的每一行,每一列和对角线之和均相等的方阵)如三阶魔方

阵为:

816

357

492

#include"stdio.h"

voidmain()

(

inta[50][50],n,x,y,i,j,k;

printf("输入魔方阵的阶数n:n");

scanf("%d"z&n);

if(n%2==0)n++;

for(i=l;i<=n;i++)

for(j=l;j<=n;j++)

a[i][j]=O;

i=l;j=(n+l)/2;a[i][j]=l;

for(k=2;k<=n*n;k++)

{i--;j++;

if((i<l)&&(j>n)){i+=2;j-;}

if(i<l)i=n;

if(j>n)j=l;

if(a[i][j]!=O){i+=2;j-;}

a[i][j]=k;

)

for(i=l;i<=n;i++)

for(j=l;j<=n;j++)

{printf("%3d",a[i][j]);

if(j==n)printf("\n");}

getchar();getchar();

}

2-28编程打印形如下规律的n*n方阵例如下图:使左对角线和右对角线上的元素为0,它

们上方的元素为1,左方的元素为2,下方元素为3,右方元素为4,下图是一个符合条件的阶矩

阵。0111020104220

442030403330

第三章:累加法

3-1编程求1-2+3-4+5-6+7-……+99-100。

#dio.h>main()

{inti,s;for(i100;i++){if(i%2!=0)

s+=i;elses-=i;

}printf("%d\n",s);getch();

)

3-2.1-1/2+1/3-1/4+--1/100

#tdio.h>

voidp2()

(

floats=0;

intp=-l;

for(101;i++){

P*=(-D;

s+=p*1.0/i;

)

printf("l-l/2+1/3-1/4+--1/100的结果是:%f\n",s);

}

voidmain()

{

p2();

}

3-3求100以内所有素数的和

#include<stdio.h>

intfun(intm)

{

for(inti=2;i<m;i++)

if(m%i==0)

return0;

return1;

)

voidmain()

(

inti;

for(i=2;i<=100;i++)

(

if(fun(i))

(

printf("%d\n",i);

)

)

)

3-10输入一个数n,求1+2+3+4+5+4+3+2+1的值

#include<stdio.h>

intfunfintn)

(

ints=0;

for(inti=l;i<=n;i++)

(

s+=i;

}

returns;

)

voidmain()

(

intn;

scanf("%d",&n);

printf("%d",2*fun(n)-n);

3-15求1000以内所有的完全数的和(完全数是指一个数除其本身外的因子之和等于该数。

例如,28=1+2+4+7+14,因此28为完全数).

#include<stdio.h>

intfun(intn)

(

ints=0;

for(inti=l;i<=n-l;i++)

(

if(n%i==0)

s=s+i;

)

if(s==n)

{

printf("%d*»;

returns;

}

else

return0;

}

voidmain()

(

intsum=0;

for(inti=l;i<=1000;i++){

sum+=fun(i);

}

printf("\n");

printf("%d\n”,sum);

)

3-19.计算S=l+2+3+・“+n+(n+l)+(n+2)+…在累加过程过程中,求当S的值首次大于3000

时的n的n值是多少?

#includevoidmain()

{intnzs;n=l,s=0;w0)

{s+=n;n++;〃这句程序是怎样实现功能的?}n--;〃这句程序放在这又有什么

用?printf("n=%d,s=%d\n,n,s);

)

3・24输入一行字符,统计其中的英文字母个数。提示:输入到字符时停止输入。

#include<stdio.h>

voidmain()

chara[100];

intcount=0J;

for(i=0;;i++)

a[i]=getchar();

if(a[i]=='\n-)

break;

if((a[i]>='a'&&a[i]<='z,)11(3[1]>=^'&&3[1]<=2'))

count++;

)

printf("%d",count);

)

3-30求e的值,根据输入的n值,求前n项的和。e=l+l/1I+1/2I+1/3!+...+l/n!o

#include<stdio.h>

floatfun(intn)

(

intp=l;

for(inti=l;i<=n;i++)

{

P*=i;

)

returnp;

}

voidmain()

(

intn;

floatsum=l;

scanf("%d",&n);

for(inti=l;i<=n;i++)

(

sum+=l/fun(i);

)

printf("%f",sum);

)

第四章:累乘法

4-6.已知s=l!*2!*3!*…*n!.

#include<stdio.h>

voidmain(){

inti=l,t=l,s=l;

while(s<2000000){

t*=i;

s*=t;

i++;

}

printf("n=%ds=%d\n"J-l,s/t);

)

4-13求这样一个三位数,该三位数等于其每位数字阶乘之和

#include<stdio.h>

floatfun(intn)

(

intp=l;

for(inti=l;i<=n;i++)

(

P*=i;

)

returnp;

}

voidmain()

(

intal,a2,a3;

for(inta=100;a<1000;a++)

(

al=a/100;

a2=a%100/10;

a3=a%10;

if(a==fun(al)+fun(a2)+fun(a3))

printf("%d",a);

)

)

4-15.老师给十个小孩分发糖果,第一个和第二个小孩各分一块糖,之后为奇数的小孩可

得到前个奇数小孩的2倍糖果,为偶数的小孩可得到前个偶数小孩的3倍糖果。问第9个、

第10个小孩各获得多少糖果。

#include<stdio.h>

voidmain(){

inti=l,j=l;

for(intk=3;k<ll;k++){

if(k%2==0)

j*=3;

else

i*=2;

}

printf("%d%d\n",i,j);

)

4-17自守数是指一个数的平方的尾数等于自身的自然数。例如:252=625,762=5776,937

62=87909376.请求出200000以内的自守数。

#include<stdio.h>

voidmain()

(

longi,i2,m,k=l;

for(i=0;i<=200000;i++)

while(i/k>0)

(

k*=10;

)

i2=i*i;

m=i2%k;

if(m==i)

',H

printf(%ld*%ld=%ld\n/i/i/i2);

)

}

4-18假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的5

年中每年的年底取出1000元,到第五年刚好取完,请算出他存钱时应存多少。

#include<stdio.h>

voidmain()

(

floata=0;

for(inti=l;i<=5;i++)

(

a=(a+1000)/(l+(0.0063*12));

}

printf("%f\n",a);

)

4-19.找出100-999之间(含100和999)所有整数中各个位上数字之积为x(X为一正整

数)的整数,然后输出符合条件的整数个数作为函数值返回。例如,当x为10时,100-

999之间各个位上数字之积为10的整数有215,512共2个。

#include<stdio.h>

ints(intn){

inta,b/cj=0;

for(inti=100;i<1000;i++){

a=i/100;

b=(i%100)/10;

c=i%10;

if(a*b*c==n){

j++;

printf("%d"J);

)

}

returnj;

}

voidmain(){

intn;

scanf("%d",&n);

printf("一共%€1个\n,s(n));

4-20.编写fun函数,计算下式前n项的和作为函数返回值。

S=(l*3)/22+(3*5)/42+(5*7)/62+...+((2n-l)*(2n+2))/(2n)2

include<stdio.h>

doublefun(intn){

doubleS=0;

for(inti=l;i<=n;i++){

floattl,t2;

tl=(2*i-l)*(2*i+l);

t2=4*i*i;

S+=tl/t2;

)

returnS;

}

voidmain(){

intn;

scanf("%d",&n);

printf("%f\n",fun(n));

)

4-23.计算并输出以下列数的前n项之积Sn,直到Sn-1大于q为止,q的值通过形参传入(q

为输入值)。

#include<stdio.h>

floatsum(intq){

intn=l;

floats=2/l;

while(s<q){

s+=(n+l)/n;

n++;

)

returns;

)

voidmain(){

intq;

scanf("%d",&q);

printf("Sn=%f\n"/sum(q));

}

4・24.求s=aa…aa・...・aaa-aa・a(此处aa...aa表示n和a,a和n的值在1-9之间),例如:a=3,n=6,

则以上表达式为:s=333333-33333-3333-333-33・3,其值为196298.

#include<stdio.h>

intfun(intajntn){

ints=a,sum二a;

for(inti=0;i<n-2;i++){

a*=10;〃得到303003000

s+=a;〃得至333333333;

sum+=s;//3+(3+30)+(3+30+300)

)

a*=10;

s+=a;

returns-sum;

)

voidmain(){

inta,n;

scanf(',%d%d",&a,&n);

printf("%d\n”,fun(a,n));

)

4-25将s所指字符串中ASCII值为奇数的字符累乘,并将其乘积返回给主函数。

#include<stdio.h>

#include<string.h>

voidmain()

(

chara[100];

gets(a);

intsum=l;

for(inti=O;i<strlen(a);i++)

{

if(a[i]%2!=0)

(

sum=sum*a[i];

)

)

printf("%d\rT,sum);

)

第五章:递推法

5・1.已知数列{an},通项an=n*an求第n项的值

#include<stdio.h>

voidmain()

(

int=l,n;

printf("请输入n:");

scanf("%d",&n);

for(i=l;i<=n;i++)

(

t=i*tl;

tl=t;

)

printf("%d\n"zt);

)

5-2

include<stdio.h>

voidfun(intn)

(

inti/c/a=l/b=l,s;

s=a+b;

for(i=3;i<=n;i++)

(

c=a+b;

s=s+c;

a=b;

b=c;

)

printf("%d"zs);

)

voidmain()

(

intn;

printf("inputn:");

scanf("%d",&n);

fun(n);

}

5-4.

#include<stdio.h>

voidmain(){

ints=0;

for(inti=l;i<100;i+=2){

intt=l;

for(intj=i;j<=i+2;j++){

t*=j;

)

s+=t;

)

printf("结果为%d\n”,s);

)

5-5.

#include<stdio.h>

intfun()

(

inti,a=10;

for(i=5;i>l;i-)

a=a+2;

returna;

}

intmain()

(

printf("%d\n",fun());

)

5-7有一组数规律如下:0,5,5,10,15,25,40,.,求出该数列第n项的数值。

#include<stdio.h>

voidfun(intn)

(

intal=0,a2=5,a3;

a3=al+a2;

for(inti=0;i<n-3;i++)

(

al=a2;

a2=a3;

a3=al+a2;

}

printf("%d\n"za3);

)

voidmain()

(

intn;

scanf("%d",&n);

fun(n);

}

5-8.

#include<stdio.h>

voidmain(){

inta[4][4]={{2},{6,2},{l,8,4},{l,5,6/8));

ints=2;

for(inti=l;i<4;i++){

intmin=a[i][0];

for(intj=O;j<=i;j++)

if(a[i][j]<min)

min=a[i][j];

//printf("\n");

〃printf("%d\n“,min);〃选择路径

s+=min;

)

printf(“最终得分:%d\n",s);

)

5-9一个富翁给他的儿子的四年大学生活存一笔钱,儿子每月只能取3000元作为下个月的

生活费,采用的是整存零取的方式。已知年利率为1.71%,请问富翁一次性需要存入多少

#include<stdio.h>

doublefun()

(

doublea=0;

inti;

for(i=l;i<=48;i++)

(

a=(a+3000)/(l+(0.0171/12));

H

printf(%.3f\n"za);

)

returna;

)

voidmain()

(

fun();

)

5-10.

#include<stdio.h>

voidtao()

(

intiza;

a=2;

for(i=9;i>=l;i-)

a=(a+l)*2+2;

printf("sum=%d\n"/a);

)

voidmain()

(

tao();

)

5-11.

#include<stdio.h>

intfun(intn){

ints[20],sum=0;

s[0]=3,s[l]=7;

for(inti=2;i<=n;i++){

s[i]=2*s[i-l]+s[i-2];

〃printf("%d\n,,,s[i]);

)

returns[n-l];

)

voidmain(){

intN;

scanf(“%d”,&N);

printf("%d\n",fun(N));

)

5-12.

#include<stdio.h>

voidmain()

(

inti,p,n,total;

scanf("%d%d”,&n,&p);

total=2*p;

for(i=p+l;i<=n;i++)

total+=i;

printf("%d\n"ztotal);

)

5-13问题描述:x,y为整数,求乂={2',3,僮>=0,丫>=0},输入一个数n,求出元素从小到大排列

的双募数列的第n项值,以及前n项和。

#include<stdio.h>

intmain()

(

intn/i=2/k=2/m=3za[100]={0,l},sum=0;

scanf("%d",&n);

while(i<=n)

(

//k=2;m=3;

if(k<m)

(

a[i++]=k;

k*=2;

)

else

{a[i++]=m;

m*=3;

)

}

for(i=l;i<=n;i++)

(

printf("%d\n"za[i]);

sum+=a[i];

)

printf("sum=%d\n"zsum);

return0;

}

5-15.

#include<stdio.h>

voidmain(){

ints[20],i;

s[l]=l,s[2]=2;

intn;

scanf("%d",&n);

for(i=3;i<=n;i++)

s[i]=s[i-l]+s[i-2]+l;

printf("%d\n"zs[n]);

)

5-21一张圆薄饼,切100刀,最多能切成多少块?

#include<stdio.h>

voidmain()

(

intn=100,a;

a=l+n*(n+l)/2;

printf("%d\n",a);

)

第六章:递归法

6-1.

#include<stdio.h>

floatAvg(inta。,intn);

floatAvg(inta[],intn)

(

if(n==0)returna[0];

elsereturnAvg(a,n-l)+a[n];

)

voidmain()

(

intarray[100];

intn;

scanf("%d",&n);

for(inti=0;i<n;i++)

(

scanf(-%i]);〃要这样输入吧

}//

Avg(array,n);

printf("这%d个数的平均值是:%f\n”,n,Avg(array,n-l)/n);

)

6-2.

#include<stdio.h>

voidmain()

intn;

longfun(intx);

scanf("%d"z&n);

printf("%ld\n",fun(n));

longfun(intx)

(

if(x==l){return1;}

returnx+fun(x-l);

)

6-3.

#include<stdio.h>

intFunc(intn)

(

if(n<2)

return1;

else

returnn*Func(n-l);

}

intmain()

(

intn;

printf("inputn:\n");

scanf("%d"z&n);

printf("n!=%d\n",Func(n));

return0;

)

6-4.

#include<stdio.h>

voidpermute(int);

#defineN7

inta[N];

intn=0;

voidmain()

(

inti;

for(i=0;i<N;i++)

(

a[i]=i+l;

)

permute(N);

printf("totalis:%d\n",n);

}

voidpermute(intk)

inti,j,temp;

if(k==l)

for(i=0;i<N;i++)

(

printf("%d"za[i]);

)

printf(".\t");

n++;

if(n%4==0)

(

printf("\n");

)

)

else

(

permute(k-l);

for(j=N-k+l;j<N;j++)

(

temp=a[N-k];

a[N-k]=a[j];

a[j]=temp;

permute(k-l);

temp=a[N-k];

a[N-k]=a[j];

a[j]=temp;

6-5.

#include<stdio.h>

ints[100];

voidComb(intstep,intn,intk)

(

inti;

if((k==0)11((n-step+1)==k)){

for(i=step;i<=n;i++)s[i]=(k!=0);

for(i=1;i<=n;i++)

if(s[i])printf("%-3d"zi);

printf("\n");

return;

}

s[step]=1,Comb(step+1,n,k-1);

s[step]=0,Comb(step+1,n,k);

voidmain()

(

intn,m;

scanf("%d%d",&n,&m);

Comb(l,n,m);

}

6-6.求两个数的最小公倍数,两个数由键盘输入。

#include<stdio.h>

intfun(inta,intm,intn)

(

if(a%n)returnfun(a+m,m,n);

else

returna;

)

intmain()

(

intm,n,a;

scanf("%d%d"z&n,&m);

a=n;

printf("%d\n"zfun(a,n,m));

return0;

}

6-7.

#include<stdio.h>

voidmain()

(

intx,r;s=O;

scanf("%d",&x);

while(x>0)

(

r=x%10;

s=s+r;

x=x/10;

)

printf("%d\n"zs);

)

6-8.

#include<stdio.h>

main()

{intnumber,b[30];

inti=0,n;

printf("lnputanumber:");

scanf("%d",&number);

while(number!=O)

{b[i]=number%2;

number=number/2;

i++;

)

n=i-l;

for(i=n;i>=0;i-)

printf("%d"zb[i]);

printf("\n");

)

6-12.

#include<stdio.h>

intfunc(intnjntk,intmin)

(

int\,count;

if(k==2)

(

if((i=(n+l)/2-min-l)>0)

returni;

else

return0;

}

else

(

count=0;

for(i=min+l;i<n/2.0;i++)

(

count+=func(n-i/k-l,i);

)

retum(count);

}

}

intmain()

(

intn,k,i,count;

count=0;

printf("PleaseInputbN:");

scanf("%d",&n);

if(n<l)

(

printf("lnvalidlnput!\n");

return(-l);

printf("PleaseInputK:");

scanf("%d",&k);

if(k<l)

(

printf("lnvalidlnput!\n");

return(-2);

)

count=func(n,k,0);

printf("count:%d\rT,count);

return(O);

)

6-14,写出折半查找的递归算法(有一个数组A[10],里面存放了10个整数,顺序递

归。A[10]={2,3,5,7,8,10,12,15,19,21},任意输入一个用数字n,用折半查找法找到n

位于数组中的位置。如果n不属于数组A,显示错误提示。要求用递归的方法实现折半查

找。)

#include<stdio.h>

intbin_search(intkey[],intlow,inthighjntk)

(

intmid;

if(low>high)return-1;

else{

mid=(low+high)/2;

if(key[mid]==k)

returnmid;

if(k>key[mid])

在序列的后半部分查找*/

returnbin_search(key,mid+lzhigh,k);/*

else

在序列的前半部分查找*/

returnbin_search(key,lowzmid-l,k);/*

)

}

intmain()

(

intn,i,addr;

intA[10]={2,3,5,7,8,10,12,15,19,21);

printf("ThecontentsoftheArrayA[10]are\n");

for(i=0;i<10;i++)

printf("%d",A[i]);/*显示数组A中的内容*/

printf("\nPleaseinputaintergerforsearch\n");

scanf("%d/*输入待查找的元素*/

addr=bin_search(A,0,9,n);

if(-l!=addr)/*查找成功*/

printf("%disatthe%dthunitisarrayA\n",n,addr);

eIseprintf("Thereisno%dinarrayA\n",n);/*查找失败*/

getchar();

return0;

6-16.

include<stdio.h>

#defineN10

doubleaverage(inta[],intn)

(

if(n==1)

returna[0];

else

return((n-1)*average(a,n-1)+a[n-1])/n;

)

intmain()

(

inta[N]={73,39,43,71,11,7,69,77,100,96};

doubleaver;

aver=average(a,N);

printf(”%lf\n”,aver);

)

6-17.

#include<stdio.h>

#include<stdlib.h>

intY(inti,intn)〃递归求第n行第i个元素的值

(

if(i==111i==n)

return1;

else

returnY(i,n-l)+Y(i-l,n-l);

)

voidYangHui(intn)

(

intx,y;

for(y=1;y<=n;y++)

(

for(x=y;x<=n;x++)

printf("");

for(x=1;x<=y;x++)

printf("%3d",Y(x,y));

printf(H\n");

)

}

intmain()

YangHui(9);

return0;

}

6-19.

#include<stdio.h>

voidtrans(unsignedlongn)

(

unsignedm;

if(n==0)

return;

m=n%8;

trans(n/8);

H

pnntf(%u"zm);

}

intmain(void){

unsignedlongn;

printf("inputadata:");

scanf("%d",&n);

trans(n);

printf("\n");

return0;

}

6-20.

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

voidswap(char*a,char*b)

(

chart=*a;

*a=*b;

*b=t;

)

voidpermutation(char*str,constintindex,constintlength)

(

if(index==length)

(

staticintcounter=1;

printf("第%d个全排列:%s\n",counter++,str);

}else

(

inti=index;

for(i=index;i<=length;i++)

swap(str+index,str+i);

permutation(str;index+1,length);

swap(str+index,str+i);

)

)

)

voidAIIRange(char*str)

(

permutation(str,0,strlen(str)-1);

)

intmain()

(

charstr[]=,,123";

AIIRange(str);

system("pause");

)

6-21.

#include<stdio.h>

include<stdlib.h>

//#include<time.h>

voidfind_min(int*data,int*min,intposition)

(

inttemp;

if(position<8)

(

if(data[position]<*min)

(

temp=*min;

*min=data[position];

data[position]=temp;

)

position++;

find_min(data,min,position);

)

)

voidmain()

{

intdata[8]={25,7,48,37,12,92,86,33);

intmin;

/*

intdata[100];

intn=0;

inti=0;〃循环变量

int*A=NULL;

printf("你想要多少个随机数?”);

scanf("%d",&n);

if(n<l)

n=l;

A=(int*)malloc(n*sizeof(int));

if(A==NULL)

(

printf("Outofmemory!\n");

exit⑴;

)

srand(time(NULL));〃产生0~999之间的n个随机数

for(i=0;i<n;i++)

(

A[i]=rand()%1000;

}7

min=data[0];

find_min(dataz&min,O);

//printf("%3d",data[n]);

printf("Theminis=%d\n",min);

//getch();

}

6-25.

#include<stdio.h>

staticcharQueen⑻[8];

staticinta[8];

staticintb[15];

staticintc[15];

staticintiQueenNum=0;〃记录总的棋盘状态数

voidqu(inti);〃参数i代表行

intmain()

{

intiLine/Column;〃棋盘初始化,空格为*,放置皇后的地方为@

for(iLine=0;iLine<8;iLine++)

|

a「Line]=0;〃列标记初始化,表示无列冲突

for(iColumn=0;iColumn<8;iColumn++)Queen[iLine][iColumn]='*';

}〃主、从对角线标记初始化,表示没有冲突

for(iUne=0;iLine<15;iLine++)

b[iLine]=c[iLine]=O;

qu(o);

return0;

)

voidqu(inti)

intiColumn;

for(iColumn=0;iColumn<8;iColumn++)

(

if(a[iColum-iColumn+7iColumn]==0)〃如果无冲突

(

Queen「][iColumn]二@;〃放皇后

a[iColumn]=1;〃标记,下一次该列上不能放皇后

b[i-iColumn+7]=l;〃标记,下一次该主对角线上不能放皇后

c[i+iColumn]=1;〃标记,下一次该从对角线上不能放皇后

if(i<7)

qu(i+l);〃如果行还没有遍历完,进入下一行

else

printf("W%d种摆法!\n,,,++iQueenNum);

/*else

(

//intiLineJColumn;

//printf("共有%:1种摆法!\n",++iQueenNum);

〃printf("第%d种状态为:\n'\++iQueenNum);

//getchar();

/*for(iLine=0;iLine<8;iLine++)

(

for(iColumn=0;iColumn<8;iColumn++)

printf("%c",Queen[iLine][iColumn]);

printfCXn");

)

}*/

〃如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置

Queen[i][iColumn]='*';

a[iColumn]=0;

b[i-iColumn+7]=0;

c[i+iColumn]=0;

}

}

)

6-26.一个人赶着鸭子去每个村庄卖,每经过一个村庄卖去所赶鸭子的一半多一只,这样

他经过了7个村子后还剩两只鸭子,问他出发时共赶了多少只鸭子?经过每个村子卖出多

少只鸭子?

#include<stdio.h>

intfun(intnJntm)

(

inti;

if(n==m)

return2;

elsereturn((fun(n+l,m)+l)*2);

intmain()

(

inti;

printf(H%d\nH,fun(l,7));

for(i=l;i<=7;i++)

{printf("%d”,fun(l,i));

//printf("\n%d"JunflJJ/Z+l);

)

printf("\nH);

for(i=l;i<=7;i++)

(

printf("%d"zfun(l,i)/2+l);

)

return0;

)

6-27.

#include<stdio.h>

#include<stdio.h>

#include"stdio.h"

#defineMAX1000

inta[MAX],b[MAX];

intn;

voidfind(intmjntstart,intk)〃探求第k个可取的数

〃m表示待拆分的数值,start表示可拆分数的起始值

(

inti,j;

for(i=start;i<=m/2;i++)

(

a[k]=m-i;

b[k]=i;

〃记录下有关数据,a数组表示待拆分的数,b数组表示参与拆分的数

printf("%d=",n);

for(j=l;j<=k;j++)

printf("%d+",b[k]);

printf("%d\n",a[k]);

find(a[k],i/k+l);

}

return;

)

intmain(void)

(

printf("PleaseinputN:");

scanf("%d",&n);

find(n,l,l);

,

printf("%d=%d\n'/n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论