SHA256


私信TA

用户名:uq_41463493448

访问量:4185

签 名:

星光不问赶路人,岁月不负有心人

等  级
排  名 565
经  验 4162
参赛次数 1
文章发表 18
年  龄 22
在职情况 学生
学  校
专  业

  自我简介:

(第一次写出测试没有报错,而且一次通过AC的程序,还挺开心哈哈哈。)

解题思路:


首先读懂尼科彻斯定理的定义:任何一个整数m的立方都可以写成m个连续奇数之和。

题目的输入要求是:输入任一正整数

题目的输出要求是:输出该数的立方分解为一串连续奇数的和


观察输出案例:

13*13*13=2197=157+159+161+163+165+167+169+171+173+175+177+179+181

能发现13*13的结果(169)也在连续奇数数列中,并且它还是中位数

连续奇数之间差为2,知道中位数,接着往左右两边,可以推出剩下的连续奇数

这些连续奇数的个数正好是输入的正整数

最右边的奇数(最大的连续奇数)为:13*13+13-1=181 【用编程语言表示:N*N+N-1】


通过继续列举,发现奇数和偶数规律相同,无需分开讨论

3*3*3=27=7+9+11;

4*4*4=64=13+15+17+19

4*4+4-1=19  最右边的奇数用编程语言表示仍然是:N*N+N-1】


找出规律之后,就要考虑数据的存储和输出:

定义一个数组list[1000]:最后循环遍历输出连续奇数

先求出最右边的奇数,再从右至左存储每一个连续奇数(两个连续奇数的差值为2)

定义一个计数器num:赋值为输入的整数-1,用于表示数组元素的下标

定义一个变量sum:赋值为输入的整数的立方

定义一个变量N:用于输入整数


参考代码:

#include <iostream>
using namespace std;
int main()
{
 int sum=0,N,list[1000],num; //变量和数组的定义
 
 cin>>N;     //输入正整数
 sum=N*N*N;  //sum存储输入整数的立方
 num=N-1;   //num用于表示数组下标,需要-1因为数组下标从0开始
 list[num]=N*N+N-1;  //把数组最右边的奇数表示出来
 
 while(num>0)   //用于每一个连续奇数并存储在数组中的循环
 {
  list[num-1]=list[num]-2;   //从右往左推
  num--;
 }
 cout<<N<<"*"<<N<<"*"<<N<<"="<<sum<<"=";   //按照题目输出格式要求输出
 
 for(int i=0;i<=N-1;i++)  //循环遍历输出每一个连续奇数元素
 {
   if(i==N-1)     //最后一个连续奇数没有“+”号,设计一个if条件体单独讨论输出格式
   {
    cout<<list[i]<<endl;
   }else
   {
    cout<<list[i]<<"+";   //按照题目输出格式要求输出
   }
 }
 return 0;
}


 

0.0分

17 人评分

  评论区