题目描述
【问题描述】
小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。
比如:
2^3 = 8 = 3 + 5
3^3 = 27 = 7 + 9 + 11
4^3 = 64 = 1 + 3 + ... + 15
虽然他没有想出怎么证明,但他想通过计算机进行验证。
请你帮助小明写出 111111 的立方之连续奇数和表示法的起始数字。如果有多个表示方案,选择起始数字小的方案。
【运行限制】
• 最大运行时间:1s
• 最大运行内存: 128M
答案:371
解题思路
【法一】暴力破解,双层循环,ans = i*(i+2)*…(j-2)*j,当ans=111^3,i为所求。
【法二】“连续奇数的和”实际上是等差数列。若首项为1,则an=2n-1
,an求和为
S
n
=
n
2
S_n=n^2
Sn=n2。
以“3^3 = 27 = 7 + 9 + 11”为例,它相当于一个大的2n-1
,减去一个小的2n-1
。即“1+3+5+7+9+11”减去“1+3+5”,这两个等差数列的和,分别是
6
2
6^2
62与
3
2
3^2
32。
故,找到满足
n
1
2
−
n
2
2
=
11
1
3
n1^2-n2^2=111^3
n12−n22=1113的n1和n2,则有n1+(n1+2)+…+(n2-2)+n2=11^3。n1为所求。
解题代码
C语言
法一
#include <stdio.h>
int main()
{
for(int i=1;i<111*111*111;i+=2)
{
// 重置ans
int ans=0;
for(int j=i;j<111*111*111;j+=2)
{
//ans = i*(i+2)*...(j-2)*j
ans=ans+j;
if(ans==111*111*111)
{
printf("%d",i);
return 0;
}
}
}
return 0;
}
法二
#include <stdio.h>
long long target=111*111*111;
int main()
{
for(int i=1;i<=2000;i++){
for(int j=1;j<i;j++){
if(i*i-j*j==target){
printf("%d",2*(j+1)-1);
break;
}
}
}
return 0;
}