华为机试HJ76:尼科彻斯定理

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ76:尼科彻斯定理相关的知识,希望对你有一定的参考价值。

作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。

本题含有多组输入数据。

输入描述:

输入一个int整数

输出描述:

输出分解后的string

示例:

输入:

6

输出:

31+33+35+37+39+41

解题思路:

本题是个数学问题,找规律。2的立方相当于第2个奇数和第3个奇数相加,3的立方相当于第4个奇数+第5个奇数+第6个奇数,那么N的立方等于N个奇数相加,开头的奇数是从哪个开始呢?1的立方有1个加项,2的立方有2个加项,3的立方有3个加项,则4的立方其开头的奇数是从1开始6(1+2+3)个奇数后的下一个奇数。

设计算法,假设输入num值,先计算前num-1项的加项有多少个,则根据序列求和公式sum=(num-1)*(num-1+1)/2,即前num-1项加项共有sum个;而num立方的第一个奇数是2*sum+1;写个循环从第一个奇数开始循环num次完成,前num-1次后面带个+字符。

测试代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int num;
    while(cin>>num)
    {
        int sum=num*(num-1)/2;
        vector<int> result;
        for(int k=0;k<num;++k)
        {
            if(k!=num-1)
            {
                cout<<2*(sum+k)+1<<"+";
            }
            else{
                cout<<2*(sum+k)+1<<endl;
            }
        }
    }
    return 0;
}

以上是关于华为机试HJ76:尼科彻斯定理的主要内容,如果未能解决你的问题,请参考以下文章

华为机试题 HJ76尼科彻斯定理

华为OJ平台——尼科彻斯定理

验证尼科彻斯定理

例30:尼科彻斯定理

099.尼科彻斯定理

华为机试HJ99:自守数(附带提速方案)