算法設(shè)計(jì)方法與優(yōu)化滕國(guó)文部分課后習(xí)題答案 _第1頁(yè)
算法設(shè)計(jì)方法與優(yōu)化滕國(guó)文部分課后習(xí)題答案 _第2頁(yè)
算法設(shè)計(jì)方法與優(yōu)化滕國(guó)文部分課后習(xí)題答案 _第3頁(yè)
算法設(shè)計(jì)方法與優(yōu)化滕國(guó)文部分課后習(xí)題答案 _第4頁(yè)
算法設(shè)計(jì)方法與優(yōu)化滕國(guó)文部分課后習(xí)題答案 _第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第二章:求值法

2-1.有三個(gè)數(shù)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個(gè)數(shù),求這些數(shù)中的最大值。

#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.判斷一個(gè)數(shù)n能否同時(shí)被3和5整數(shù)。

include"stdio.h"

intfun(intn)

(

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

returnn;

else

return0;

}

2-5.將100至200之間的素?cái)?shù)輸出。

#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.求兩個(gè)數(shù)m和n的最大公約數(shù)。

#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.使給定的一個(gè)4*4的二維數(shù)組轉(zhuǎn)置,即行列互換。

#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原數(shù)組:\n");

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

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

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

printf("\n");}

zhuan(a);

printf("\n轉(zhuǎn)置后的數(shù)組:\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個(gè)學(xué)生中成績(jī)高于80分者的學(xué)號(hào)和成績(jī)。

#include<stdio.h>

intmain()

(

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

printf("請(qǐng)輸入50個(gè)學(xué)生的成績(jī)");

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("這個(gè)學(xué)生的學(xué)號(hào)是%d,這個(gè)學(xué)生的成績(jī)是%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(“結(jié)果:%lf",sum);

return0;

)

2-11.輸出三角形的三邊長(zhǎng),試求三角形的面積。

#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由鍵盤輸入(假設(shè)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輸出成績(jī)等級(jí)“優(yōu)秀”、“良好”、“中等”?!凹案瘛保安患案瘛薄F渲?0分(含90分)

以上為優(yōu)秀,80-89分為良好,70-79分為“中等”,60-69分為“及格”,60分以下為不及

格。

#incluh>voidmain(){intscrnum;printf("請(qǐng)輸入考試成績(jī)");scantnum);if(scrnum>=

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

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

)

2?14?給定一個(gè)正整數(shù),求它的位數(shù)并分別輸出每一位數(shù)字。

#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.輸出所有水仙花數(shù)(水仙花數(shù)是指一個(gè)三位數(shù),其各個(gè)數(shù)字立方和等于它本身)。

#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數(shù)列前N個(gè)數(shù)。Fibonacci數(shù)列的特點(diǎn);第一個(gè)和第二個(gè)數(shù)都為1,從第

三個(gè)開始,每個(gè)數(shù)都等于其前兩個(gè)數(shù)的和。

#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以內(nèi)不能被3整除的數(shù)輸出。

#includeHstdio.h"

voidmain()

(

inti;

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

(

if(i%3!=0)

printf("%d\t"zi);

}

printf("\n");

}

2-19.班級(jí)有20名小學(xué)生,有語(yǔ)文,數(shù)學(xué),英語(yǔ)的成績(jī),求班級(jí)各科的平均分。

#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以內(nèi)的所有素?cái)?shù),并且5個(gè)一行。

#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以內(nèi)的可逆素?cái)?shù)。

#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.兩個(gè)數(shù)之差為2的素?cái)?shù),稱謂李生素?cái)?shù)。試輸出5組李生數(shù)。

#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以內(nèi)的對(duì)稱數(shù),并輸出對(duì)稱的個(gè)數(shù)。

2-24.輸入10個(gè)學(xué)生5門課的成績(jī),計(jì)算每個(gè)學(xué)生的平均分,每門課的平均分兵找出各門

課最高分?jǐn)?shù)所對(duì)應(yīng)的學(xué)生。

2-25.輸入一行字符,統(tǒng)計(jì)其中數(shù)字,空格,小寫字母,大寫字母以及其他符號(hào)的個(gè)數(shù)。

include"stdio.h"

voidmain()

