文章目录
前言
因为所写的平台目前还未升级,只支持C90 标准,所以代码相对来说,比较详细,同时也便于读者小白更好地理解代码思路,帮助学弟学妹们快速入门C语言。
更多章节可以点击 → PTA丨 《C语言程序设计》 相关题解
练习10-1 使用递归函数计算1到n之和
1)题目描述
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义:
int sum( int n );
该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。
裁判测试程序样例:
#include <stdio.h>
int sum( int n );
int main()
{
int n;
scanf("%d", &n);
printf ("%d\n", sum(n));
return 0;
}
/* 你的代码放在这里,与上述代码一起提交 */
输入样例1:
10
输出样例1:
55
2) 代码示例
#include <stdio.h>
int sum( int n );
int main()
{
int n;
scanf("%d", &n);
printf ("%d\n", sum(n));
return 0;
}
int sum( int n )
{
int ret;
if(n<=0)
{
ret =0;
}else if(n == 1)
{
ret = 1;
}
else{
ret =sum(n-1)+n;
}
return ret;
}
习题10-1 判断满足条件的三位数
1)题目描述
#0038003000390031003500301668163753386
本题要求实现一个函数,统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。
函数接口定义:
int search( int n );
其中传入的参数int n是一个三位数的正整数(最高位数字非0)。函数search返回[101, n]区间内所有满足条件的数的个数。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
int search( int n );
int main()
{
int number;
scanf("%d",&number);
printf("count=%d\n",search(number));
return 0;
}
/* 你的代码放在这里与上述代码一起提交 */
输入样例:
500
输出样例:
count=6
2) 代码示例
#include <stdio.h>
#include <math.h>
int search( int n );
int main()
{
int number;
scanf("%d",&number);
printf("count=%d\n",search(number));
return 0;
}
int search( int n )
{
int i,x=0;
for(i=101;i<=n;i++)
if((int)sqrt(i)*(int)sqrt(i)==i)
if(i%10==i/100||i%10==(i/10)%10||i/100==(i/10)%10)x++;
return x;
}
习题10-2 递归求阶乘和
1)题目描述
#0038003000390031003500301668163799110
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+…+n! 的值。
函数接口定义:
double fact( int n );
double factsum( int n );
函数fact应返回n的阶乘,建议用递归实现。函数factsum应返回 1!+2!+…+n! 的值。题目保证输入输出在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
double fact( int n );
double factsum( int n );
int main()
{
int n;
scanf("%d",&n);
printf("fact(%d) = %.0f\n", n, fact(n));
printf("sum = %.0f\n", factsum(n));
return 0;
}
/* 你的代码放在这里与上述代码一起提交 */
输入样例1:
10
输出样例1:
fact(10) = 3628800
sum = 4037913
2) 代码示例
#include <stdio.h>
double fact( int n );
double factsum( int n );
int main()
{
int n;
scanf("%d",&n);
printf("fact(%d) = %.0f\n", n, fact(n));
printf("sum = %.0f\n", factsum(n));
return 0;
}
double fact( int n )
{
int ret;
if(n==1||n==0)
{
ret =1;
}
else{
ret = n*fact(n-1);
}
return ret;
}
double factsum( int n )
{
double sum;
if(n==0)
{
sum = 0;
}
else{
sum = factsum(n-1)+fact(n);
}
return sum;
}
习题10-3 递归实现指数函数
1)题目描述
#0038003000390031003500301668163843448
本题要求实现一个计算x的n次方(n≥1)的函数。
函数接口定义:
double calc_pow( double x, int n );
函数calc_pow应返回x的n次幂的值。建议用递归实现。题目保证结果在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
double calc_pow( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.0f\n", calc_pow(x, n));
return 0;
}
/* 请将你的代码嵌在这里,与上述代码一起提交 */
输入样例:
2 3
输出样例:
8
2) 代码示例
#include <stdio.h>
double calc_pow( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.0f\n", calc_pow(x, n));
return 0;
}
double calc_pow( double x, int n )
{
double ret ;
if(n==1)
ret = x;
else
ret = x*calc_pow(x,n-1);
return ret;
}
习题10-4 递归求简单交错幂级数的部分和
1)题目描述
0038003000390031003500301668163882500
本题要求实现一个函数,计算下列简单交错幂级数的部分和:
函数接口定义:
double fn( double x, int n );
其中题目保证传入的n是正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议尝试用递归实现。
裁判测试程序样例:
#include <stdio.h>
double fn( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.2f\n", fn(x,n));
return 0;
}
/* 请将你的代码嵌在这里,与上述代码一起提交 */
输入样例:
0.5 12
输出样例:
0.33
2) 代码示例
#include <stdio.h>
double fn( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.2f\n", fn(x,n));
return 0;
}
double fn( double x, int n ){
int k;
if(n%2==0)
k=-1;
else
k=1;
if(n==0)
return 0;
return k*pow(x, n)+fn(x, n-1);
}
习题10-5 递归计算Ackermenn函数
1)题目描述
本题要求实现Ackermenn函数的计算,其函数定义如下:
函数接口定义:
int Ack( int m, int n );
其中m和n是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型范围内。
裁判测试程序样例:
#include <stdio.h>
int Ack( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));
return 0;
}
/* 请将你的代码嵌在这里,与上述代码一起提交 */
输入样例:
2 3
输出样例:
9
2) 代码示例
#include <stdio.h>
int Ack( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));
return 0;
}
int Ack( int m, int n )
{
int ret;
if(m ==0)
ret = n+1;
else
if(n ==0)
ret = Ack(m-1,1);
else
ret = Ack(m-1,Ack(m,n-1));
return ret;
}
习题10-6 递归求Fabonacci数列
1)题目描述
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
函数接口定义:
int f( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
int f( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8
2) 代码示例
#include <stdio.h>
int f( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
int f( int n )
{
int i;
if(n == 0)
i = 0;
else if(n == 1)
i = 1;
else i = f(n-2)+f(n-1);
return i;
}
习题10-7 十进制转换二进制
1)题目描述
#0038003000390031003500301668164019374
本题要求实现一个函数,将正整数n转换为二进制后输出。
函数接口定义:
void dectobin( int n );
函数dectobin应在一行中打印出二进制的n。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
void dectobin( int n );
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
输出样例:
1010
2) 代码示例
#include <stdio.h>
void dectobin( int n );
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
void dectobin( int n )
{
int result = 0;
if (n == 0)
{
printf("0");
}
else if (n == 1)
{
printf("1");
}
else
{
dectobin(n / 2);
result = n % 2;
printf("%d", result);
}
}
习题10-8 递归实现顺序输出整数
1)题目描述
本题要求实现一个函数,对一个整数进行按位顺序输出。
函数接口定义:
void printdigits( int n );
函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。
裁判测试程序样例:
#include <stdio.h>
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
12345
输出样例:
1
2
3
4
5
2) 代码示例
#include <stdio.h>
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
void printdigits( int n )
{
if(n==0)
printf("0");
else if(n<10)
printf("%d\n",n);
else
{
printdigits(n/10);
printf("%d\n",n%10);
}
}
后序
更多章节可以点击 → PTA丨 《C语言程序设计》 相关题解