华为机试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:尼科彻斯定理的主要内容,如果未能解决你的问题,请参考以下文章