一个数可以为多个连续自然数的和

面试官给了这样一个题目,输入数字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;
 } 

以上的三种方法自己仅简单的过了几个测试用例,并不保证一定正确,发现什么问题的可以评论一下,我会及时修改。

猜你喜欢

转载自www.cnblogs.com/caijiyang/p/12634153.html