C语言验证尼克切丝定理

C语言验证尼克切丝定理
【问题描述】尼克切丝定理: 任何一个整数n的立方都可以表示成一串连续的奇数之和。 设计程序验证尼克切丝定理。
【输入形式】一个整数n,2<=n<=30
【输出形式】一个奇数a和一个整数k,使 a+(a+2)+..+(a+2k-2) = n*n*n 。要求k >= 2,并且k尽可能小。
【样例输入】

3
【样例输出】

7 3
【样例说明】7 + 9 + 11 = 27

img


// caimi10.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <algorithm>
#include <vector>

using namespace std;

// 尼克切丝定理

vector<int> NiKeQieSidiscipline(int i3CiFangShu)
{
    i3CiFangShu = i3CiFangShu*i3CiFangShu*i3CiFangShu;
    vector<int> vecresult_startItem_k_items;
    vecresult_startItem_k_items.reserve(9);
    int k = 2;
    double dbStartItem = 0;

    while (true)
    {
        // k其实就是项数  k个连续奇数 每个差定值2 所以等差数列  首项加尾项乘以项数除以2  (0+(2*k-1))*k/2 就是所有的差

        // 立方数减去所有差 就是第一项
        dbStartItem = (double)(i3CiFangShu - (0 + 2 *( k - 1))*k / 2) / k;

        if (dbStartItem >= i3CiFangShu)
        {
            break;
        }
        else
        {
            if ((int)dbStartItem != dbStartItem) // 含有小数
            {
                k++; //还没找到头 继续
                continue;
            }
            else
            {
                // 找到了组合
                vecresult_startItem_k_items.push_back(dbStartItem);
                vecresult_startItem_k_items.push_back(k);
                for (size_t i = 0; i < k; i++)
                {
                    vecresult_startItem_k_items.push_back(dbStartItem + i * 2);
                }
                break;

            }
        }
    }

    return vecresult_startItem_k_items;
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("尼克切丝定理: 任何一个整数n的立方都可以表示成一串连续的奇数之和。 设计程序验证尼克切丝定理。\n");

    int n = 0;
    printf("输入n  2<=n<=30\n");
    scanf_s("%d", &n);


    vector<int> vecresult_startItem_k_items = NiKeQieSidiscipline(n);

    printf(" %d ", vecresult_startItem_k_items[0]);
    printf(" %d ", vecresult_startItem_k_items[1]);
    printf("\n");
    for (size_t i = 2; i < vecresult_startItem_k_items.size(); i++)
    {
        if (i == vecresult_startItem_k_items.size() - 1)
        {
            printf(" %d =", vecresult_startItem_k_items[i]);
        }
        else
        {
            printf(" %d +", vecresult_startItem_k_items[i]);
        }
    }
    printf(" %d ", n*n*n);


    _tsystem(L"pause");

    return 0;
}