面试官给了这样一个题目,输入数字m,他如果是n个连续数字的和,输出这n个数字,输出所有的可能。
例子 5=2+3,15=4+5+6,15=1+2+3+4+5,15=7+8
其实这道题有三种解决办法
第一种利用等差数列公式解决,即上面那个公式,只需要等算出来的a1为整数就行,代码如下:
#include<iostream> using namespace std; int main(void) { int m; cin>>m; for(int i=2;i<m/2;i++) { if((2*m-i*i+i)%(2*i)==0) { int a1=(2*m-i*i+i)/(2*i); if(a1>0) //有的数据会有0的情况 { for(int j=0;j<i;j++) { cout<<a1+j; } cout<<endl; } } } return 0; }
第二种办法同学介绍的,假如你的n为奇数,那么m%n==0,这n个数就符合题意,假如你的n为偶数,则m%n==n/2即可
#include<iostream> using namespace std; int main(void) { int m; cin>>m; for(int i=2;i<m/2;i++) { if(i%2!=0) { if(m%i==0) { for(int j=0;j<i;j++) { cout<<j+m/i-(i/2); } cout<<endl; } } else { if(m%i==i/2&&(m/i-(i/2)+1)>0) { for(int j=0;j<i;j++) { cout<<j+m/i-(i/2)+1; } cout<<endl; } } } return 0; }
第三种方法就是自己在面试时候写的暴力方法
#include<iostream> using namespace std; int main(void) { int m; cin>>m; for(int i=1;i<m;i++) { int sum=0,end,j,begin; for(j=i;sum<m;j++) { sum+=j; } if(sum==m) { for(begin=i;begin<j;begin++) { cout<<begin; } cout<<endl; } } return 0; }
以上的三种方法自己仅简单的过了几个测试用例,并不保证一定正确,发现什么问题的可以评论一下,我会及时修改。
原文:https://www.cnblogs.com/caijiyang/p/12634153.html