2022级程序设计基础练习1(编程题部分)

7-1 求e的近似值

分数 15

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

带公式就行,注意别习惯性i = 0;

#include
using namespace std;
int main()
{
    int n, i;
    double b = 1, sum; 
    scanf("%d", &n);
    for(i = 1; i <= n; i++)
    {  
        b *= i;
        sum += 1.0 / b;
    }
    printf("%.8lf", sum+1);
    return 0;
}

7-2 统计素数并求和

分数 20

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

#include
using namespace std;
int main()
{
    int M, N, i, g, h = 0, sum = 0;
    cin>>M>>N;
    for (i = M; i <= N; i++)
	{
		for (g = 2; g <= i; g++)
		{
			if (i % g == 0)
			break;
		}//判断素数
		if(i == g)
		{
			sum += i;//求和
			h++;//计数
		}
	}
    cout<

7-3 换硬币

分数 20

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

#include
using namespace std;
int main()
{
    int x;
	int fen5, fen2, fen1, total, sum;
	int count = 0;
	scanf("%d", &x);
    if(x > 8 && x < 100)
    {
		for(fen5 = x / 5; fen5 > 0; fen5--)
		{
			for(fen2 = x / 2 ; fen2 > 0; fen2--)
			{
				for(fen1 = x; fen1 > 0; fen1--)
				{
					if(5 * fen5 + 2 * fen2 + fen1 == x)
					{
						count++;
						total = fen5 + fen2 + fen1;
						printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", fen5, fen2, fen1, total);
						total = 0;
					}
				}
			}
		}
	}
	printf("count = %d",count);
    return 0;
}

循环套循环,这个题数比较小,可以直接这样暴力解决

数大的时候千万别这么干(TLE等你)

7-4 最大公约数和最小公倍数

分数 15

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

1.枚举

#include 
#define ll long long
using namespace std;

int main() 
{
    ll a, b, c, i;
    cin>>a>>b;
    for (i = 1; i <= a && i <= b; i++) 
    {
        if (a % i == 0 && b % i == 0) 
        {
            c = i;
        }
    }
    cout<

2.辗转相除法

欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

1997 ÷ 615 = 3 (余 152)

615 ÷ 152 = 4(余7)

152 ÷ 7 = 21(余5)

7 ÷ 5 = 1 (余2)

5 ÷ 2 = 2 (余1)

2 ÷ 1 = 2 (余0)

至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

循环实现

#include
#define ll long long
using namespace std;
int main()
{
    ll x, y, M, N, t;
    cin>>M>>N;
    x = M;
    y = N;
    while(y != 0)
    {
        t = x % y;
        x = y;
        y = t;
    }
    cout<

函数实现

#include
typedef long long ll; 
int fun(ll m,ll n)
{
	if( n==0 ) 
	return m;
	return fun(n, m % n);
}
int main()
{
    ll a, b, i;
    scanf("%lld%lld", &a, &b);
    i = fun(a,b);
	printf("%lld", a * b / i ); 
    return 0;
}      
//不知道啥时候搞得,直接粘上算了

7-5 兔子繁衍问题

分数 15

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N。

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:

30

输出样例:

9

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

典型递推

咱们自己可以列前7项的结果出来统计规律
前八项的结果分别为:1对,1对,2对,5对,8对,13对,21对;

看到这里就差不多能看出来规律了,从第三项开始,当前项等于前两项之和

直接上代码

#include
#define ll long long
using namespace std;
int main()
{
    ll N, a = 2, b = 0, c = 0, i = 1;
    cin>>N;
    if(N > 1)
    {
        while(c < 2 * N)
        { 
            c = a + b;
            b = a;
            a = c;
            i++;
        }
        cout<

7-6 打印九九口诀表

分数 15

下面是一个完整的下三角九九口诀表:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

本题要求对任意给定的一位正整数N,输出从1*1N*N的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

之前老师上课讲过了;稍微改一下就可以了

#include
#define ll long long
using namespace std;
int main()
{
	int N, i, j;
	cin>>N;
	for(i = 1;i <= N; i++)
        {
		for(j = 1;j <= i; j++)
		{
			printf("%d*%d=%-4d",j,i,j*i);
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(算法,c++,图论)