首页 > 试题广场 >

尼科彻斯定理

[编程题]尼科彻斯定理
  • 热度指数:131294 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。
数据范围:
进阶:时间复杂度:,空间复杂度:



输入描述:

输入一个int整数



输出描述:

输出分解后的string

示例1

输入

6

输出

31+33+35+37+39+41
#include <stdio.h>

int main() {
    int a=0;
    scanf("%d",&a);

    int start=a*(a-1)+1;
    for(int i=0;i<a-1;i++)
    {
        printf("%d+",start);
        start+=2;
    }
    printf("%d",start);
    return 0;
}
发表于 2024-08-22 22:02:50 回复(0)
来个笨办法吧
#include <stdio.h>
int main() {
    int a;
    scanf("%d", &a);
    int num = a*a*a;
    for(int j=1;j<10000;j+=2){
        int count=0;
        int temp=j;
        int temp2=j;
        for(int i=0;i<a;i++){
            count+=temp;
            temp+=2;
        }
        if(count==num){
            for(int x=0;x<a;x++){
                if(x==a-1){
                    printf("%d", temp2);
                }else{
                    printf("%d+", temp2);
                }
                temp2+=2;
            }
        }
    }
    return 0;
}

发表于 2024-08-13 16:54:55 回复(0)
#include <math.h>
#include <stdio.h>

int main() {
    int m,n,mid;
    scanf("%d",&m);
    n=pow(m,3);mid=n/m;
    if(m%2==1) //由中位数反推首项
    {
        int temp=m/2;mid-=2*temp;
    }
    else
    {
        int temp=m/2;mid=mid-2*temp+1;
    }
    int i=0;
    while(i<m)
    {
        if(i==m-1) printf("%d",mid+2*i);
        else printf("%d+",mid+2*i);
        i++;
    }
    return 0;
}

发表于 2024-06-19 09:13:57 回复(0)
#include <stdio.h>

int main() {
    int a;
    scanf("%d",&a);
    int m=a*a;
    for(int i=m-a+1;i<m+a-1;i=i+2){
        printf("%d+",i);
    }
    printf("%d",m+a-1);
    return 0;
}

编辑于 2024-02-08 01:42:37 回复(0)
#include <stdio.h>
#define d 2//等差数列的公差为2
int main() 
{
    int n = 0;
    scanf("%d",&n);
    int a[n];//用来存储每一项
   
    for(int i = 1;i<=n;i++)//计算除第一项外的其它项数的值
    {
        a[0]=n*(n-1)+1;//计算等差数列的首项
        a[i]=a[0]+(i-1)*d;//等差数列的公式
    }
    printf("%d",a[1]);//先打印第一项,后面的加号才好处理
    for(int j = 2;j<=n;j++)
    {
        printf("+%d",a[j]);//打印后面几项
    }
    return 0;
}

发表于 2024-01-14 14:20:24 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int n = 0;
    int a = 0;
    int b = 0;
    int arr[100] = { 0 };
    scanf("%d", &n);
    a = n * n * n;
    for (int i = 1; i<1000000;i+=2)
    {
        int j = n;
        int o = i;
        b = 0;
        while(j)
        {
            b += o;
            o+=2;
            j--;
        }
        if (b == a)
        {
            int u = n - 1;
            printf("%d", i);
            while (u)
            {
                printf("+%d", i+2);
                i+=2;
                u--;
            }
            break;
        }
    }
    return 0;
}
编辑于 2024-01-07 15:16:56 回复(1)
#include <stdio.h>
int main() {
    int n,i;
    scanf("%d",&n);
    int x = n*n-n+1;
    for (i = 0; i<n-1; i++) printf("%d+", x+i*2);
    printf("%d", x+i*2);
    return 0;
}

