C++三级----2021年9月

斐波那契数列取模:

菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。

给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。

输出

n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。

样例输入:

4
5
2
19
1

样例输出:

5
1
4181
1

问题分析

斐波那契数列的规律为f[i] = f[i-1] + f[i-2], 并且根据第一项与第二项都为1, 递推出之后的数值, 接下来我们使用递推的方式来实现功能, 容易忘记的是每次求第n个的值时, 需要对临时变量进行重置.

代码如下:

#include <iostream>
using namespace std;
int main(){
	int n, a, t1 = 1, t2 = 1, temp = 1; // a获取数据, t1代表第一个数, t2代表第二个数, temp交换值临时变量 
	cin >> n;
	int s[n]; // s数组存储最终的结果 
	for( int i = 0; i < n; i++ ){
		cin >> a;
		t1 = 1; // 这里的初始化是必须的, 因为每次都是从第一个开始计算数列 
		t2 = 1;
		temp = 1; 
		for( int j = 0; j < a-2; j++ ){ // 计算公式 
			temp = t1;
			t1 = t2;
			t2 = t1 + temp;
		}
		s[i] = t2 % 10000; // 对t2进行取余 
	}
	for( int i = 0; i < n; i++ ){ // 输出 
		cout << s[i] << endl;
	}
	return 0;
}


 

课程冲突:

小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。

定义两门课程的冲突程度为: 有几天是这两门课程都要上的。

例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。

现在你需要求的是这 n 门课中冲突程度最大的两门课的冲突程度。

输入
第一行一个正整数 n 表示课程数量。 接下来 n 行,每行两个正整数 ai,bi。 2 ≤ n≤ 1000, 1 ≤ ai ≤ bi ≤ 1000。
输出
输出一个整数表示最大的冲突程度

样例输入:

3
1 3
2 4
5 5

样例输出:

2

问题分析

对于例子所说的一门课天数的区间为[1, 3], 另一门课区间为[2, 4], 得出来的2是求解区间的并集, 即相交的区间, 如下图:

那么我们可以得知对于区间[a1, b1]与区间[a2, b2], 有两种情况. 

第一种情况是a1点落在区间[a2, b2]中, 如下:

这时需要满足的条件为a2 <= a1 <= b2, 那么区间的差值(即冲突天数)计算方式为: b2 - a1 + 1

第二种情况是b1点落在区间[a2, b2]中, 如下:

 

这时需要满足的条件为a2 <= b1 <= b2, 那么区间的差值(即冲突天数)计算方式为: b1 - a2 + 1

总结出来的公式为:

maxday = max(maxday, b2-a1+1)      当a2<=a1<=b2时

maxday = max(maxday, b1-a2+1)      当a2<=b1<=b2时

 

代码如下:

#include <iostream>
using namespace std;
int main(){
	// 数据的初始化 
	int n;
	cin >> n;
	int a[n], b[n]; // a数组存储左区间, b数组存储右区间 
	for( int i = 0; i < n; i++ ){
		cin >> a[i] >> b[i];
	}
	
	int max_day = 0;	// 存储最大天数 
	// 进行搜索(枚举) 
	for( int i = 0; i < n; i++ ){ // 拿出一天, 与后续的天数进行相比 
		for( int j = i + 1; j < n; j++ ){ // 开始位置为i后续的天数 
			if( a[j] <= a[i] && a[i] <= b[j] ){ // 当a[i](左区间)落在区间[a[j], b[j]]里面 
				max_day = max(max_day, b[j]-a[i]+1);
			}
			else if( a[j] <= b[i] && b[i] <= b[j] ){ // 当b[i](右区间)落在区间[a[j], b[j]]里面
				max_day = max(max_day, b[i]-a[j]+1);
			}
		}
	}
	cout << max_day;
	return 0;
}


余数相同:

已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。

请问满足上述条件的x的最小值是多少?数据保证x有解。

输入

一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。

输出

一个整数,即满足条件的x的最小值。

输入样例

300 262 205

输出样例

19

问题分析

使用暴力枚举即可.

代码如下:

#include <iostream>
using namespace std;
int main(){
	int a, b, c;
	cin >> a >> b >> c;
	for( int i = 2; i < 10000000; i++ ){ // 从2开始
		if( a % i == b % i && a % i == c % i ){
			cout << i;
			break; // 遇到最小的跳出循环
		}
	} 
	return 0;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值