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
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
// 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;
}