(

chars;

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

printf("pleaseinputthestring\n");

while((s二getchar())!=\n')/*循環(huán)從鍵盤讀入字符直到一行結(jié)束(輸入回車)*/

(

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

(

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

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

i++;/*i存入字母數(shù)*/

}

elseif(s==『)j++;/*j存入空格數(shù),注意s==',里面是有一個(gè)空格的*/

elsei47)k++;/*k存入數(shù)字?jǐn)?shù)*/

elsem++;/*m存入其它符號(hào)數(shù)*/

)

printf("字符:%d大寫字母:%d小寫字母:%d\n空格:%d\n數(shù)字:%d\n其它:%d\n",i,da,xi

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

)

2-26.任意給定n值,按如下螺旋的方式輸出方陣:

n=3時(shí)輸出123

894

765

n=4時(shí)輸出

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.輸出魔方陣(魔方陣是它的每一行,每一列和對(duì)角線之和均相等的方陣)如三階魔方

陣為:

816

357

492

#include"stdio.h"

voidmain()

(

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

printf("輸入魔方陣的階數(shù)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編程打印形如下規(guī)律的n*n方陣?yán)缦聢D:使左對(duì)角線和右對(duì)角線上的元素為0,它

們上方的元素為1,左方的元素為2,下方元素為3,右方元素為4,下圖是一個(gè)符合條件的階矩

陣。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的結(jié)果是:%f\n",s);

}

voidmain()

{

p2();

}

3-3求100以內(nèi)所有素?cái)?shù)的和

#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輸入一個(gè)數(shù)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以內(nèi)所有的完全數(shù)的和(完全數(shù)是指一個(gè)數(shù)除其本身外的因子之和等于該數(shù)。

例如,28=1+2+4+7+14,因此28為完全數(shù)).

#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.計(jì)算S=l+2+3+?“+n+(n+l)+(n+2)+…在累加過(guò)程過(guò)程中,求當(dāng)S的值首次大于3000

時(shí)的n的n值是多少?

#includevoidmain()

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

{s+=n;n++;〃這句程序是怎樣實(shí)現(xiàn)功能的?}n--;〃這句程序放在這又有什么

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

)

3?24輸入一行字符,統(tǒng)計(jì)其中的英文字母?jìng)€(gè)數(shù)。提示:輸入到字符時(shí)停止輸入。

#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的值,根據(jù)輸入的n值,求前n項(xiàng)的和。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求這樣一個(gè)三位數(shù),該三位數(shù)等于其每位數(shù)字階乘之和

#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.老師給十個(gè)小孩分發(fā)糖果,第一個(gè)和第二個(gè)小孩各分一塊糖,之后為奇數(shù)的小孩可

得到前個(gè)奇數(shù)小孩的2倍糖果,為偶數(shù)的小孩可得到前個(gè)偶數(shù)小孩的3倍糖果。問(wèn)第9個(gè)、

第10個(gè)小孩各獲得多少糖果。

#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自守?cái)?shù)是指一個(gè)數(shù)的平方的尾數(shù)等于自身的自然數(shù)。例如:252=625,762=5776,937

62=87909376.請(qǐng)求出200000以內(nèi)的自守?cái)?shù)。

#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假設(shè)銀行一年整存零取的月息為0.63%。現(xiàn)在某人手中有一筆錢,他打算在今后的5

年中每年的年底取出1000元,到第五年剛好取完,請(qǐng)算出他存錢時(shí)應(yīng)存多少。

#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)所有整數(shù)中各個(gè)位上數(shù)字之積為x(X為一正整

數(shù))的整數(shù),然后輸出符合條件的整數(shù)個(gè)數(shù)作為函數(shù)值返回。例如,當(dāng)x為10時(shí),100-

999之間各個(gè)位上數(shù)字之積為10的整數(shù)有215,512共2個(gè)。

#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個(gè)\n,s(n));

