计算2支股票的M天运动平均价格
Posted szu-ds-wys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算2支股票的M天运动平均价格相关的知识,希望对你有一定的参考价值。
题目描述
给定2支股票的开盘价和收盘价的N天历史数据,
要求按开盘和收盘,分别计算每支股票的每个日期对应的M天移动平均价格。
假定两个股票数据如下:
日期 开盘/收盘 第1支股票价格S1 第2支股票价格S2
2004/7/29 close 64
2004/7/25 close 2 6
2004/7/26 open 8 12
2004/7/30 open 2 4
2004/7/27 close 8 10
2004/7/28 open 4 2
按M=2天计算移动平均价格,按先开盘,后收盘价,输出如下:(若某日期之前,没有M-1条的记录(日期不用连续),则不用输出)
2004/7/28 open 6 7
2004/7/30 open 3 3
2004/7/27 close 5 8
2004/7/29 close 7 7
其中, 2004/7/28日的S1的值为(8+4)/2 = 6, 即将2004/7/28和(最近1条记录2004/7/26,最近2条记录,最近M-1条记录)的价格,求和并计算平均。
输入
第1行:N天记录 M天平均
第2行到N+1行:N天2支股票的开盘与收盘价格(注意日期是无序的)
6 2
2004/7/29 close 6 4
2004/7/25 close 2 6
2004/7/26 open 8 12
2004/7/30 open 2 4
2004/7/27 close 8 10
2004/7/28 open 4 2
输出
每个日期的最近M条记录(包括该日期的价格在内)的平均价格(若某日期之前没有M-1条的记录(日期不用连续),则不用输出)
2004/7/28 open 6 7
2004/7/30 open 3 3
2004/7/27 close 5 8
2004/7/29 close 7 7
样例输入
6 2 2004/7/29 close 6 4 2004/7/25 close 2 6 2004/7/26 open 8 12 2004/7/30 open 2 4 2004/7/27 close 8 10 2004/7/28 open 4 2
样例输出
2004/7/28 open 6 7 2004/7/30 open 3 3 2004/7/27 close 5 8 2004/7/29 close 7 7
提示
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int N,M;///N天记录,M天平均 cin>>N>>M; string *date,*tag; date=new string[N]; tag=new string[N]; int *year,*month,*day,*value1,*value2; year=new int[N]; month=new int[N]; day=new int[N]; int *D=new int[N]; value1=new int[N]; value2=new int[N]; for(int i=0;i<N;i++) { cin>>date[i]>>tag[i]>>value1[i]>>value2[i];//date为日期,tag为状态,value1和value2为值 string t=date[i]; int Y=(t[0]-‘0‘)*1000+(t[1]-‘0‘)*100+(t[2]-‘0‘)*10+(t[3]-‘0‘); year[i]=Y; if(t[6]==‘/‘) { int M=t[5]-‘0‘; month[i]=M; if(t.size()==8) { int D=t[7]-‘0‘; day[i]=D; } else { int D=(t[7]-‘0‘)*10+t[8]-‘0‘; day[i]=D; } } else { int Mon=(t[5]-‘0‘)*10+t[6]-‘0‘; month[i]=Mon; if(t.size()==9) { int D=t[8]-‘0‘; day[i]=D; } else { int D=(t[8]-‘0‘)*10+t[9]-‘0‘; day[i]=D; } } D[i]=year[i]*1000+month[i]*10+day[i]; } for(int i=0;i<N;i++) { for(int j=0;j<N-1-i;j++) { if(D[j]>D[j+1])//按总日期D进行冒泡排序,排序时除了要交换date,还需要交换状态tag,还有数值value1和value2 { swap(D[j],D[j+1]); swap(date[j],date[j+1]); swap(tag[j],tag[j+1]); swap(value1[j],value1[j+1]); swap(value2[j],value2[j+1]); } } } int count,sum1,sum2; for(int i=1;i<N;i++)//按日期从小到大先将open状态的平均值输出 { sum1=value1[i],sum2=value2[i]; count=0; if(tag[i]=="close") continue; for(int j=i-1;j>=0;j--) { if(tag[j]=="open") { count++; sum1+=value1[j]; sum2+=value2[j]; } if(count==M-1) break; } if(count==M-1) { cout<<date[i]<<‘ ‘<<tag[i]<<‘ ‘<<sum1/M<<‘ ‘<<sum2/M<<endl; } } for(int i=1;i<N;i++)//按日期从小到大再将close状态的平均值输出 { sum1=value1[i],sum2=value2[i]; count=0; if(tag[i]=="open") continue; for(int j=i-1;j>=0;j--) { if(tag[j]=="close") { count++; sum1+=value1[j]; sum2+=value2[j]; } if(count==M-1) break; } if(count==M-1) { cout<<date[i]<<‘ ‘<<tag[i]<<‘ ‘<<sum1/M<<‘ ‘<<sum2/M<<endl; } } return 0; }
以上是关于计算2支股票的M天运动平均价格的主要内容,如果未能解决你的问题,请参考以下文章
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。