(第一次写出测试没有报错,而且一次通过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分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复