4-20.編寫fun函數(shù),計(jì)算下式前n項(xiàng)的和作為函數(shù)返回值。

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.計(jì)算并輸出以下列數(shù)的前n項(xiàng)之積Sn,直到Sn-1大于q為止,q的值通過(guò)形參傳入(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,

則以上表達(dá)式為: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值為奇數(shù)的字符累乘,并將其乘積返回給主函數(shù)。

#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.已知數(shù)列{an},通項(xiàng)an=n*an求第n項(xiàng)的值

#include<stdio.h>

voidmain()

(

int=l,n;

printf("請(qǐng)輸入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("結(jié)果為%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有一組數(shù)規(guī)律如下:0,5,5,10,15,25,40,.,求出該數(shù)列第n項(xiàng)的數(shù)值。

#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一個(gè)富翁給他的兒子的四年大學(xué)生活存一筆錢,兒子每月只能取3000元作為下個(gè)月的

生活費(fèi),采用的是整存零取的方式。已知年利率為1.71%,請(qǐng)問(wèn)富翁一次性需要存入多少

#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問(wèn)題描述:x,y為整數(shù),求乂={2',3,僮>=0,丫>=0},輸入一個(gè)數(shù)n,求出元素從小到大排列

的雙募數(shù)列的第n項(xiàng)值,以及前n項(xiàng)和。

#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個(gè)數(shù)的平均值是:%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.求兩個(gè)數(shù)的最小公倍數(shù),兩個(gè)數(shù)由鍵盤輸入。

#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,寫出折半查找的遞歸算法(有一個(gè)數(shù)組A[10],里面存放了10個(gè)整數(shù),順序遞

歸。A[10]={2,3,5,7,8,10,12,15,19,21},任意輸入一個(gè)用數(shù)字n,用折半查找法找到n

位于數(shù)組中的位置。如果n不屬于數(shù)組A,顯示錯(cuò)誤提示。要求用遞歸的方法實(shí)現(xiàn)折半查

找。)

#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]);/*顯示數(shù)組A中的內(nèi)容*/

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個(gè)元素的值

(

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個(gè)全排列:%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;〃循環(huán)變量

int*A=NULL;

printf("你想要多少個(gè)隨機(jī)數(shù)?”);

scanf("%d",&n);

if(n<l)

n=l;

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

if(A==NULL)

(

printf("Outofmemory!\n");

exit⑴;

)

srand(time(NULL));〃產(chǎn)生0~999之間的n個(gè)隨機(jī)數(shù)

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;〃記錄總的棋盤狀態(tài)數(shù)

voidqu(inti);〃參數(shù)i代表行

intmain()

{

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

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

|

a「Line]=0;〃列標(biāo)記初始化,表示無(wú)列沖突

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

}〃主、從對(duì)角線標(biāo)記初始化,表示沒(méi)有沖突

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)〃如果無(wú)沖突

(

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

a[iColumn]=1;〃標(biāo)記,下一次該列上不能放皇后

b[i-iColumn+7]=l;〃標(biāo)記,下一次該主對(duì)角線上不能放皇后

c[i+iColumn]=1;〃標(biāo)記,下一次該從對(duì)角線上不能放皇后

if(i<7)

qu(i+l);〃如果行還沒(méi)有遍歷完,進(jìn)入下一行

else

printf("W%d種擺法!\n,,,++iQueenNum);

/*else

(

//intiLineJColumn;

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

〃printf("第%d種狀態(tài)為:\n'\++iQueenNum);

//getchar();

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

(

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

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

printfCXn");

)

}*/

〃如果前次的皇后放置導(dǎo)致后面的放置無(wú)論如何都不能滿足要求,則回溯,重置

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

a[iColumn]=0;

b[i-iColumn+7]=0;

c[i+iColumn]=0;

}

}

)

6-26.一個(gè)人趕著鴨子去每個(gè)村莊賣,每經(jīng)過(guò)一個(gè)村莊賣去所趕鴨子的一半多一只,這樣

他經(jīng)過(guò)了7個(gè)村子后還剩兩只鴨子,問(wèn)他出發(fā)時(shí)共趕了多少只鴨子?經(jīng)過(guò)每個(gè)村子賣出多

少只鴨子?

#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個(gè)可取的數(shù)

〃m表示待拆分的數(shù)值,start表示可拆分?jǐn)?shù)的起始值

(

inti,j;

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

(

a[k]=m-i;

b[k]=i;

〃記錄下有關(guān)數(shù)據(jù),a數(shù)組表示待拆分的數(shù),b數(shù)組表示參與拆分的數(shù)

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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論