连续奇数和

连续奇数和

时间: 1ms        内存:128M

描述:

 小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。

    比如:

2^3 = 8 = 3 + 5

3^3 = 27 = 7 + 9 + 11

虽然他没有想出怎么证明,但他想通过计算机进行验证。

所以聪明的你快来帮小明证明吧,你的工作就是要找出任何数字的立方的连续奇数之和的表示,如上式所示。

输入:

多组数据输入,第一行输入一个数T,接下来有T行。

每行输入一个数n,表示你要计算立方的数字。

输出:

输出对应n的立方之连续奇数和表示法的序列。

示例输入:

2
2
3

示例输出:

3 5
7 9 11

提示:

参考答案(内存最优[760]):

#include<stdio.h>
#include<math.h>
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int x;//x 为输入的数 
		scanf("%d",&x);
		int x3=pow(x,3);
		for(int m=0; ;m++)//m为数字列开端,n为数字序列个数,
		{
			int y=0;//判断是否求出序列 
			int sum;
			for(int n=1; ;n++)
			{
				int sum=2*m*n+n*n;
				if(sum==x3)
				{
					for(int i=0;i<n;i++)
					{
						printf("%d",2*(m+i)+1);
						if(i!=n-1)
							printf(" ");
					}
					y=1;
				}
				else if(sum>x3) break;
			}
			if(y) break;
		}
		printf("\n");
	}
	return 0;
} 

参考答案(时间最优[0]):

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int i,j,s,s0,n,t,b,flag;
    int T;
    while(scanf("%d",&T)!=EOF){
        for(int k=0;k<T;k++){
            scanf("%d",&n);
        s0=0,flag=0;
        s=n*n*n;
        for(i=1;;i+=2)
        {
            s0=0;
            for(j=i;;j+=2)
            {
                s0+=j;
                if(s0==s)
                {
                    flag=1;
                    t=i;
                    b=j;
                    break;
                }
                if(s0>s){
                    break;
                }
            }
            if(flag==1)
                break;
        }
        for(i=t;i<=b;i+=2)
            if(i!=b)
            cout<<i<<" ";
            else
                cout<<i;
        cout<<endl;
        }
}


    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