int main(){ int i,j;
cout<<\请输入两个整数:\cin>>i>>j;
cout<<\最大公约数:\
<<'\\t'<<\最小公倍数:\return 0; }
3.5 设计函数digit(num,k),返回整数num从右边开始的第k位数字的值。例如: digit(4647,3)=6 digit(23523,7)=0
解:把整数转换为数串,放在一个整型数组中。 #include
int s[10]={0,0,0,0,0,0,0,0,0,0}; int i=0;
do{//先把整数转换为数字串 s[i]=num; num/=10; i++;
}while(num>0);
if(k<=i) return s[k-1]; //题目中位数的下标从1开始,而数组下标从0开始 else return 0; }
int main(){
cout<<\cout<<\return 0; }
3.6 设计函数factors(num,k),返回整数num中包含因子k的个数,如果没有该因子,则返回0。
解:必须先判断整数m能否被k整除。 #include
factors(int num,int k){//缺省返回值为整型 int count=0;
while(num%k==0){ count++; num/=k; }
return count; }
int main(){
cout<<\cout<<\return 0; }
3.7 歌德巴赫猜想指出:任何一个充分大的偶数都可以表示为两个素数之和。例如: 4=2+2 6=3+3 8=3+5 … … 50=3+47
将4.50之间的所有偶数用两个素数之和表示。判断一个整数是否为素数用函数完成。
解:用prime()函数判断是否素数,用穷举法。歌德巴赫猜想验证也用穷举法,在所有组合中找两个数均为素数者。 #include
if(m==1||m==0) return false; if(m==2) return true; int k=(int)sqrt(m); if(m%i==0) break;
for(int i=2;i<=k;i++)//穷举法
if(i>k) return true; else return false; }
int main(){
for(int n=4;n<=50;n+=2){ for(int i=2;i<=n/2;i++)
if(prime(i)&&prime(n-i)) cout< return 0; } 3.8 设计函数打印直方图,直方图宽度为3行,每列代表数据1%。如下面的图形表示10%。 | |********** |********** |********** | 解:为简单将a%用a表示。 #include void PrintDiagram(int m){ int i ; cout<<'|'< for(int j=0;j cout<<'|'< int main(){ PrintDiagram(10); PrintDiagram(15); PrintDiagram(7); return 0; } 3.9 定义递归函数实现下列Ackman函数: .............0m0,n ))1,(,1( 0n 11 0m 1),(nmAcmmAcm),Acm(m-nnmAcm 第三章 函数习题 9 其中m、n为正整数。设计程序求Acm(2,1),Acm(3,2)。 解:递归函数实现非常简单,按公式写即可。 #include if(n==0) return Acm(m-1,1); return Acm(m-1,Acm(m,n-1)); } int main(){ cout<<\cout<<\return 0; } 3.10 用递归函数实现勒让德多项式: ..............1n /))()1()()12((1n 0n 1)(21nxPnxxPnxxPnnn 在主函数中求P4(1.5)。 解:把勒让德多项式的阶和自变量都作为参数。 #include return ((2*n-1)*x*P(n-1,x)-(n-1)*P(n-2,x))/n; } int main(){ cout<<\return 0; } 3.11定义内联函数实现求三个实数中的最大值。 解:内联函数只适用于功能简单,代码短小而又被重复使用的函数。函数体中包含复杂结构控制语句,如switch、复杂if嵌套、while语句等,以及无法内联展开的递归函数,都不能定义为内联函数,即使定义,系统也将作为一般函数处理。 #include inline max(int a,int b,int c){ if(a>b&&a>c) return a; if(b>a&&b>c) return b; return c; } 第三章 函数习题 10 int main(){ cout< 3.12 定义内联函数,判断一个字符是否为数字字符。 解:数字字符ASCII码值是连在一起的,可用ch>='0'&&ch<='9'来判断。 #include inline bool IfDigitChar(char ch){ if(ch>='0'&&ch<='9') return 1; else return 0; } int main(){ char ch; cout<<\请输入一个字符(输入“!”停止)\cin>>ch; while(ch!='!'){ if(IfDigitChar(ch)) cout< cout<<\请输入一个字符(输入“!”停止)\cin>>ch; } return 0; } 3.13 设计两个重载函数,分别求两个整数相除的余数和两个实数相除的余数。两个实数求余定义为实数四舍五入取整后相除的余数。 解:实数四舍五入取整,正数是+0.5取整,负数是-0.5取整。 #include round(double x){ //四舍五入函数 if(x>=0) return int(x+0.5); else return int(x-0.5); } mod(double x,double y){ return round(x)%round(y); } int main(){ cout<<\第三章 函数习题 11 cout<<\cout<<\return 0; } 注意:mod(double x,double y)形参类型不可以写成float,因为在入口函数中 mod(8.2,3.6)的实参8.2、3.6都认为是double型常数,重载时系统不知应转换为float还是int,出现歧义。 3.14 建立一个头文件area.h,在其中定义两个面积函数area(),分别用来计算半径为r的圆的面积和边长为a和b的矩形面积。另外建立一个实现文件area.cpp,在其中定义主函数。通过包含area.h,输入数据并输出圆和矩形的面积。 解:两个面积函数area(),一个是单参数,一个是双参数。 //头文件area.h double area(double r){ return 3.14*r*r; } double area(double a,double b){ return a*b; } //实现文件area.cpp #include cout<<\cin>>r; cout<<\cin>>a>>b; cout<<\ cout<<\return 0; } 注意:例题源代码中,为了使文件命名方式一致,采用Exp3_14.h和Exp3_14.cpp来命名。 3.15 下面递归函数执行结果是什么? 1) void p1(int w){ int i; if(w>0){ for(i=0;i 调用p1(4)。 第三章 函数习题 12 答:用调用树来解答,如下图,注意打印是在递归调用之前: 按照打印语句: for(i=0;i ① 4 4 4 4 //第1次W=4 ② 3 3 3 //第2次W=3 ③ 2 2 //第3次W=2 ④ 1 //第4次W=1 2) void p2(int w){ int i; if(w>0){ p2(w-1); for(i=0;i 调用p2(4)。 答:用调用树来解答,如下图,注意打印是在两次递归调用之间: 按照次序和打印语句,可得输出为: ① 1 ② 2 2 ③ 1 ④ 3 3 3 ⑤ 1 ⑥ 2 2 ⑦ 1 ⑧ 4 4 4 4 ⑨ 1 第三章 函数习题 13 ⑩ 2 2 ⑾ 1 ⑿ 3 3 3 ⒀ 1 ⒁ 2 2 ⒂ 1 3) void p3(int w){ int i; if(w>0){ for(i=0;i p3(w-1); p3(w-2); } } 调用p3(4)。 答:用调用树来解答,如下图,注意打印是在两次递归调用之前: 按照次序和打印语句,可得输出为: ① 4 4 4 4 ② 3 3 3 ③ 2 2 ④ 1 ⑤ 1 ⑥ 2 2 ⑦ 1 4) void p4(int w){ int i; if(w>0){ for(i=0;i for(i=0;i 调用p4(4)。 答:如下图用调用树解答,注意打印是在递归调用之前和之后各一次: 按照次序和打印语句,可得输出为: ① 4 4 4 4 ② 3 3 3 ③ 2 2 ④ 1 ⑤ 1 ⑥ 2 2 ⑦ 3 3 3 ⑧ 4 4 4 4 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C++程序设计(第二版_吴乃陵_况迎辉)课后答案(5)在线全文阅读。
相关推荐: