股神
题目描述
有股神吗?有,小赛就是!经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?
输入:
输入包括多组数据;
每行输入一个n,1<=n<=10^9 。
输出:
请输出他每股股票多少钱,对于每组数据,输出一行。
我的思路:
首先看到这种序列问题,第一想到的就是暴力破解,用一个数组存储所有的数据,这样做可以解决数据量较少的情况
1 int a[10000]; 2 a[1] = 1; 3 int flag = 1; 4 int temp = 1; 5 for (int k = 2; k<10000; k++){ 6 if (flag>0){ a[k] = a[k - 1] + 1; } 7 if (flag == 0){ a[k] = a[k - 1] - 1; } 8 flag--; 9 if (flag < 0){ 10 temp = temp + 1; 11 flag = temp; 12 } 13 }
上述代码就是简单的遍历,k是n的大小,当我的k过大时程序崩溃,解决不了10e9的情况,所以这个题没法用这个思路解决。怎么办,我考虑到给定n时,我们可以根据它之前下跌过几天和它在最后一次下跌后上涨了几天,我最开始考虑到的是等差数列求和公式,假设没有下跌的情况 s=n+n(n-1)/2,求出这个n就是k天一共有n天下跌了。举个例子 3=2+2*(2-1),第三天经历一次下跌,n=2,股价变为k-2*(n-1)=1;第4天和第5天的情况和第3天一样,而第六天6=3+3*(3-1);n=3,股价变为k-2*(n-1)=2;这样可以看到s=n+n(n-1)/2和s<n+1+(n+1)*n的情况都是股价下跌n-1天。
#include "stdafx.h" #include<stdio.h> #include <iostream> using namespace std; int main() { int n; while (cin>>n){ int i; for (i = 1; i <= n; i++){ int s; s = i + i*(i - 1) / 2; if (s == n){ break; } if (s > n){ i = i - 1; break; } } if (n == 1) printf("1\n"); if (n == 2) printf("2\n"); if (n == 3) printf("1\n"); if(n>3) printf("%d\n", n-2*(i-1)); } }
时间: 2024-10-12 21:36:47