C++ 以费波纳茨数列为权重的加权均值计算方法 wMA

#pragma once

#include <iostream>

using namespace std;

template <typename T> double *wMA(T &tArray, int iWMALen) // 应用模版数据类型 typename T 引用外部数组 tArray
{
    int iArrayLen = sizeof(tArray) / sizeof(tArray[0]); // 计算传入数组长度 = 总数组字节大小 / 首元素字节大小
    cout << "Length of import array is: " << iArrayLen << endl;
    cout << "Import array is:";
    for(int i = 0; i < iArrayLen; i++)
    {
        if(i == 0)
            cout << "[" << tArray[i] << " ";
        else if(i == iArrayLen - 1)
            cout << tArray[i] << "]" << endl;
        else
            cout << tArray[i] << " ";
    }
    if(iArrayLen >= iWMALen && iWMALen > 0) // 计算前提,数组长度不能小于均值要计算的天数
    {
        int *pWMAW = new int[iWMALen]; // 把费波纳茨数列个值做权重
        int iSumW = 0; // 费波纳茨数列的算术和
        switch(iWMALen)
        {
            case 1:
            {
                cout << "Creating fabonacci numbers:" << endl;
                pWMAW[0] = 1;
                cout << "[0] = " << pWMAW[0] << endl;
                iSumW = pWMAW[0];
                break;
            }
            case 2:
            {
                cout << "Creating fabonacci numbers:" << endl;
                pWMAW[0] = 1;
                pWMAW[1] = 1;
                cout << "[0] = " << pWMAW[0] << endl;
                cout << "[1] = " << pWMAW[1] << endl;
                iSumW = pWMAW[0] + pWMAW[1];
                break;
            }
            default:
            {
                cout << "Creating fabonacci numbers:" << endl;
                pWMAW[0] = 1;
                pWMAW[1] = 1;
                cout << "[0] = " << pWMAW[0] << endl;
                cout << "[1] = " << pWMAW[1] << endl;
                iSumW = pWMAW[0] + pWMAW[1];
                for(int i = 2; i < iWMALen; i++)
                {
                    pWMAW[i] = pWMAW[i - 1] + pWMAW[i - 2]; // 费波纳茨通项公式算法
                    cout << "[" << i << "] = " << pWMAW[i] << endl;
                    iSumW += pWMAW[i];
                }
                break;
            }
        }
        cout << "The sum of those fabonacci numbers is: " << iSumW << endl;
        int n = iWMALen; // 固定均值计算天数,因为后面这个 iWMALen 会逐步增加变动
        double *pWMAV = new double[iArrayLen]; // 用于保存均值
        cout << "The wMA values are:" << endl;
        while(iWMALen <= iArrayLen)
        {
            double iSumV = 0;
            for(int i = iWMALen - n, j = 0; i < iWMALen; i++, j++)
            {
                iSumV += tArray[i] * pWMAW[j];
            }
            pWMAV[iWMALen - 1] = iSumV / iSumW; // 算法 wMA = (数组个值 * 费波纳茨数列个值权重)的前 n 项和 / 费波纳茨数列加和
            cout << "wMA[" << iWMALen - 1 << "] = " << pWMAV[iWMALen - 1] << endl;
            iWMALen++;
        }
        delete(pWMAW); // 该指针作用到此为止,释放指针
        cout << "Remeber to delete the return pointer of wMA(...)!\n" << endl; // 函数返回指针,提示后面删除堆中新建指针
        return pWMAV;
    }
    else
    {
        cout << "Error!\n" << endl;
        return NULL;
    }
}

int main()
{
    int array[] = {1, 2, 5, 3, 4, 6, 18, 7};
    double *p = wMA(array, 5);
    delete(p);
    cin.get();
    return 0;
}

时间: 2024-10-17 16:51:52

C++ 以费波纳茨数列为权重的加权均值计算方法 wMA的相关文章

费波纳茨数列 几种实现方法

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以<斐波纳契数列季刊>为名的一份数学杂志,用于专门刊载这方面的研究成果. 定义     斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 2

CodeForces 450B Jzzhu and Sequences 费波纳茨数列+找规律+负数MOD

题目:Click here 题意:给定数列满足求f(n)mod(1e9+7). 分析:规律题,找规律,特别注意负数取mod. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 const int M = 1e5+5; 8 const int

hdu 5459 Jesus Is Here (费波纳茨递推)

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 250    Accepted Submission(s): 169 Problem Description I've sent Fang Fang around 201314 text messages in almost 5 years. Why can't she make sens

费波那契数列算法

费波那契数列算法 作者:白宁超 2016年10月27日20:06:54 斐波那契数学描述: F0 = 0     (n=0) F1 = 1    (n=1) Fn = F[n-1]+ F[n-2](n=>2) Python语言实现: 分析:当n=0时为0,n=1时为1,n>2时,最后两数之和.由此可知,链表fibs初始化0,1:列表可以当做链表使用,具有负数索引特性,采用后两位数相加追加即可. import datetime #由于斐波那契特性前两首0,1,其后各项均为之前两数之和可知,时间复

(c语法百题31)费波那契数列

知识点: 数组,for语句,if语句灵活运用 在for中用if控制每5个数换行一次 内容: 已知faibonacai(费波那契)数列的前几个数分别为1,1,2,3,5,8,13,……,编程求此数列的前n(n>=5)项. 输入说明: 一行一个整数n(>=5 and <=22) 输出说明: 每5格一行,不足5个的也占一行 输入样例: 5 输出样例 : 1 1 2 3 5 #include <stdio.h> int main() { int a[22],n,i; a[0]=1;

费波那也数列的非递归实现

n =0, f(0) = 0; n = 1, f(1) = 1 n > 1, f(n) = f(n-1) + f(n-2) 使用 2 个临时变量,存储 n-1 和 n-2 的费波那也数: f(2) = f(0) + f(1) ,因此用f(2) 覆盖 f(0) ,因为 f(1) 仍然需要保留:即 f(0) = f(0) + f(1) f(3) = f(1) + f(2) , 因此用f(3) 覆盖 f(1) ,因为 f(2) 仍然需要保留:即 f(1) = f(1) + f(0) 如上所示,偶数 n

Python之斐波拉数列

在日常情况,可能会涉及到一个数据模型,就是前两个数字相加的所得之和,等于第三个数字,这里我们可以引用斐波拉数列数据模型;例如有如下数字 0,1,1,2,3,5,13,13,21,34,55,144,233,377,610 #打印出如上述数列,前两个数相加等于后面的数(这里做一个限制条件如果arg3>10,则返回arg3,否则就是一个无限制的循环) #顶一个函数func def func(arg1,arg2):   if arg1 == 0:     pass   arg3 = arg1 + ar

编程之美-快速费波拉契数列

写出来也被它的速度吓了一跳,程序最坑的地方应该就是防止溢出了. #include <stdio.h> #include <stdlib.h> #define MOD (19999997) struct matrix { unsigned long long a; unsigned long long b; //{a,b} unsigned long long c; //{c,d} unsigned long long d; }; struct matrix mul_matrix(s

走天梯_费波拉契

有一个天梯,每次只能走1步或者2步,阶梯从0开始计数,现在输入天梯的阶数,求一共有多少种走法. 由于每次只能走1步或者2步,因此走到第3阶的时候,不是从第1阶走,就是从第2阶走.故第3阶的走法是第1阶的走法加上第2阶的走法的和.如此类推. 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<windows.h> 5 6 double tencent(int n);//如果数值过大,需要用到double