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 }
  • 相关阅读:
    Objective-C 关于锁的种类
    iOS多线程编程Part 1/3
    isa基础知识
    block学习笔记
    关于GCD使用
    iOS开发多线程篇—NSOperation基本操作
    iOS开发多线程篇—基础知识 NSOperation
    iOS开发多线程篇—单例模式(ARC)
    iOS开发多线程篇—GCD的常见用法
    OS开发多线程篇—线程间的通信
  • 原文地址:https://www.cnblogs.com/qqky/p/6796036.html
Copyright © 2011-2022 走看看