OJ系统刷题 第七篇

13406 - 数根

时间限制 : 1 秒

内存限制 : 128 MB

数根是这样定义的:对于一个正整数n,将它的各个数位上的数字相加得到一个新数,如果这个数是一位数,我们就称之为n的数根,否则重复处理直到它成为一个一位数。

例如,n=34,3+4=7,7是一位数,所以7是34的数根。

再如,n=345,3+4+5=12,1+2=3,3是一位数,所以3是345的数根。

对于输入数字n,编程计算它的数根。

输入

输入正整数n(1 <= n < 10,000,000)

输出

输出n的数根。

样例

输入

345

输出

3

答案:

#include<iostream>
using namespace std;
int main() {
	int n, r;
	cin >> n;
	int sum = 0;
	while (true) {
		while (n) {
			r = n % 10;
			sum += r;
			n = n / 10;
		}
		if (sum >= 10) {
			n = sum;
			sum = 0;
			
		}
		else {
			break;
		}
	}
	cout << sum << endl;
	return 0;
}

 分析:这个题难度还不小,第一次写好几次都没整明白逻辑。但经过几次修改算是整明白了。用sum变量来记录这个数各个位数之和,如果sum大于等于10,再把sum赋值给n,此时sum的值要重新赋值为0。直到sum小于10即可。这个题难度还是不小的

是否通过:

 13408 - 求最大质因数(难题!!一定要二刷、甚至三刷!)

时间限制 : 1 秒

内存限制 : 128 MB

求一个数的最大质因数(包含它本身)。

输入

正整数n(2<=n<=10,000,000,000,000)

输出

正整数n的最大质因数

样例

输入

12

输出

3

答案:

#include<iostream>
#include<math.h>
using namespace std;
long long int isFlag(long long int n) {
	int flag = 1;
	int ret = 0;//用来记录最大质因数
	if (n == 1||n == 2) {
		return n;
	}
	else {
		for (long long int i = 2; i <= sqrt(n);i++ ) {
			if (n % i == 0) {
				flag = 0;
				break;
			}
		}
	}	
	if (!flag) {
		for (long long i = 2; i <= n; i++) {
			/*这个循环是让n依次找到从小到大的质因数,然后依次除以这个质因数
			* 直到当前这个数本身就为质数。
		    */
			while (n % i == 0) {
				n /= i;
				ret = i;
			}
		}
		return ret;
	}
	return n;
}
int main() {
	long long n;
	cin >> n;
	cout << isFlag(n) << endl;
	return 0;
}

 分析:本题难度非常大,首先你得直到任何一个合数都可以写成若干个质数的乘积,比如4=2*2,

30=2*3*5,再如455=5*7*13。当然,如果这个数是素数的话,最大质因数就是它本身。我们现在就是求任意数的最大质因素。算法如下:

1、首先判断该数n(n>=2)是不是素数,如果是,则最大质因素是它本身

2、如果该数不是素数,则让该数从i(i=2)开始对该数取余,如果余数为0,则让n除以i,之后i++,最后知道n为素数为止,此时n为最大质因数。

是否通过:

13411 - 买房子

时间限制 : 1 秒

内存限制 : 128 MB

某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子?(第一年年薪N万,房价200万)

输入

一行,包含两个正整数N(10 <= N <= 50), K(1 <= K <= 20),中间用单个空格隔开。

输出

如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下,否则输出Impossible。

样例

输入

50 10

输出

8

答案:

#include<iostream>
using namespace std;
int main() {
	int N, K;
	int count = 1;
	double price = 200;
	cin >> N >> K;
	int step = N;
	double rat = K / 100.0;
	while (N < price) {
		N += step;
		price *= (1 + rat);
		count++;
		if (count > 20) {
			break;
		}
	}
	if (count <= 20) {
		cout << count << endl;
	}
	else {
		cout << "Impossible" << endl;
	}
	return 0;
}

 分析:本题难度不大,但是容易陷入死循环,当年薪N很小,跟不上房价涨的速度,则N可能会永远小于price,则陷入死循环。因此当count大于20时要跳出循环。这是这个题容易出错的一个点

是否通过:

 

 13414 - 球弹跳高度的计算(重点题目,建议二刷)

时间限制 : 1 秒

内存限制 : 128 MB

一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下。 编程计算气球在第10次落地时,共经过多少米? 第10次反弹多高?

输入

输入一个整数h,表示球的初始高度。

输出

输出包含两行:

第1行:到球第10次落地时,一共经过的米数。

第2行:第10次弹跳的高度。

注意:结果可能是实数,结果用double类型保存。

提示:输出时不需要对精度特殊控制,用cout << ANSWER,或者printf("%g", ANSWER)即可。

样例

输入

20

输出

59.9219
0.0195313

 答案:

#include<iostream>
using namespace std;
int main() {
	int h;
	cin >> h;
	int n = 10;
	double sum = h;
	double step = h;
	for (int i = 1; i <= n - 1; i++) {
		sum += step;
		step /= 2.0;
	}
	cout << sum << endl;
	cout << step/2.0 << endl;
	return 0;
}

分析:这个题让我想起在大一第一次学编程老师讲这个题,当时感觉好难好难。因为当时没有入门,就感觉编程特难,现在再看这个题,感觉一般。但是这个题就是要注意一点:

第i次落地,要循环计算i-1次

第i次落地时,也就是第i-1次弹起时。因此在计算第i次弹起高度时,要再除以2.0

是否通过: 

 

13417 - 正常血压(重点题)

时间限制 : 1 秒

内存限制 : 128 MB

监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。

输入

第一行为一个正整数n,n < 100

其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。

输出

输出仅一行,血压连续正常的最长小时数(注意审题)

样例

输入

4
100 80
90 50
120 60
140 90

输出

2

答案:

#include<iostream>
bool isFlag1(int a, int b) {
	if (a >= 90 && a <= 140 && b >= 90 && b <= 140) {
		return true;
	}
	return false;
}
bool isFlag2(int a, int b) {
	if (a >= 60 && a <= 90 && b >= 60 && b <= 90) {
		return true;
	}
	return false;
}
using namespace std;
int main() {
	int n,count=1,max=0;
	int a[100],b[100];
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i] >> b[i];
	}
	for (int i = 0; i < n-1; i++) {
		if (isFlag1(a[i], a[i + 1]) && isFlag2(b[i], b[i + 1])) {
			count++;
		}
		else {
			max = max < count ? count : max;
			count = 1;
		}
	}
	max = max < count ? count : max;
	cout << max << endl;
	return 0;
}

 分析:这个题难度还是稍稍较大,首先是对题目的理解。这个题目求的是血压连续正常最长的小时数,注意有个连续。当出现不连续的情况下,coun要置0,从当前位置又要重新开始计算

是否通过:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值