编辑于 2023-12-03 20:32:53 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int num = n*n*n;
        if(n==1)
        {
            printf("1");
        }
        char str[10] = {'\0'};
        char ret[10000] = {'\0'};
        for(int i = 1;i<num;i++)
        {
            if(i%2!=0 &&(n*i+n*(n-1)) == num)
            {
                for(int j = 0;j<n;j++)
                {
                   /* //方式一:直接打印出来
                    printf("%d",i + 2*j);
                    if(j<n-1)
                    {
                        printf("+");
                    } */
                    //方式2:变成字符串打印出来
                    sprintf(str,"%d+",i+2*j);
                    strcat(ret,str);
                }
                int len = strlen(ret);
                ret[len - 1] = '\0';
                printf("%s",ret);

            }
        }
    }
    return 0;
}
发表于 2023-10-13 20:50:08 回复(0)
#include <math.h>
#include <stdio.h>
//中位数=m^2即首尾和的一半
int main() {
    int m,result;
    scanf("%d",&m);
    result= (int)pow(m, 3);
    if(m==1)
        printf("1");
    else
    {
        int mid=(int)pow(m, 2),first=0,count=1;
        if(m%2!=0)//奇数
        {
            first=mid-(m-1);
            while (count<m)
            {
                printf("%d+",first);
                first+=2;
                count++;
            }
            printf("%d",first);//最后一个数
        }
        else//偶数
        {
            first=mid-1-(m/2-1)*2;
            while (count<m)
            {
                printf("%d+",first);
                first+=2;
                count++;
            }
            printf("%d",first);//最后一个数
        }
    }
    return 0;
}
发表于 2023-09-04 22:28:18 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int num=0;
   scanf("%d",&num);
   if (num==0) {
   printf("%d",0);
   }
   int count=num*(num-1)+1;
   printf("%d",count);
    for (int i=1; i<num; i++) {
    count+=2;
   printf("+%d",count);
   }
    return 0;
}
发表于 2023-08-28 11:10:25 回复(0)
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
int main()
{
	//输入数字m
	int m;
	scanf("%d", &m);
	//根据观察得出每个数字m的立方拆开的首项是有规律的: 1 3 7 13 21 31 42  。。。。。。。他们之间的差值是正偶数2 4 6 7 810.。。
	//由此便可以创建出一个数组存放首项,之后的每一项都是+2得到的连续的奇数,由此全部相加m个连续奇数即可验证定理
	
	//得到每一个首项
	int arr[100]; 
	int i = 1;
	int n = 0;
	for (int j = 0; j < 100; j++)
	{
		i = i + n;
		arr[j] = i;
		n = n + 2;
	}

	//定理得出:
	if (m >= 1 && m <= 100)
	{
		int k = 0;
		int i = 0;
		if (i < m - 1)
		{
			for (k = arr[m - 1]; i < m - 1; i++)
			{
				printf("%d+", k);
				k = k + 2;
			}
		}
		if (i == m - 1)
		{
			printf("%d", k);
		}

	}
	return 0;
}


发表于 2023-08-17 13:13:33 回复(0)
其实这个很简单,我找到一个规律,假如n=6,那么第一个数字就是n*n -n +1=31,然后依次往后加2,总共加n-1次,假如n = 5,那么第一个数字n*n -n +1=21,然后依次往后加2,总共加n-1次,就是这个规律不管n是偶数还是奇数算出来都是一样的,只要在把0的情况搞出来就ok了
#include <stdio.h>

int main()
{
    int a;
    scanf("%d",&a);
    if(a == 0)
    {
        printf("%d",a);
        return 0;
    }
    int math = a*a-a+1;
    for(int i = 0;i<a;i++)
    {
        if(i == 0)
        {
            printf("%d",math);
        }
        else 
        {
            printf("+%d",math);
        }
        math += 2;
    }
    return 0;
}


发表于 2023-08-10 03:36:19 回复(0)
#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);

    int k = 1;
    for(int i = 0; i < n; i++, k += 2)
    {
        if(i == n - 1)
        {
            printf("%d", (n + 1) * n - 1);
        }
        else
        {
            printf("%d+", (n - 1) * n + k);
        }
    }
    return 0;
}
发表于 2023-07-23 09:23:30 回复(0)
#include <stdio.h>

