编程练习:股神
题目来源:赛码网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 }