2013年第四届蓝桥杯【C++决赛赛B组】【第二题:连续奇数和】

标题:连续奇数和

小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。
比如:
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

猜你喜欢

转载自blog.csdn.net/daixinliangwyx/article/details/80244928