int main() {
    int a, i;
    scanf("%d", &a);
    for (i = 0; i < a; i++)
        if (i < a - 1)
            printf("%d+", a * a - a + 1 + 2 * i);
        else
            printf("%d", a * a - a + 1 + 2 * i);
    return 0;
}
发表于 2023-04-02 21:54:14 回复(0)
#include<stdio.h>
int main() {
    int arr[5051] = {0};
    int i = 0;
    int m = 0;
    scanf("%d", &m);
    for (i = 0; i < 5051; i++) {
        arr[i] = 2 * (i + 1) - 1;//把5050个奇数存到该数组中
    }
    int sum = 0;
    int j = 0;
    for (j = 1; j <= m; j++) {
        sum += j;//算出从1开始到m个数的奇数总和
    }
    for (i = sum - m; i < sum - 1; i++) {
        printf("%d+", arr[i]);//输出m-1到m的元素和的差值
    }
    printf("%d", arr[sum - 1]);
    return 0;
}
发表于 2023-02-18 13:50:38 回复(0)
简单版。可以先找出规律,第一个开始打印的数是 n*(n-1)+1,打印 n 个数,最后一个打印的数是 n*(n+1)-1 。
int main() 
{
    int n = 0;
    while(~scanf("%d", &n))
    {
        int i = 0;
        int count = 0;
        for(i=1; count<n-1; i+=2)
        {
            printf("%d+",n*(n-1)+i);
            count++;
        }
        printf("%d",n*(n-1)+i);
    }
    return 0;
}
希望能有更好的做法

发表于 2023-01-20 20:26:45 回复(0)
#include <stdio.h>
#include <math.h>


int main()
{
    int m = 0;
    scanf("%d", &m);
    int a = pow(m, 3);
    int sum = 0;
    sum = m * (m - 1) + 1;
    int i = 0;
    int sum3 = sum;
    for (i = 0; i < m-1; i++)
    {
        int sum2 = sum3 + 2;
        int tmp = sum2;
        sum = sum + sum2;
        sum3=tmp;
        
    }
    int ret = m * (m - 1) + 1;
    if (sum == a)
    {
        for (i = 0; i < m; i++)
        {
            if (i < m - 1)
                printf("%d+", ret);
            else
                printf("%d", ret);
            ret += 2;
        }
    }
    return 0;
}

发表于 2023-01-08 11:34:09 回复(0)
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d", &a);
    b=a*a*a/a-(a/2)*2+(a%2==0);//算出第一位奇数
    while(a--)
    {
        printf("%d",b);
        b+=2;
        if(a>0) printf("+");
    }
    return 0;
}

发表于 2023-01-03 18:06:43 回复(0)
int main()
{
    int m=0;
    scanf("%d",&m);
    if(m % 2 == 1)
    {
        int arr[100]={0};
        int a= m*m-2*(m/2);
        int b= m*m+2*(m/2);
         int j = 0,count = 0;
        for(int i= a;i<=b;i+=2)
        {
            arr[j++] = i;
            count++;
        }
        for(j = 0;j<count;++j)
        {
            printf("%d",arr[j]);
            if(j < count -1)
                printf("+");
        }
    }
    else
    {
             int arr[100]={0};
        int a= m*m-m+1;
        int b= m*m+m-1;
         int j = 0,count = 0;
        for(int i= a;i<=b;i+=2)
        {
            arr[j++] = i;
            count++;
        }
        for(j = 0;j<count;++j)
        {
            printf("%d",arr[j]);
            if(j < count -1)
                printf("+");
        }
    }
}
发表于 2022-07-22 13:49:36 回复(0)

问题信息

难度:
36条回答 27580浏览

热门推荐

通过挑战的用户

查看代码
尼科彻斯定理