读书笔记之编程之美 - 2.21 只考加法的面试题

本文探讨了一种整数分解的方法,通过特定规律将任意整数分解为一系列连续整数之和,并给出了一段C++代码实现。文章还讨论了特定数值下分解序列的数量问题。

在纸上多列几个数字就不难发现,所有奇数都能分解成两个这样的数字x/2,x/2+1;如果能被3整除,就能写成x/3-1,x/3,x/3+1这样的;如果除4余2的数字,能写成x/4-1,x/4,x/4+1,x/4+2;等等。

问题1:代码如下

   1: #include 
   2:  
   3: using namespace std;
   4:  
   5: int func(int x)
   6: {
   7:     bool noAnswer = true;
   8:     for (int i = 2; i < x; i++)
   9:     {
  10:         if ((i % 2 == 0 && x % i == i / 2) || (i % 2 == 1 && x % i == 0))
  11:         {
  12:             int num = x / i - i / 2 + 1;
  13:             if (num <= 0)
  14:             {
  15:                 break;
  16:             }
  17:             noAnswer = false;
  18:             cout << x << " = ";
  19:             int j;
  20:             for (j = 1; j < i; j++)
  21:             {
  22:                 cout << x / i - i / 2 + j << " + ";
  23:             }
  24:             cout << x / i - i / 2 + j << endl;
  25:         }
  26:     }
  27:     if (noAnswer)
  28:     {
  29:         cout << x << " no answer!" << endl;
  30:     }
  31:     return 0;
  32: }
  33:  
  34: int main()
  35: {
  36:     for (int i = 1; i < 129; i++)
  37:     {
  38:         func(i);
  39:     }
  40:     system("pause");
  41:     return 0;
  42: }

问题2:

貌似2的多次方都没有答案,证明问题先不看了。

问题3:

对于64位正整数范围,子序列个数为N,有x % N = N / 2的关系,x = 3N/2应该是序列最多的数了。没有严格推导,也先暂时分析到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值