编程练习:股神

题目来源:赛码网http://exercise.acmcoder.com/online/online_judge_list

/***************************************************************
题目描述:股神
有股神吗?
有,小赛就是!
经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。
为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?

输入:
输入包括多组数据;
每行输入一个n,1<=n<=10^9 。
输出
请输出他每股股票多少钱,对于每组数据,输出一行。

样例:
样例输入
1
2
3
4
5
样例输出
1
2
1
2
3

编程思路:
定义day为天数,price为当天股票价格,up为day中涨的天数,down为day中下降的天数,则有:
day=1+up+down,price=1+up-down,推出price=day-2*down.所以求出down,即可求得price。
经验证,day=(down+1)*(down+2)/2+f(down),其中f(down)为[0,down+1]中的一个整数。
编程通过遍历找到down, 继而得到price.
****************************************************************/

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 int main() {
 5     unsigned day,price,i,j,temp,flag=0;//day:输入的天数,price:当天的股票价格,i:下跌的天数,通过遍历得到,j:for循环,temp:临时变量,flag:标志位 
 6     while(scanf("%d",&day)!=EOF){
 7         //计算i,下跌的天数
 8         for(i=0;i<=sqrt(2*day);i++){
 9             temp=(i+1)*(i+2)/2;
10             if(temp==day)
11                 break;
12             else{
13                 for(j=1;j<=i+1;j++){
14                     if(temp+j==day){
15                         flag=1;//找到了满足要求的i,flag置1,退出外循环 
16                         break;
17                     }
18                 }
19                 if(1==flag)
20                     break;
21             }
22         }
23         flag=0; 
24         price=day-2*i;
25         printf("%d\n",price);
26     }
27     return 0;
28 }

 

posted @ 2016-09-21 15:48  Disen  阅读(874)  评论(0编辑  收藏  举报