Skip to content

Latest commit

 

History

History
77 lines (63 loc) · 2.36 KB

2000.md

File metadata and controls

77 lines (63 loc) · 2.36 KB

复杂序列 2000: 金币

题目要求计算给定规则序列的某一项,这次的序列稍微复杂一点。

题目来源

2000: 金币

总时间限制: 1000ms 内存限制: 65536kB

描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。

你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。

输入

输入包含至少一行,但不多于21行。除最后一行外,输入的每行是一组输入数据,包含一个整数(范围1到10000),表示天数。输入的最后一行为0,表示输入结束。

输出

对每个数据输出一行,包含该数据对应天数和总金币数,用单个空格隔开。

样例输入

10
6
7
11
15
16
100
10000
1000
21
22
0

样例输出

10 30
6 14
7 18
11 35
15 55
16 61
100 945
10000 942820
1000 29820
21 91
22 98

首先观察序列,应当是一个一平方数递增的序列,例如一天1个,两天2个,三天3个。所以可以先对整平方的天数求和,然后计算剩余天数里得到的金币数。

#include <iostream>
using namespace std;
int main() {
	int n;
	while (cin >> n && n != 0) {
		int i = 1, sum = 0, left = n;
		while (left >= i) {
			sum += i * i;
			left -= i;
			i++;
		}
		sum += left * i;
		cout << n << " " << sum << endl;
	}
	return 0;
}

2000.cpp 代码长度:259B 内存:144kB 时间:3ms 通过率:91% 最小内存:144kB 最短时间:0ms

题目有多组输入,以0为最后一组,可以通过while循环实现。由于输入的整数范围较小,如果编译器的int型为4个字节是足够存储的。在内层循环,对剩余的天数每次做减法,总金币数做累加,再对不够整平方的数处理加到一起,输出即可。

有任何的改进意见欢迎大家在微信平台公众号主页面留言或者发表issue。