A. 函数求值

运行时间限制: 1000运行内存限制: 65536
作者: bupt_admin是否specialjudge: False

题目描述

求下列函数值:

输入格式:第一行是测试数据的组数T(1 <= T <= 20),后面跟着T行输入。每组测试数据占1行,包括一个正整数n(1 <= n <= 200),和一个浮点数x(0 < x < 100)。

输出格式:T行,每行输出对应一个输入,为所求得的函数值(保留3位小数)

输入样例

2
1 3.
20 3.3

输出样例

2.000
4.987

示例代码

#include<stdio.h>
#include<math.h>

double f(double, int);

int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		double x;
		int n;
		scanf("%d %lf", &n, &x);
		printf("%.3lf\n", f(x, n));
	}
	return 0;
}

double f(double x, int n)
{
	if (n == 1)
	{
		return sqrt(1 + x);
	}
	else
	{
		return sqrt(n + f(x, n - 1));
	}
}

B. 实验6_4_二进制转十进制

运行时间限制: 1000运行内存限制: 65536
作者: bupt_admin是否specialjudge: False

题目描述

问题描述:
设计递归函数int convert(int n);用于将二进制数n转换为十进制数并返回。
递归函数设计思路与提示:
如将1101转换为十进制的形式:
1101=1*2^0+0*2^1+1*2^2+1*2^3=1101%10+convert(110)*2;
110=0*2^0+1*2^1+1*2^2=110%10+ convert(11)*2;
11=1*2^0+1*2^1=11%10+convert(1)*2;
convert(1)=1;
所以得到以下结论:当n==0或n==1时,函数返回n,否则返回n%10+convert(n/10)*2。

输入与输出要求:
输入一个整数n,代表二进制数,其长度不大于10。输出转换后的十进制数,占一行。

输入样例

101010
42

输出样例

11
3

示例代码

#include<stdio.h>

int convert(long long int);

int main()
{
	long long int n;
	scanf("%lld", &n);
	printf("%d", convert(n));
	return 0;
}

int convert(long long int n)
{
	if (n == 0 || n == 1)
	{
		return n;
	}
	else
	{
		return n % 10 + convert(n / 10) * 2;
	}
}

C. 实验6_5_二进制的位数

运行时间限制: 1000运行内存限制: 65536
作者: bupt_admin是否specialjudge: False

题目描述

问题描述:
设计递归函数int countBinary(int n);用于将非负十进制整数n转换成二进制形式,并返回该二进制数的位数。如十进制数13的二进制形式为1101,位数为4,那么调用countBinary(13)的结果为4。
要求同学们先写出该问题的递归定义式,再设计递归函数。

输入与输出要求:
输入一个非负整数n。输出求得的结果,如输入“13”,输出“4”,占一行。

输入样例

13
4

输出样例

2000000000
31

示例代码

#include<stdio.h>

int count = 0;

void f(int);

int main()
{
	int n;
	scanf("%d", &n);
	f(n);
	printf("%d", count);
	return 0;
}

void f(int x)
{
	if (x != 1 && x != 0)
	{
		count++;
		f(x / 2);
	}
	else
	{
		count++;
	}
	return;
}

D. 实验6_7_最大公约数

关于如何用辗转相除法求最大公因数和最小公倍数

https://www.jray.xyz/index.php/2019/11/15/%e8%be%97%e8%bd%ac%e7%9b%b8%e9%99%a4%e6%b3%95%e6%b1%82%e6%9c%80%e5%a4%a7%e5%85%ac%e7%ba%a6%e6%95%b0%e3%80%81%e6%9c%80%e5%b0%8f%e5%85%ac%e5%80%8d%e6%95%b0/
运行时间限制: 1000运行内存限制: 65536
作者: bupt_admin是否specialjudge: False

题目描述

问题描述:
设计递归函数int GCD(int a,int b);计算正整数a和b的最大公约数并返回。如GCD(32,48)为16。
GCD(a,b)递归定义为:
GCD(a,b)=GCD(b,a MOD b) | a MOD b≠0
GCD(a,b)=b | a MOD b=0

输入与输出要求:
输入两个正整数a和b,输出两数的最大公约数数,占一行。

输入样例

32 48
8 12

输出样例

16
4

示例代码

#include<stdio.h>

int GCD(int, int);

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d", GCD(a, b));
	return 0;
}

int GCD(int a,int b)
{
	if (a % b != 0)
	{
		return GCD(b, a % b);
	}
	else
	{
		return b;
	}
}

E. 实验6_9_素数分解

运行时间限制: 1000运行内存限制: 65536
作者: bupt_admin是否specialjudge: False

题目描述

问题描述:
设计递归函数void recurPrintFactor(int n,…);打印出对n进行素数分解的结果。当执行recurPrintFactor(60)时,打印效果为:60=2*2*3*5。在函数的参数中“…”代表你可以添加参数。并且也可使用全局变量。关于素数分解的描述,见实验五第14题。
设计程序,已知一段数据范围[a,b],且a<=b,要求对其中的每一个数进行素数分解。你也可以设计其它辅助函数,如判断素数的函数isPrime(n)。

输入与输出要求:
输入两个正整数a、b,代表所分解的区间,满足1<=a<=b<=100000,且b-a<=100。输出b-a+1行,即b-a+1个数的分解。

输入样例

100 105
9999 10005

输出样例

100=2*2*5*5
101=101
102=2*3*17
103=103
104=2*2*2*13
105=3*5*7
9999=3*3*11*101
10000=2*2*2*2*5*5*5*5
10001=73*137
10002=2*3*1667
10003=7*1429
10004=2*2*41*61
10005=3*5*23*29

示例代码

#include<stdio.h>

void recurPrintFactor(int);
 
int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
	if (x == 1)
	{
	    printf("1=1\n");
	    x++;
	}
    for (int i = x; i <= y; i++)
    {
        printf("%d=", i);
        recurPrintFactor(i);
    }
    return 0;
}

void recurPrintFactor(int n)
{
    int i = 2;
    for (; i < n; i++)
    {
        if (n % i == 0)
        {
            printf("%d*", i);
            recurPrintFactor(n / i);
            return;
        }
    }
    if (n != 1)
    {
        printf("%d\n", i);
    }
    return;
}

分类: OJ代码