C语言参考答案

第四章 顺序结构程序设计
1. 单项选择题

(1)【答】D

(2)【答】B

(3)【答】scanf()函数中没有精度控制。本题答案为D。

(4)【答】D

(5)【答】D

(6)【答】C

(7)【答】C

(8)【答】D

(9)【答】① B ② A

(10)【答】输入的数据与scanf()函数的格式不匹配。本题答案为D。

(11)【答】① A ② B

(12)【答】C

(13)【答】C

(14)【答】A

(15)【答】A

(16)【答】B

(17)【答】D

2. 填空题

(1)【答】3.141593,3.1416,3.142

(2)【答】3.500000,3.5

(3)【答】31.415920,3.141592e+001

(4)【答】127, 127, 177, 7f, 127

(5)【答】127,127 ,177 ,7f ,127

(6)【答】c=K

(7)【答】a=12,b=345

(8)【答】c=A

(9)【答】n=64

(10)【答】x= 1.23,y= 50.00

(11)【答】a=3 b=7x=8.5 y=71.82c1=A c2=a↙

3. 编程题

(1)编写一个程序,求出任一输入字符的ASCII码。

【解】程序如下:

#include

main()

{

char c;

printf("输入字符:");

scanf("%c",&c);

printf("字符%c的ASCII码为%d\n",c,c);

}

(2)编写一个程序,输入一个字符,依次输出其前导字符、该字符和后续字符。

【解】程序如下:

#include

main()

{

char c;

printf("输入一个字符:");

scanf("%c",&c);

printf("输出结果:%c,%c,%c\n",c-1,c,c+1);

}

(3)编写一个程序,输出任意一个十进制整数对应的八进制数和十六进制数。

【解】直接使用printf()的格式符输出八进制数和十六进制数。程序如下:

#include

main()

{

int i;

printf("输入一个整数:");

scanf("%d",&i);

printf("%d(10)<=>%o(8)\n",i,i);

printf("%d(10)<=>%x(16)\n\n",i,i);

}

(4)编写一个程序,从键盘输入圆锥体的半径r和高度h,计算其体积。

【解】圆锥体体积的计算公式为:

v=π×r×r×h/3

程序如下:

#include

main()

{

float r,h,pi=3.1415,v;

printf("圆锥半径,高度:");

scanf("%f,%f",&r,&h);

v=pi*r*r*h/3.0;

printf("圆锥体积=%g\n\n",v);



}
1. 单项选择题

(1)【答】A

(2)【答】C

(3)【答】选项B、C、D中的比较运算符不正确,在选项A中,a=b返回b,若b为0或空字符,则为假,否则为真。本题答案为A。

(4)【答】B。应改为if (x=y && x!=0) x+=y;

(5)【答】D

(6)【答】① A ② A

(7)【答】① D ② C

(8)【答】A

2. 填空题

(1)【答】x % 2 == 0

(2)【答】a % b == 0

(3)【答】a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a

