zoukankan      html  css  js  c++  java
  • 2017网易秋招--6、最大奇约数

    题目描述:

    小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
    现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
    例如: N = 7 
    f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
    小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。 
    输入描述:
    输入一个整数N (1 ≤ N ≤ 1000000000)
     
     
    输出描述:
    输出一个整数,即为f(1) + f(2) + f(3).......f(N)
     
    输入例子:
    7
     
    输出例子:
    21
    思路:f(2k) = f(k)
             i 为偶数时f(2)+f(4)+......+f(i) = f(1)+f(2)+......+f(i/2);
             设sum(i) = f(1) + f(2) + ... + f(i);
            (1)若i为奇数则f(i)= i;所以sum(i) = sum(i-1)+i;
            (2)若i为偶数
             sum(i) = f(1)+f(2)+......+f(i) = [f(1)+f(3)+...+f(i-1)]+[f(2)+f(4)+......+f(i)]
                                                   = [1+2+......+i-1] + [f(1)+f(2)+.....+f(i/2)]
                                                   = [(1+i-1)*i/2]/2 + sum(i/2);
     1 #include <iostream>
     2 using namespace std;
     3 //1 ≤ N ≤ 1000000000
     4 //n定义为long long
     5 int main()
     6 {
     7     long long n;
     8  
     9     while(cin>>n)
    10     {
    11         long long sum = 0;
    12         while(n>0)
    13         {
    14             if(n%2 == 0)//偶数
    15             {
    16                 sum += n*n/4;
    17                 n/=2;
    18             }
    19             else//奇数
    20             {
    21                 sum += n;
    22                 n--;
    23             }
    24         }
    25         cout<<sum<<endl;
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    LintCode: Climbing Stairs
    LintCode: Binary Tree Postorder Traversal
    LintCode: Binary Tree Preorder Traversal
    LintCode: Binary Tree Inorder Traversal
    Lintcode: Add Two Numbers
    Lintcode: Add Binary
    LintCode: A + B Problem
    LintCode: Remove Linked List Elements
    LintCode:Fibonacci
    Lintcode开刷
  • 原文地址:https://www.cnblogs.com/qqky/p/6796036.html
Copyright © 2011-2022 走看看