如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数的序号)。
为了实现高精度计算结果,可将商M存放在有N(N>1)个元素的一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中……,依次类推。
这样可使用数组来表示计算的结果。
【4.75】使用数组完成两个超长(长度小于100)正整数的加法。
为了实现高精度的加法,可将正整数M存放在有N(N>1)个元素的一维数组中,数组的每个元素存放一位十进制数,即个位存放在第一个元素中,十位存放在第二个元素中……,依次类推。
这样通过对数组中每个元素的按位加法就可实现对超长正整数的加法。
【4.76】使用数组完成两个超长(长度小于100)正整数的加法。
为了实现高精度的加法,可将正整数M存放在有N(N>1)个元素的一维数组中,数组的每个元素存放一位十进制数,即个位存放在第一个元素中,十位存放在第二个元素中……,依次类推。
这样通过对数组中每个元素的按位加法就可实现对超长正整数的加法。
【4.77】使用数组完成两个超长(长度小于100)正整数的乘法。
【4.78】马步遍历问题:
已知国际象棋棋盘有8*8共64个格子。
设计一个程序,使棋子从某位置开始跳马,能够把棋盘上的格子走遍。
每个格子只允许走一次。
【4.79】八皇后问题:
在一个8×8的国际象棋盘,有八个皇后,每个皇后占一格;要求棋盘上放上八个皇后时不会出现相互"攻击"的现象,即不能有量个皇后在同一行、列或对角线上。
问共有多少种不同的方法。
【4.80】编制一个计算函数y=f(x)的值程序,其中:
-x+2.50<=x<2y=2-1.5(x-3)*(x-3)2<=x<4x/2-1.54<=x<6【4.81】编写程序,实现比较两个分数的大小。
【4.82】求这样一个三位数,该三位数等于其每位数字的阶乘之和。
即:
abc=a!
+b!
+c!
【4.83】已知两个平方三位数abc和xyz,其中数码a、b、c、x、y、z未必是不同的;而ax、by、cz是三个平方二位数。
编写程序,求三位数abc和xyz。
任取两个平方三位数n和n1,将n从高向低分解为a、b、c,将n1从高到低分解为x、y、z。
判断ax、by、cz是否均为完全平方数。
【4.84】找出一个二维数组中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。
二维数组也可能没有鞍点。
【4.85】将数字1、2、3、4、5、6填入一个2行3列的表格中,要使得每一列右边的数字比左边的数字大,每一行下面的数字比上面的数字大。
编写程序求出按此要求可有几种填写方法?
【4.86】编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序,相同的字符在新字符串中只出现一次。
【4.87】已知计算x的n阶勒让德多项式值的公式如下:
1(n=0)Pn(x)=x(n=1)((2n-1)*x*Pn-1(x)-(n-1)*Pn-2(x))/n(n>1)请编写递归程序实现。
【4.88】编写函数,采用递归方法实现将输入的字符串按反序输出。
【4.89】编写函数,采用递归方法在屏幕上显示如下杨辉三角形:
11112113311464115101051…………………………【4.90】编写函数,采用递归方法将任一整数转换为二进制形式。
【4.91】设有字母a、b、c,请编程用递归的方法产生由这些字母组成的,且长度为n的所有可能的字符串。
例如,输入n=2,则输出:
aaabacbabbbccacbcc【4.92】将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。
编写程序,采用递归算法求不超过1993的最大的二进制的对称数。
【4.93】从1到n(n<1000)个自然数中选出r个数进行组合,并按指定的格式输出组合的结果。
例如:
n=5,r=3时,共有10种组合,运行程序,要按下面的格式输出:
1234534545234545345请用递归算法实现。
【4.94】从键盘输入十个整数,用合并排序法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。
【4.95】编写程序,读入一个以符号"."结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。
例如:
读入句子:
MADAMI'MADAM.它是回文,所以输出:
YES读入句子:
ABCDBA).它不是回文,所以输出:
NO【4.96】编写程序,其中包括一个函数,此函数的功能是:
对一个长度为N的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。
例如输入字符串"Wearepoorstudents.",利用此函数进行删除"poor"的处理,输出处理后的字符串是"Wearestudents."。
【4.97】编写函数,通过指针将一个字符串反向。
【4.98】编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。
【4.99】编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。
【4.100】编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。
如:
输入字符串:
abcedabcdcd则输出:
a=2b=2c=3d=3e=1。
【4.101】利用结构:
structcomplx{intreal;intim;};编写求两个复数之积的函数cmult,并利用该函数求下列复数之积:
⑴(3+4i)×(5+6i)⑵(10+20i)×(30+40i【4.102】编写成绩排序程序。
按学生的序号输入学生的成绩,按照分数由高到低的顺序输出学生的名次、该名次的分数、相同名次的人数和学号;同名次的学号输出在同一行中,一行最多输出10个学号。
【4.103】编写程序,实现输入的时间屏幕显示一秒后的时间。
显示格式为HH:
MM:
SS。
程序需要处理以下三种特殊情况:
⑴若秒数加1后为60,则秒数恢复到0,分钟数增加1;⑵若分钟数加1后为60,则分钟数恢复到0,小时数增加1;⑶若小时数加1后为24,则小时数恢复到0。
【4.104】编写程序,从键盘输入3个学生的数据,将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。
【4.105】编写程序,从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。
【4.106】编写程序,读入磁盘上C语言源程序文件"test8.c",删去程序中的注释后显示。
【编写程序题参考答案】【4.41】参考答案:
main(){inti,j,num,a[10];for(i=0;i<10;i++){printf("EnterNo.%d:
",i+1);scanf("%d",&num);for(j=i-1;j>=0&&a[j]>num;j--)a[j+1]=a[j];a[j+1]=num;}for(i=0;i<10;i++)printf("No.%d=%d\n",i+1,a[i]);}【4.42】参考答案:
main(){intn;printf("Pleaseentern:
");scanf("%d",&n);while(n>0){printf("%d",n%10);n=n/10;}}【4.43】参考答案:
main(){inti,n;longs1=0,s2=0;printf("PleaseenterN:
");scanf("%d",&n);if(n>=0)for(i=n;i<=2*n;i++)s1=s1+i;elsefor(i=n;i>=2*n;i--)s1=s1+i;i=n;if(i>=0)while(i<=2*n)s2=s2+i++;elsewhile(i>=2*n)s2=s2+i--;printf("Result1=%ldresult2=%ld\n",s1,s2);}【4.44】分析:
据题意,阶梯数满足下面一组同余式:
x≡1(mod2)x≡2(mod3)x≡4(mod5)x≡5(mod6)x≡0(mod7)参考答案:
#includemain(){inti=1;/*i为所设的阶梯数*/while(!
((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0)))++i;/*满足一组同余式的判别*/printf("Staris_number=%d\n",i);}【4.45】参考答案:
main(){inti,n,a;for(i=0;;i++){if(i%8==1){n=i/8;if(n%8==1){n=n/8;if(n%8==7)a=n/8;}}if(i%17==4){n=i/17;if(n%17==15)n=n/17;}if(2*a==n){printf("result=%d\n",i);break;}}}【4.46】分析:
二分法的基本原理是,若函数有实根,则函数的曲线应当在根这一点上与x轴有一个交点,在根附近的左右区间内,函数值的符号应当相反。
利用这一原理,逐步缩小区间的范围,保持在区间的两个端点处的函数值符号相反,就可以逐步逼近函数的根。
参考答案:
#include"stdio.h"#include"math.h"main(){floatx0,x1,x2,fx0,fx1,fx2;do{printf("Enterx1,x2:
");scanf("%f,%f",&x1,&x2);fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;/*求出x1点的函数值fx1*/fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;/*求出x2点的函数值fx2*/}while(fx1*fx2>0);/*保证在指定的范围内有根,即fx的符号相反*/do{x0=(x1+x2)/2;/*取x1和x2的中点*/fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;/*求出中点的函数值fx0*/if((fx0*fx1)<0)/*若fx0和fx1符号相反*/{x2=x0;/*则用x0点替代x2点*/fx2=fx0;}else{x1=x0;/*否则用x0点替代x1点*/fx1=fx0;}}while(fabs((double)fx0)>=1e-5);/*判断x0点的函数与x轴的距离*/printf("x=%6.2f\n",x0);}【4.47】分析:
做圆的内接4边形,从圆心和4边形顶点连接形成4个三角形,可以求出每个三角形的面积(r2/2)现在我们知道三角形的面积和两个边长(均为半径a=r、b=r),可以用公式:
S=s(s-a)(s-b)(s-c)求出第三边c。
我们将内接4边形换为内接8边形,原来的三角形被一分为二,故c/2就是每个三角形的高,面积又是可以求出的。
再将三角形一分为二,……。
当三角形的面积求出时,内接多边形的面积就可求出。
参考答案:
main(){intn=4;doubler=10,s,cr,c,p;s=r*r/2;do{cr=n*s;p=16*r*r*r*r-64*s*s;c=(4*r*r-sqrt(p))/2;c=sqrt(c);s=c*r/4;n=2*n;}while(n*s-cr>1.0e-10);printf("PAI=%lf\n",cr/r/r);}【4.48】分析:
根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条后剩下的鱼正好分为五份,然后拿走自己的一份,余下其它四份。
假定鱼的总数为x,则x可以按照题目的要求进行五次分配:
x-1后可被5整除,余下的鱼为4×(x-1)÷5。
若x满足上述要求,则x就是题目的解。
参考答案:
main(){intn,i,x,flag=1;/*flag:
控制标记*/for(n=6;flag;n++)/*采用试探的方法,令试探值n逐步加大*/{for(x=n,i=1;flag&&i<=5;i++)/*判断是否可按要*/if((x-1)%5==0)x=4*(x-1)/5;/*求进行5次分配*/elseflag=0;/*若不能分配则置标记flag=0退出分配过程*/if(flag)break;/*若分配过程正常,找到结果,退出试探的过程*/elseflag=1;/*否则继续试探下一个数*/}printf("Totalnumberoffishcatched=%d\n",n);/*输出结果*/}【4.49】分析:
按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
参考答案:
#include"math.h"main(){inti,j,k,c;for(i=1;i<=9;i++)/*i:
车号前二位的取值*/for(j=0;j<=9;j++)/*j:
车号后二位的取值*/if(i!
=j)/*判断两位数字是否相异*/{k=i*1000+i*100+j*10+j;/*计算出可能的整数*/for(c=31;c*c用穷举法解决此类问题。
设任取红球的个数为i,白球的个数为j,则取黑球的个数为8-i-j,据题意红球和白球个数的取值范围是0~3,在红球和白球个数确定的条件下,黑球的个数取值应为8-i-j<=6。
参考答案:
main(){inti,j,count=0;printf("REDBALLWHITEBALLBLACKBALL\n");printf("------------------------------------------\n");for(i=0;i<=3;i++)/*循环控制变量i控制任取红球个数0~3*/for(j=0;j<=3;j++)/*循环控制变量j控制任取白球个数0~3*/if((8-i-j)<=6)printf("%2d:
%d%d%d\n",++count,i,j,8-i-j);}【4.51】分析:
此题采用穷举法。
参考答案:
main(){intx,y,z,j=0;for(x=0;x<=33;x++)for(y=0;y<=(100-3*x)/2;y++){z=100-x-y;if(z%2==0&&3*x+2*y+z/2==100)printf("%2d:
l=%2dm=%2ds=%2d\n",++j,x,y,z);}}【4.52】分析:
此题采用穷举法。
参考答案:
main(){intf1,f2,f5,count=0;for(f5=0;f5<=20;f5++)for(f2=0;f2<=(100-f5*5)/2;f2++){f1=100-f5*5-f2*2;if(f5*5+f2*2+f1==100)printf("No.%2d>>5:
%4d2:
%2d1:
%2d\n",++count,f5,f2,f1);}}【4.53】分析:
此题采用穷举法。
参考答案:
main(){longinti,j,k,count=0;for(i=1;i*i<=200;i++)for(j=1;j*j<=200;j++)for(k=1;k*k<=200;k++)if(i*i==(j*j+k*k)){printf("\nA^2==B^2+C^2:
%4ld%4ld%4ld",i,j,k);count++;}printf("\ncount=%ld",coun