首页 > 试题广场 >

尼科彻斯定理

[编程题]尼科彻斯定理
  • 热度指数:124827 时间限制: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
def sloution(n):
    if n==1:
        return 1
    l=[]
    # 首元素为n*(n-1)+1,取奇数为+2,
    for i in range(n*(n-1)+1,n**3,2):
            l.append(i)
            if sum(l[-n:])==n**3:
                break
    return '+'.join(map(str,l[-n:]))
 
while 1:
    try:
        n=int(input())
        print(sloution(n))
    except:
        break

发表于 2021-04-03 22:29:38 回复(0)
python不是几行就写完了吗
发表于 2021-03-19 01:22:34 回复(0)
while True:
    try:
        num = int(input())
        list1=[]
        num1=num**2-num+1
        for i in range(num):
            list1.append(str(num1+2*i))
        print('+'.join(list1))
    except:
        break
发表于 2021-03-17 10:42:28 回复(0)
list1=[]
while True:
    try:
        num=list1.append(int(input()))
    except:
        break
for each in list1:
    list2=[]
    m=each*each
    if each%2==0:
        i=0;k=int(each/2)
        while i<each:
            list2.append(str(m-1-2*(k-1)+2*i))
            i=i+1
    else:
        i=0;k=int((each-1)/2)
        while i<each:
            list2.append(str(m-2*k+2*i))
            i=i+1
    print('+'.join(list2))

发表于 2021-03-11 17:05:12 回复(0)
python小白的思路,一步接一步,比起大神的思路,代码还是太复杂了

def getresult(n):
    if n <= 100:
        midNumber = 0
        n_square = n**2
        n_half = int(n/2)
        n_half_odd = int((n-1)/2)
        list_front = []
        list_last = []
        #当输入n为偶数的时候
        if n % 2 == 0:
            for i in range(n_half):
                list_front.append(n_square-1)
                n_square = n_square - 2
            list_front = list_front[::-1]
            n_square = n**2
            for j in range(n_half):
                list_last.append(n_square+1)
                n_square = n_square + 2
            list = list_front + list_last
        else:
            for i in range(n_half_odd):
                list_front.append(n_square-2)
                n_square = n_square -2 
            list_front = list_front[::-1]
            n_square = n**2
            list_front.append(n_square)
            for j in range(n_half_odd):
                list_last.append(n_square+2)
                n_square += 2
        list = list_front + list_last
        result = str(list[0])
        for i in range(1,len(list)):
            result += "+" + str(list[i])
    return result

try:
    while True:
        a = int(input())
        print(getresult(a))
except:
    pass

发表于 2021-03-03 19:44:30 回复(0)
import sys
 
for line in sys.stdin:
    m = int(line.strip())
#     n = 0.5 * m * m - 0.5 * m + 1
    # sequence: 2n-1, 2n+1, 2n+3, ..., 2n + (2m-3)
    # so: m^2 - m + 1, m^2 -m + 3, ... m^2 +m -1
    sequence = [ str(m * m -m + 1 + 2 * i) for i in range(m)  ]
    print("+".join(sequence))
直接手算这个连续m个奇数通项公式: m^2 -m + 1, ..., m*2 + m -1.
发表于 2021-01-24 03:37:32 回复(0)
while True:
    try:
        n=int(input())
        lst=[]
        mid=n ** 2 - n + 1
        for j in range(0,n):
            lst.append(mid)
            mid =mid+2
        str1=''
        for i in lst:
            str1=str1+str(i)+'+'
        print(str1[0:-1])
    except:
        break

发表于 2020-12-27 15:43:56 回复(0)
方法一:利用等差数列求和公式可以直接得出首项,列m项
while True:
    try:
        m = int(input().strip())
        first_odd = m * m - m + 1
        res = [first_odd + 2 * i for i in range(m)]
        print('+'.join(map(str, res)))
    except:
        break
方法二:求出m个连续奇数的中间值,从中间值开始,向两边同时加减
while True:
    try:
        res = []
        m = int(input().strip())
        mid = int(m ** 3 / m)
        if mid % 2 == 1:
            res.append(mid)
            for i in range(1, int(m/2)+1):
                a, b = mid - 2 * i, mid + 2 * i
                res.extend([a, b])
        else:
            for j in range(int(m/2)):
                a, b = mid - (1+2*j), mid + (1+2*j)
                res.extend([a, b])
            # a, b = mid - 1, mid + 1
            # res.extend([a, b])
            # for j in range(1, int(m//2)):
            #     c, d = a - 2 * j, b + 2 * j
            #     res.extend([c, d])
        res.sort()
        print('+'.join(map(str, res)))
    except:
        break



