标题:连续奇数和
小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。比如:
2^3 = 8 = 3 + 5
3^3 = 27 = 7 + 9 + 11
4^3 = 64 = 1 + 3 + ... + 15
虽然他没有想出怎么证明,但他想通过计算机进行验证。
请你帮助小明写出 111 的立方之连续奇数和表示法的起始数字。如果有多个表示方案,选择起始数字小的方案。
普通循环:
#include<iostream> using namespace std; int t = 111 * 111 * 111; int main() { int flag = 0; for(int i = 1;i <= t; i+=2) { //起点 int sum = i, p = i;//sum初始化为起点值,以及p记录当前项的值 while(sum < t) { p += 2;//连续奇数,p逐项+2 sum += p; if(sum == t) flag = 1;//加完之后刚好等于t } if(flag) { cout << i << endl; break; } } return 0; }
带返回值的dfs:
#include<iostream> using namespace std; int t = 111 * 111 * 111; int dfs(int k, int sum) { int flag = 0; if(sum > t) return 0; if(sum == t) return 1; flag = dfs(k+2, sum+k+2); if(flag) return 1;//一定要判断每一次dfs的返回值,且这里的dfs是有返回值的,所以必须要访问到返回值不能直接调用 return 0; } int main() { int flag = 0; for(int i = 1;i <= t; i+=2) { //起点 flag = dfs(i, i); if(flag) { cout << i << endl; break; } } return 0; }
答案:371