启动! 2021-10-15 07:49 采纳率: 80%
浏览 52
已结题

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

  • 写回答

1条回答 默认 最新

  • 胸毛男 2021-10-15 09:38
    关注

    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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月2日
  • 已采纳回答 10月25日
  • 请采纳用户回复 10月18日
  • 创建了问题 10月15日

悬赏问题

  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输