第六周测验

1788:Pell数列 http://noi.openjudge.cn/ch0202/1788/

描述

Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2, ... , an = 2 * an − 1 + an - 2 (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。

输入

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

输出

n行,每行输出对应一个输入。输出应是一个非负整数。

样例输入

2
1
8

样例输出

1
408
#include<iostream>
#define MAXN 1000010
int a[MAXN];
using namespace std; 
int main()
{
	int n, k;
	cin >> n;
	a[1] = 1;
	a[2] = 2;
	while(n -- )
	{
		cin >> k;
		if(k == 1) cout << "1" << endl;
		else if(k == 2) cout << "2" << endl;
		else
		{
			for(int i = 3; i <= k; ++i)
			{
				a[i] = (2*a[i-1] + a[i-2]) % 32767;
			}
			cout << a[k] << endl;
		}
	}
	return 0;
}

7592:求最大公约数问题 http://noi.openjudge.cn/ch0202/7592/

描述

给定两个正整数,求它们的最大公约数。

输入

输入一行,包含两个正整数(<1,000,000,000)。

输出

输出一个正整数,即这两个正整数的最大公约数。

样例输入

6 9

样例输出

3

提示

求最大公约数可以使用辗转相除法:
假设a > b > 0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。
由于这个过程会一直递减,直到a%b等于0的时候,b的值就是所要求的最大公约数。
比如:
9和6的最大公约数等于6和9%6=3的最大公约数。
由于6%3==0,所以最大公约数为3。

#include<iostream>
using namespace std;
int gcd(int a, int b)
{
	if(a % b == 0) 
		return b;
	else return gcd(b, a%b);
}
int main()
{
	long long a, b;
	cin >> a >> b;
	if(a < b) 
	{
		a = a ^ b;
		b = b ^ a;
		a = a ^ b;
	}
	cout << gcd(a,b) << endl;
	return 0; 
}

【注意】当不要a与b交换这一步代码也是对的。

因为在调用gcd(a,b)函数时:

(1) a = 6, b = 9;

(2) a = b = 9; b = a % b = 6 % 9 = 6.会自动将数据交换过来。 

其余的题没找到出处~

猜你喜欢

转载自blog.csdn.net/yanyanwenmeng/article/details/81073230