转载自:http://blog.youkuaiyun.com/Julialove102123/article/details/79484315
有股神吗?
有,小赛就是!
经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不>变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天…依此类推。
为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?
算法分析:
天数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ... | n |
涨跌情况 | 0 | +1 | -1 | +1 | +1 | -1 | +1 | ... | +/-1 |
股价 | 1 | 2 | 1 | 2 | 3 | 2 | 3 | ... |
天数: 1 2 | 3 4 5 | 6 7 8 9 |10 11 12 13 14 | 15 16 17 18 19 20 | 。。。。。。
下跌次数: 0 1 2 3 4 依次递增,i++
每段个数: 2 3 4 5 6 依次递增,j++
代码练习:
Python实现:
if __name__=='__main__':
while 1:
s = raw_input()
if s != "":
n = int(s) - 1 #第一天价格不变
val = 1
up = 1 #涨幅度
while n >= up + 1:
val+= up - 1
n-= up + 1
up += 1
val = val + n
print val
C++实现:
#include <iostream>
using namespace std;
int GetValue(int n)
{
int i = 0;// i统计遇到了多少次下跌
int j = 2;// (第一段天数为2)每个分段的总天数:每次下跌之后上涨的天数,包含已经下跌的那天
int k = n;//
while (k > j) {
i++;
k-= j;
j++;
}
return n - i*2;// 跌一次,与直接递增的数列相比,就相当于减2
}
int main()
{
int n;
while (cin >> n) {
cout << GetValue(n) << endl;
}
return 0;
}