(4)【答】(a+b
(5)【答】k=2,执行case 2分支,k++返回2,此时k=3,输出2,后跟一空格。由于没有break语句,继续执行case 3分支

,k++返回3,此时k=4,输出3,由于有break语句,退出switch语句。所以输出为:2 3。

(6)【答】a>0,s变为2。a>b为真,t=t+s=3。所以输出为:s=2,t=3。

(7)【答】k=2,执行case 2分支,k++返回2,此时k=3,屏幕输出2,后跟一空格。由于没有break语句,继续执行case 3分支,k++返回3,此时k=4,屏幕输出3,由于没有break语句,继续执行case 4分支,k++返回4,此时k=5,屏幕输出4,由于有break语句,退出switch语句。所以输出为:2 3 4。

(8)【答】x=0,执行外层switch语句的case 0部分,y==2为真,则执行里层switch语句的case 1部分,输出“*”,遇到break语句,退出里层的switch语句,由于里层的switch语句之后没有break语句,所以转而执行外层switch语句的case 1部分,这时z=3,故执行里层switch语句的default部分,输出“#”,整个程序执行完毕。所以输出为:*#。



3. 编程题

(1)编写一个程序判断用户输入的字符是数字字符、字母字符还是其他字符。

【解】在'0'到'9'之间的为数字字符,在'a'到'z'或'A'到'Z'之间的为字母字符;否则为其他字符。程序如下:

#include

main()

{

char c;

printf("输入一个字符:");

scanf("%c",&c);

if (c>='0' && c<='9')

printf("\n%c是数字字符\n\n",c);

else if ((c>='a' && c<='z') || (c>='A' && c<='Z'))

printf("\n%c是字母字符\n\n",c);

else

printf("\n%c是其他字符\n\n",c);

}

(2)假设今天是星期日,编写一个程序,求123456天后是星期几。

【解】星期是7天一个轮回,由于今天是星期日,所以123456除以7的余数即为星期几。程序如下:

#include

main()

{

int n=123456;

n=n%7;

printf("\n星期");

switch(n)

{

case 0: printf("天");

break;

case 1: printf("一");

break;

case 2: printf("二");

break;

case 3: printf("三");

break;

case 4: printf("四");

break;

case 5: printf("五");

break;

case 6: printf("六");

break;

}

printf("\n\n");

}

(3)编写一个程序,输入年号和月份,判断该年是否为闰年,并根据给出的月份判断是什么季节和该月有多少天?闰年的条件是年号能被4整除但不能被100整除,或者能被400整除。

【解】直接根据闰年的定义求解,如果是闰年,2月份为29天;否则为28天,其他月份相同。规定3~5月为春季,6~8月为夏季,9~11月为秋季,1、2和12月为冬季。本题程序如下:

#include

main()

{

int y,m,leap,season,days;

printf("年份,月份:");

scanf("%d,

%d",&y,&m);

if ((y%4==0 && y0!=0) || (y@0==0))

leap=1;

else

leap=0;

if (m>=3 && m<=5)

season=1;

else if (m>=6 && m<=8)

season=2;

else if (m>=9 && m<=11)

season=3;

else

season=4;

switch (m)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:days=31;break;

case 4:

case 6:

case 9:

case 11:days=30;break;

case 2: if (leap==1)

days=29;

else

days=28;

}

printf("%d年%s闰年\n",y,(leap==1 ? "是" : "不是"));

printf("该季度是");

switch(season)

{

case 1:printf("春季\n");break;

case 2:printf("夏季\n");break;

case 3:printf("秋季\n");break;

case 4:printf("冬季\n");break;

}

printf("当月天数:%d\n",days);

}

(4)报数游戏。A、B、C、D、E、F、G、H共8人站成一排,按图4.1所示的方法从1开始报数。问谁先报到123456?

A B C D E F G H

1→ 2→ 3→ 4→ 5→ 6→ 7→ 8

14←13←12←11←10← 9

15→16→17→18→19→20→21→22

28←27←26←25←24←23

29→30→…

图4.1 游戏报数过程

【解】从图4.1中看到1到14是一个来回,再重复这一过程,所以只需对123456除以14的余数加以判断即可。程序如下:

#include

main()

{

int n=123456,i;

i=n;

printf("\n报数到%d的人是",n);

switch(i)

{

case 1: printf("A");break;

case 2:case 14: printf("B");break;

case 3:case 13: printf("C");break;

case 4:case 12: printf("D");break;

case 5:case 11: printf("E");break;

case 6:case 10: printf("F");break;

case 7:case 9: printf("G");break;

case 8: printf("H");break;

}

printf("\n");

}

程序的运行结果:

报数到123456的人是D

(5)编写一个程序,求ax2+bx+c=0方程的根。

【解】先计算d=b2-4ac,再根据d是大于0、等于0还是小于0分别求根。程序如下:

#include

#include

int func(float a,float b,float c,float *x1,float *x2)

{

float d;

d=b*b-4*a*c;

if (d>0)

{

*x1=(-b+sqrt(d))/(2*a);

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

return 2;

}

else if (d==0)

{

*x1=(-b)/(2*a);

return 1;

}

else return 0;

}

main()

{

float a,b,c,x1,x2,n;

printf("输入a,b,c:");

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

n=func(a,b,c,&x1,&x2);

if (n==2)

{

printf("两个根:\n");

printf("\tx1=%f\n",x1);

printf("\tx2=%f\n",x2);

}

else if (

n==1)

{

printf("一个根:\n");

printf("\tx=%f\n",x1);

}

else printf("没有根\n");



}


【第六章 循环】练习题答案(2011-05-07 09:25:23)转载▼标签: 杂谈 分类: C语言教学
1. 单项选择题

(1)【答】!e等价于!(e!=0),即e==0。本题答案为A。

(2)【答】D

(3)【答】D

(4)【答】A

(5)【答】C

(6)【答】A

(7)【答】A

(8)【答】B

(9)【答】C

2. 填空题

(1)【答】s=7

(2)【答】执行第1次循环时,i++返回1,i=2,s=3+1=4,执行else部分,i=3;执行第2次循环时,i++返回3,i=4,s=4+3=7,执行if部分;执行第3次循环时,i++返回4,i=5,s=7+4=11,执行else部分,i=6;执行第4次循环时,i++返回6,i=7,s=11+6=17,执行else部分,i=8,此时while条件不满足,退出循环。所以输出结果为:8。

(3)【答】使用两重循环。本题答案为:

*

**

***

****

(4)【答】使用两重循环。本题答案为:

1

2 2

3 3 3

4 4 4 4

5 5 5 5 5

6 6 6 6 6 6

(5)【答】使用两重循环。本题答案为:

1

1 2 1

1 2 3 2 1

1 2 3 4 3 2 1

1 2 3 4 5 4 3 2 1

1 2 3 4 5 6 5 4 3 2 1

(6)【答】使用两重循环。本题答案为:

*

* * *

* * * * *

* * * * * * *

* * * * *

* * *

*



3. 编程题

(1)编写一个程序,求s=1-1/2+1/3-1/4…+1/99+1/100之值。

【解】使用一个for循环即可。程序如下:

#include

main()

{

int i;

float s;

s=0;

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

{

if (i%2==0)

s=s-1.0/i;

else

s=s+1.0/i;

}

printf("s=%f",s);

}

程序运行结果:

s=0.688172

(2)编写一个程序,求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值。

【解】采用两层循环求解,外层i从1到n,里层从1到i。程序如下:

#include

main()

{

int i,j,s1,s=0,n;

printf("输入n:");

scanf("%d",&n);

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

{

s1=0;

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

s1=s1+j;

s=s+s1;

}

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

}

(3)编写一个程序,用户输入一个正整数,把它的各位数字前后颠倒一下,并输出颠倒后的结果。

【解】对于正整数n,从高位到低位依次计算出它的各位上的数字d,在计算出d后立即输出该数字,输出序列构成的数正好是n的各位数字前后颠倒的结果。程序如下:

#include

main()

{

int n,d;

printf

("输入一个正整数:");

scanf("%d",&n);

printf("颠倒结果:");

do

{

d=n;

printf("%d",d);

n=n/10;

} while (n!=0);

printf("\n\n");

}

(4)编写一个程序,求输入的三个正整数的最小公倍数。

【解】采用穷举法求解。输入三个整数分别为x,y和z,该最小公倍数一定是x的倍数。程序使用while循环,倍增x查找满足s % y == 0 && s % z == 0条件的s。程序如下:

#include

main()

{

int x,y,z,s;

printf("输入三个整数=>x,y,z:");

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

s=x;

while (1)

{

if (s%y==0 && s%z==0)

break;

s+=x;

}

printf("最小公倍数:%d\n",s);

}

(5)编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12。

【解】采用穷举法求解。使用两重for循环嵌套语句,i、j、k分别表示该数的百位数、十位数、个位数,i只能是2,j和k进行循环。程序如下:

#include

main()

{

int i,j,k;

i=2;

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

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

if (i*j*k==42 && i+j+k==12)

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

}

(6)编写一个程序,求出满足下列条件的四位数:该数是个完全平方数,且第一、三位数字之和为10,第二、四位数字之积为12。

【解】采用穷举法求解。该数是一个四位数,其平方数只能在32到99之间,使用一个for循环即可。程序如下:

#include

main()

{

int i,j,a,b,c,d;

for (i=32;i<=99;i++)

{

j=i*i;

a=j/1000;

b=j/100-a*10;

c=j/10-a*100-b*10;

d=j-a*1000-b*100-c*10;

if (a+c==10 && b*d==12)

printf("%d ",j);

}

}

(7)编写一个程序,求e的值。



【解】采用do-while循环语句,程序如下:

#include

main()

{

float t,e=0;

int n=2;

t=1;

do

{

e+=t;

t=t/n++;

} while (t>1.0e-6);

printf("e=%f\n",e);

}

(8)编写一个程序,从键盘输入一个整数,将每位数字转变为英文,如输入9124,则输出:nine,one,two,four。

【解】使用一个for循环获取输入的每个数字,然后使用switch语句进行转变。程序如下:

#include

main()

{

char c;

int i;

printf("输入一个数:");

for (i=0;(c=getchar())!='\n';i++)

{

if (i>0) printf(",");

switch(c)

{

case '0':printf("zero");break;

case '1':printf("one");break;

case '2':printf("two");break;

case '3':p

rintf("three");break;

case '4':printf("four");break;

case '5':printf("five");break;

case '6':printf("six");break;

case '7':printf("serven");break;

case '8':printf("eight");break;

case '9':printf("nine");break;

}

}

printf("\n");

}

(9)某人摘下一些桃子,卖掉一半,又吃了一只;第二天卖掉剩下的一半,又吃了一只;第三天、第四天、第五天都如此办理,第六天一看,发现就剩下一只桃子了。编写一个程序,采用迭代法问某人共摘了多少只桃子。

【解】经分析有:

第6天的桃子数: 1

第5天的桃子数: (1+1)*2=4

第4天的桃子数: (4+1)*2=10

第3天的桃子数: (10+1)*2=22

第2天的桃子数: (22+1)*2=46

第1天的桃子数: (46+1)*2=94

迭代变量为n,迭代初值为1,迭代表达式为(n+1)*2,迭代条件为5≥i≥1。程序如下:

#include

main()

{

int i,n=1;

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

n=(n+1)*2;

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



}
【第七章 数组】C语言练习题答案(2011-05-14 07:57:18)转载▼标签: 杂谈 分类: C语言教学
1. 单项选择题

(1)【答】C

(2)【答】B

(3)【答】B

(4)【答】D

(5)【答】D

(6)【答】C

(7)【答】C

(8)【答】C

(9)【答】D

(10)【答】D

(11)【答】C

(12)【答】B

(13)【答】B

(14)【答】C

(15)【答】B

(16)【答】B

(17)【答】D

(18)【答】B

(19)【答】B

2. 填空题

(1)【答】Language

(2)【答】123

(3)【答】s=15

(4)【答】s=45

(5)【答】place=6

(6)【答】a(1,1)=-5

(7)【答】第9个元素(1,3)值是-3

(8)【答】-9是第6个元素

(9)【答】12

(10)【答】①s[j++]=s[i] ②s[j]='\0'



3. 编程题

(1)编写一个程序,将两个字符串合并成一个字符串。

【解】程序如下:

#include

main()

{

char s1[20],s2[20],s3[40];

int i,j;

printf("字符串1:");

gets(s1);

printf("字符串2:");

gets(s2);

for (i=0;s1[i]!='\0';i++)

s3[i]=s1[i];

for (j=0;s2[j]!='\0';j++)

s3[i+j]=s2[j];

s3[i+j]='\0';

printf("合并字符串:%s\n",s3);

}

(2)编写一个程序,将一个子字符串插入到主字符串中指定位置。

【解】程序如下:

#include

main()

{

int n,i,j,k;

char s1[20],s2[20],s3[40];

printf("主字符串:");

gets(s1);

printf("子字符串:");

gets(s2);

printf("起始位置:");

scanf("%d",&n);

for (i=0;i
s3[i]=s1[i];

for (j=0;s2[j]!='\0';j++)

s3[i+j]=s2[j];

printf("i=%d,j=%d

\n",i,j);

for (k=n;s1[k]!='\0';k++)

s3[j+k]=s1[k];

s3[j+k]='\0';

printf("结果字符串:%s\n",s3);

}

(3)编写一个程序,输出一个字符串的逆转串。

【解】程序如下:

#include

main()

{

char s1[20],s2[20];

int i,j;

printf("字符串:");

scanf("%s",s1);

for (i=0;s1[i]!='\0';i++);

for (j=0;s1[j]!='\0';j++)

s2[i-j-1]=s1[j];

s2[i]='\0';

printf("逆转串:%s\n",s2);

}

(4)编写一个程序,判定一个字符串是否是另一个字符串的子串。

【解】程序如下:

#include

main()

{

int i,j,k,index;

char s1[20],s2[20];

printf("主字符串:");

gets(s1);

printf("子字符串:");

gets(s2);

index=0;

for (i=0;s1[i];i++)

{

for (j=i,k=0;s1[j]==s2[k];j++,k++)

if (!s2[k+1])

{

index=i;

break;

}

if (index!=0)

break;

}

printf("位置=%d\n",index);

}

(5)编写一个程序,计算一个字符串中子串出现的次数。

【解】程序如下:

#include

main()

{

int i,j,k,count=0;

char s1[20],s2[20];

printf("主字符串:");

gets(s1);

printf("子字符串:");

gets(s2);

for (i=0;s1[i];i++)

for (j=i,k=0;s1[j]==s2[k];j++,k++)

if (!s2[k+1])

count++;

printf("出现次数=%d\n",count);

}

(6)编写一个程序,计算一个3×4阶矩阵和一个4×3阶矩阵相乘,并打印出结果。

【解】使用两个二维数组a和b存储两个3×4阶矩阵的元素值,然后用三重for循环进行相乘求值产生二维数组c,最后输出c的各元素值。程序如下:

#include

main()

{

int a[3][4]={{2,3},{4,2},{1,2,3}};

int b[4][3]={{1,2,3},{2,3,4},{3,4,5}};

int c[3][3],i,j,k,s;

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

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

{

s=0;

for (k=s=0;k<4;k++)

s+=a[i][k]*b[k][j];

c[i][j]=s;

}

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

{

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

printf("M",c[i][j]);

printf("\n");

}

}

(7)已知某班30个学生的姓名、学号,以及英语、程序设计、数学三门课的成绩,编写一个程序,完成下列工作:

· 全班每个学生姓名、学号和三门课成绩的输入及总分计算。

· 统计各科的总成绩。

· 当给出学生姓名或学号时,检索出该生每门功课的成绩及总成绩。

【解】定义一维数组no存储学生学号,二维数组name存储学生姓名,二维数组degree存储学生三门课成绩及总分。程序如下:



#include

#include
#define RS 3
char name[RS][10];
int no[RS];
float degree[RS][4];
void input()
{
int i;
printf("输入数据:\n");
for (i=1;i<=RS;i++)
{
printf(" 第%d个学生\n",i);
printf(" 姓名:");
scanf("%s",&name[i-1]);
printf(" 学号:");
scanf("%d",&no[i-1]);
printf(" 英语成绩:");
scanf("%f",°ree[i-1][0]);
printf(" 程序设计成绩:");
scanf("%f",°ree[i-1][1]);
printf(" 数学成绩:");
scanf("%f",°ree[i-1][2]);
degree[i-1][3]=degree[i-1][0]+degree[i-1][1]+degree[i-1][2];
}
}
void sum()
{
int i;
float s1=0,s2=0,s3=0;
printf("\n统计各科总成绩\n");
printf("-------------------------\n");
for (i=0;i{
s1+=degree[i][0];
s2+=degree[i][1];
s3+=degree[i][2];
}
printf(" 英语总成绩:%g\n",s1);
printf("程序设计总成绩:%g\n",s2);
printf(" 数学总成绩:%g\n",s3);
printf("--------------------------\n\n");
}
void query()
{
int sel,bh,i;
char xm[8];
printf("数据查询\n");
printf(" 1.姓名 2.学号 请选择:");
scanf("%d",&sel);
switch(sel)
{
case 1:printf(" 输入姓名:");
scanf("%s",&xm);
for (i=0;iif (strcmp(xm,name[i])==0)
{
printf(" 姓名:%s\n",name[i]);
printf(" 学号:%d\n",no[i]);
printf(" 英语成绩:%g\n",degree[i][0]);
printf(" 程序设计成绩:%g\n",degree[i][1]);
printf(" 数学成绩:%g\n",degree[i][2]);
printf(" 总成绩:%g\n",degree[i][3]);
}
break;
case 2:printf(" 输入学号:");
scanf("%d",&bh);
for (i=0;iif (bh==no[i])
{
printf(" 姓名:%s\n",name[i]);
printf(" 学号:%d\n",no[i]);
printf(" 英语成绩:%g\n",degree[i][0]);
printf(" 程序设计成绩:%g\n",degree[i][1]);
printf(" 数学成绩:%g\n",degree[i][2]);
printf(" 总成绩:%g\n",degree[i][3]);
}
break;
}
}
main()
{
input();
sum();
query();
}
第八章 函数
1. 单项选择题

(1)【答】B

(2)【答】D

(3)【答】A

(4)【答】A

(5)【答】C语言函数调用时,只有单向的值传递,即实参将值传递给形参,传址调用也是一种单向的值传递,它是通过间接方式达到将形参回传给实参的。本题答案为B。

(6)【答】C

(7)【答】D

(8)【答】C

(9)【答】B

(10)【答】D

(11)【答】A

(12)【答】函数fun()中的变量t是静态变量,第一次调用该函数时执行static int t=3,以后调用时忽略该初始化语句,但保留上次t的值。另外,函数fun()是传值调用。本题答案为D。

(13)【答】B

(14)【答】A

(15)【答】D

(16)【答】C

(17)【答】B

2. 填空题

(1)【答】main()中的n与func函数中的n都是局部变量,前者作为实参,后者作为形参,两者之间是传值调用。程序输出为:

5050

100

(2)【答】a=10,b=3

(3)【答】8

(4)【答】120

(5)【答】0 2 4 6

(6)【答】执行func((x--,y++,x+y),z--)语句时,函数中的实参从右向左求值,先计算z--返回8,此时z=7,再计算(x--,y++,x+y),该逗号表达式从左向右执行,先计算x--,x=6,再求y++,y=8,最后计算并返回x+y=13。这个调用函数语句变为r=func(13,8)。程序输出为:21。

(7)【答】函数fact()中的i是一个静态变量,fact又是一个递归函数。程序输出为: fact=120。

(8)【答】在main()函数中调用fun(a)二次。第1次调用fun(a)时,j=0,执行一次do-while循环:s[0]=s[0]+s[1]=3,++j返回1(j=1);再执行一次do-while循环:s[1]=s[1]+s[2]=5,++j返回2(j=2),do-while循环终止,fun(a)执行完毕。

第2次调用fun(a)时,j=2,执行一次do-while循环:s[2]=s[2]+s[3]=7,++j返回3(j=3),do-while循环终止,fun(a)执行完毕。所以输出为:35745。

3. 编程题

(1)编写一个程序,逆序放置a数组中的元素。

【解】调用一个invert()函数进行数组逆置。该函数将数组a的前一半元素与对应的后一半元素交换即可。程序如下:

#include

void invert(int a[],int n);

main()

{

int a[10]={0,1,2,3,4,5,6,7,8,9},i;

invert(a,10);

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

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

printf("\n");

}

void invert(int a[],int n)

{

int i,tmp;

for (i=0;i
{

tmp=a[i];

a[i]=a[n-i-1];

a[n-i-1]=tmp;

}

}

也可以采用递归方法编写invert()函数,invert(s,i,j)每次将s的第i个元素与第j个元素进行交换,直到i大于或等于j为止。程序如下:



#include

void invert(int *s,int i,int j);

main()

{

int a[10]={0,1,2,3,4,5,6,7,8,9},i;

invert(a,0,9);

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

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

printf("\n");

}

void invert(int *s,int i,int j)

{

int t;

if (i
{

t=*(s+i);

*(s+i)=*(s+j);

*(s+j)=t;

invert(s,i+1,j-1);

}

}

(2)编写一个程序,计算任一输入的整数的各位数字之和。

【解】对任一输入的整数,先求其绝对值,然后分解各位上的数字,边分解边进行累加,直到分解完毕。程序如下:



#include

#include

>

int func(int num)

{

int s=0;

num=abs(num);

do

{

s+=num;num/=10;

} while(num);

return(s);

}

main()

{

int n;

printf("输入一个整数:");

scanf("%d",&n);

printf("结 果:%d\n",func(n));

}

(3)编写一个程序,验证哥德巴赫猜想:任一个不小于6的偶数可以表示为两个素数之和,例如:

8=3+5,10=5+5,12=5+7,…

【解】设计一个函数isprime(n),用于判断正整数n是否为素数。对于x,从i=3开始找到i=x/2,若其中有一个数i,使i和x-i均为素数,则找到了解。程序如下:



#include

#include

int isprime(int n)

{

int b=1,i;

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

if (n%i==0)

{

b=0;

break;

}

return b;

}

main()

{

int x,i;

do

{

printf("x:");

scanf("%d",&x);

} while (x<6 || x%2!=0);

i=3;

while (i
{

if (isprime(i) && isprime(x-i))

{

printf("%d=%d+%d\n",x,i,x-i);

break;

}

else

i++;

}

}

(4)编写一个程序,将整型数组中所有小于0的元素放到所有大于0的元素的前面。要求采用效率较高的算法。

【解】从左右两个方向扫描整型数组a,从左向右找大于或等于0的元素,从右向左找小于0的元素,将两者交换。如此这样,直到扫描完为止。这种算法只扫描一趟数组,所以效率较高。程序如下:



#include

#define Max 100

void fun(int a[],int n)

{

int i=0,j=n-1,temp;

while (i
{

while (a[i]<0) i++;

while (a[j]>=0) j--;

if (i
{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

}

main()

{

static a[]={1,-3,-1,3,2,4,-4,5,-5,-2},n=10,i;

printf("移动前:\n");

for (i=0;i
printf("=",a[i]);

printf("\n");

fun(a,n);

printf("移动后:\n");

for (i=0;i
printf("=",a[i]);

printf("\n");

}

(5)阿克曼函数(Ackerman)定义如下:

n+1 若m=0

A(m-1,1) 若n=0

A(m-1,A(m,n-1)) 其他情况




A(m,n)=


设计其对应的递归函数。

【解】设func(m,n)=A(m,n),求阿克曼函数的C函数如下:



int func(int m,int n)

{

if (m==0)

return n+1;

else if (n==0)

return func(m-1,1);

else

return func(m-1,func(m,n-1));

}

6.答案

#include "stdio.h"
void main()
{
int n,sum;
scanf("%d",&n);
sum=func(n);
printf("%d\n",sum);
}
int func(n)
{
int f=0;
if(n==1)
f=1;
else
f+=func(n-1)+n*n;
return f;
}






相关文档
最新文档