OJ系统刷题 第五篇

12401 - 小鱼的航程(改进版)

时间限制 : 1 秒

内存限制 : 128 MB

有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周x(1≤x≤7)x(1≤x≤7) 开始算起,过了n(n≤10^6)n(n≤106)天以后,小鱼一共累计游泳了多少公里呢?

输入

输入两个整数x,n(表示从周x算起,经过n天)。

输出

输出一个整数,表示小鱼累计游泳了多少公里。

样例

输入

3 10

输出

2000

 答案:

#include
int main() {
	int x, n;
	scanf("%d%d", &x, &n);
	int sum = 0;
	if (x <= 5) {
		sum += 250 * (5 - x+1);
		n = n -( 7 - x+1);
	}
	else if (x == 6) {
		n = n - 2;
	}
	else if (x == 7) {
		n = n-1;
	}
	int ret = n % 7;
	if (ret == 0) {
		sum =sum+ 250 * (n / 7)*5;
	}
	else if (ret!=0 && n % 7 == 6) {
		sum = sum + 250 * (n / 7)*5 + 5 * 250;
	}
	else {
		sum = sum + 250 * (n / 7)*5 + (n % 7) * 250;
	}
	printf("%d\n", sum);
	return 0;
}

分析:题目是从x当天算,比如从第周四算起,到周五是经过了两天,很多人以为是经过经过5-4=1天,其实不是这样的。是走过5-4+1=2天。然后算出剩下的天数有几个周零几天即可算出答案。

是否通过:

13202 - 判断两个数是否互质(重点题)

时间限制 : 1 秒

内存限制 : 128 MB

判断两个数是否互质(最大公约数为1)。

输入

一行,包含两个正整数m n (2<=m, n <= 1,000,000,000)

输出

若两数互质输出Yes,否则输出No

样例

输入

2 3

输出

Yes

答案:

 

#include
using namespace std;
bool isFlag(long int n,long int m) {
	if (m == 1 || n == 1) {
		return true;
	}
	long max = n > m ? n : m;
	long min = n < m ? n : m;
	while (min) {
		int r = max % min;
		max = min;
		min = r;
	}
	if (max > 1) {
		return false;
	}
	return true;
}
int main() {
	long int n, m;
	cin >> m>>n;
	if (isFlag(m,n)) {
		cout << "Yes";
	}
	else {
		cout << "No";
	}
	return 0;
}

分析:什么是两个数互质?不是说两个数都是质数就是两个数互质,二是两个数的最大公约数仅仅是1,就是互质。因此1和任何数互质0和任意数的最大公约数就是那个数本身。因为本题两个数字可能比较大,如果一步步判断两个数有没有公共的公约数是会超时的,得改进算法:

我们可以求两个数的最大公约数,如果最大公约数大于1,则他们不互质。如果为1,则互质。

这道题的核心是掌握求两个数最大公约数的求法

是否通过:

OJ系统刷题 第五篇_第1张图片

 

13203 - 回文数判断

时间限制 : 1 秒

内存限制 : 128 MB

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。

例如:若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。

请判断输入的整数n是否为回文数,如果是则输出Yes,否则输出No。

输入

整数n

输出

Yes/No

样例

输入

1221

输出

Yes

 答案:

#include
using namespace std;
int main() {
	int n;
	cin >> n;
	int temp = n;
	int r = 0, sum = 0;
	while (n) {
		r = n % 10;
		sum = r + sum * 10;
		n /= 10;
	}
	if (sum == temp) {
		cout << "Yes\n";
	}
	else {
		cout << "No\n";
	}
	return 0;
}

分析:这个题其实不难,在刷OJ里面的题,好几个题都是类似的思想。本题相当于就是告诉我们要知道什么是回文数。

是否通过:

 

 

13204 - 小玉游泳

时间限制 : 1 秒

内存限制 : 128 MB

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%。现在小玉想知道,如果要游到距离x米的地方,她需要游多少步呢。请你编程解决这个问题。

输入

输入一个数字(不一定是整数,小于100m),表示要游的目标距离。

输出

输出一个整数,表示小玉一共需要游多少步。

样例

输入

4.3

输出

3

答案:

#include
using namespace std;
int main() {
	float x;
	cin >> x;
	float step= 2.0F;
	float sum = 0.0F;
	int count = 0;
	while (sum < x) {
		sum = sum + step;
		count++;
		step *= 0.98F;
	}
	cout << count;
	return 0;
}

 分析:这个题目很重要,这种题目可以换着花样变换。题目中关于小玉要走多少步,很多人在最后一步超越指定距离后不太好判断。我们只需要记住一点,只要当前距离严格小于指定距离,就要继续游泳。注意:是严格小于当大于等于时说明已经到达追指定结点了。因此这个题最难的地方就是循环条件的判断,很多人写成小于等于了。注意不是小于等于,因为等于的时候说明已经达到指定的位置了,因此循环条件是严格小于

是否通过:

 

13205 - 判断一个数是否是素数

时间限制 : 1 秒

内存限制 : 128 MB

素数(prime number)又称质数。素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。1不是素数。

如果输入的数是素数则输出Yes,否则输出No。

输入

正整数n(1<=n<=10^{12})(1<=n<=1012)

输出

如果是素数则输出Yes,否则输出No。

样例

输入

3

输出

Yes

答案:

#include
#include
using namespace std;
int main() {
	long long n;
	cin >> n;
	bool flag = true;//为true是表示不是素数
	for (register int i = 2; i <= sqrt(n); i++) {
		if (n % i == 0&& n!= 2) {
			flag = false;
			break;
		}
	}
	if (flag) {
		cout << "Yes" << endl;
	}
	else {
		cout << "No" << endl;
	}
	return 0;
}

分析:素数又叫质数,就是除了它本身和1以外,没有其他因子的数。对于这道题,我们从2到该数的平方根,为什么循环判断条件是这个,不应该是小于等于n-1吗?其实也没错,但是那个没有优化,对判断一个素数我们从2到该数的平方根之间的所有数,看看他们和该数能不能整除,如果不能则是素数,只要有一个能整除则就不是素数

是否通过:

 

你可能感兴趣的:(OJ系统刷题,算法)