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;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;
case 2:printf(" 输入学号:");
scanf("%d",&bh);
for (i=0;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;
}