发表于 2020-12-23 20:51:26 回复(0)
分享一个按照原始思路做的算法

#把奇数保存在list里,用"+".join(map(str, res))输出
#枚举,从1开始加m次,不行从3开始,从5开始...如果没超过3次方就继续加,一直加到超过/等于为止。等于就记录结果,超过就break
odd = range(1,1000000,2)
while True:
    try:
        m = int(input())
        for i in range(len(odd)):
            if sum(odd[i:m+i]) == m**3:
                res = odd[i:m+i]
            elif sum(odd[i:m+i]) > m**3:
                break
        print("+".join(map(str, res)))
    except:
        break
发表于 2020-12-23 04:19:56 回复(0)
import sys


for m in sys.stdin:
    m = int(m)
    nums = [str(i) for i in range(m*m-m+1, m*m+m, 2)]
    print("+".join(nums))

发表于 2020-12-13 00:06:30 回复(0)
while True:
    try:
        a = int(input())
        b = []
# 等差数列求首项 S = n*(a1+an)/2  -->  S = n*(a1+a1+(n-1)*d)/2-->a1 = (S-(n-1)*d)/(2*n)
# 其中n为数列长度,a1为首项,an为第n项,S为前n项和,d为等差数列公差
        c = a**2-a+1 
        for i in range(a):
            b.append(str(c))
            c +=2
        print('+'.join(b))
    except:
        break
发表于 2020-11-29 21:28:18 回复(0)
# 2020年11月14日17:49:25
'''
m^3 = x1 + x2 + x3 + ... + xm
x1、x2、x3、...、xm为m个连续的奇数,设这m个数的均值为average
x1 + x2 + x3 + ... + xm = m * average
average = m^3 / m = m^2
当m为奇数时:x1 = average - (m-1)/2 * 2
当m为偶数时:x1 = average - m/2 * 2 + 1
x1 = average - m + 1
'''
 
while True:
    try:
        m = int(input())
        express = ""
#       求这几个和数的均值
        average_value = int(m**3/m)
#       求起始值
        start_value =  average_value - m + 1
        for i in range(m):
            express += str(start_value+i*2)
            if i != m-1:
                express += "+"
        print(express)
    except:
        break
        

发表于 2020-11-14 18:41:40 回复(1)
n = int(input())
start = n*(n-1)+1
result = '+'.join([str(start+x*2) for x in range(n)])
print(result)


发表于 2020-10-27 16:44:57 回复(0)
while True:
    try:
        n = int(input().strip())
        a = n ** 2 - n + 1
        res = str(a)
        for i in range(n - 1):
            a += 2
            res = res + '+' + str(a)
        print(res)
    except:
        break
        

发表于 2020-10-03 23:00:55 回复(0)
def NKCS(m):
    list1 = []
    if m % 2==0:
        middle = m**2-1
        list1.append(middle)
        for i in range(int(m/2)-1,0,-1):
            list1.append(middle-(2*i))
        for i in range(1,int(m/2)+1):
            list1.append(middle+(2*i))
    else:
        middle = m**2
        list1.append(middle)
        for i in range(int(m/2),0,-1):
            list1.append(middle+(2*i))
            list1.append(middle-(2*i))

    return ('+'.join(map(str,sorted(list1))))

while True:
    try:
        N = int(input())
        print(NKCS(N))
    except:
        break

发表于 2020-09-24 10:12:19 回复(0)
# 目标:输出m个连续奇数:任何一个整数m的立方都可以写成m个连续奇数之和。
'''
1   1 
2   3  5 
3   7  9  11 
4   13 15 17 19 
5   21 23 25 27 29 
'''
# 不用计算,可以通过找规律做出来
# 首项是 m*(m-1)+1
import sys
for line in sys.stdin:
    n = int(line)
    res = []
    k = n*(n-1)+1  # 初始值
    res.append(str(k))
    for i in range(1,n):
        k = k + 2
        res.append(str(k))
    print('+'.join(res))


发表于 2020-09-23 14:48:01 回复(0)

问题信息

难度:
39条回答 26590浏览

热门推荐

通过挑战的用户

查看代码