1. 剑指Offer - 九度1506 - 1+2+3+...+n
    2013-11-29 19:22
题目描述:

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入为一个整数n(1<= n<=100000)。

输出:

对应每个测试案例,
输出1+2+3+…+n的值。

样例输入:
  1. 3
  2. 5
样例输出:
  1. 6
  2. 15
  1. 题意分析:
      给定正整数n,范围不超过100000,求1 + ... + n的和,那么也就是求n * (n + 1) / 2的值,但是:不准用乘除法和循环之类的写法。注意:可以用加法
      很明显,不准用循环的话,要么重复写N遍,要么递归。不准我用乘除,就用位操作模拟乘除。虽然毕业后就再没接触过Verilog和加法器乘法器,但学到的设计思想决不能忘了,否则学费不白交了吗?
      注意下面俩式子:
        x^a * x^b = x^(a + b)
        (a[n] * x^n + a[n - 1] * x^(n - 1) + ... + a[0]) * (b[m] * x^m + b[m - 1] * x^(m - 1) + ... + b[0]) = 两两相乘一大堆
      既然计算机中二进制操作这么方便,我们可以将一个数按二进制展开:14 = 2^3 + 2^2 + 2^1,于是两个数相称就成了两个x=2的多项式相乘了。
      接下来,2^a * 2^b = 2^(a + b) = 1 << (a + b)
      有了上面的思路,我们考虑整数a * b,如果ab都是32位整数,那么a的所有二进制位和b的所有二进制位乘积的和。接下来就参考Verilog中的常规写法了:
      第一层“循环”,fun1():
        fun1(0);
        fun1(1);
        ...
        fun1(31);
      
      第二层循环,fun1中再调用多个fun2():
        fun2(0);
        fun2(1);
        ...
        fun2(31);
      Verilog里不建议用for循环是有原因的,毕竟电路设计和写软件不一样,具体原因可自行百度“Verilog for”。但这种写法还真可以避免使用循环,满足面试题的要求。
      最后还有两点:
        1. 题目中n的范围不超过十万,因此二进制位数不超过17位,循环写17个其实就够了。
        2. 结果范围明显可以超出int范围,用long long int吧。
  1. // 653472 zhuli19901106 1506 Accepted 点击此处查看所有case的执行结果 1020KB 1606B 50MS
  2. //
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. void add2(long long int &x, long long int &y, int i, int j, long long int &res)
  7. {
  8. res += (((!!(x & ( << i))) & (!!(y & ( << j)))) << (i + j));
  9. }
  10.  
  11. void add1(long long int &x, long long int &y, int i, long long int &res)
  12. {
  13. add2(x, y, i, , res);
  14. add2(x, y, i, , res);
  15. add2(x, y, i, , res);
  16. add2(x, y, i, , res);
  17. add2(x, y, i, , res);
  18. add2(x, y, i, , res);
  19. add2(x, y, i, , res);
  20. add2(x, y, i, , res);
  21. add2(x, y, i, , res);
  22. add2(x, y, i, , res);
  23. add2(x, y, i, , res);
  24. add2(x, y, i, , res);
  25. add2(x, y, i, , res);
  26. add2(x, y, i, , res);
  27. add2(x, y, i, , res);
  28. add2(x, y, i, , res);
  29. add2(x, y, i, , res);
  30. add2(x, y, i, , res);
  31. add2(x, y, i, , res);
  32. add2(x, y, i, , res);
  33. }
  34.  
  35. int main()
  36. {
  37. long long int n;
  38. long long int res;
  39. long long int x, y;
  40.  
  41. while(scanf("%lld", &n) == ){
  42. res = ;
  43. x = n;
  44. y = n + ;
  45. add1(x, y, , res);
  46. add1(x, y, , res);
  47. add1(x, y, , res);
  48. add1(x, y, , res);
  49. add1(x, y, , res);
  50. add1(x, y, , res);
  51. add1(x, y, , res);
  52. add1(x, y, , res);
  53. add1(x, y, , res);
  54. add1(x, y, , res);
  55. add1(x, y, , res);
  56. add1(x, y, , res);
  57. add1(x, y, , res);
  58. add1(x, y, , res);
  59. add1(x, y, , res);
  60. add1(x, y, , res);
  61. add1(x, y, , res);
  62. add1(x, y, , res);
  63. add1(x, y, , res);
  64. add1(x, y, , res);
  65. res >>= ;
  66. printf("%lld\n", res);
  67. }
  68.  
  69. return ;
  70. }

剑指Offer - 九度1506 - 求1+2+3+...+n的更多相关文章

  1. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  2. 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...

  3. 剑指Offer - 九度1360 - 乐透之猜数游戏

    剑指Offer - 九度1360 - 乐透之猜数游戏2014-02-05 19:54 题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备 ...

  4. 剑指Offer - 九度1352 - 和为S的两个数字

    剑指Offer - 九度1352 - 和为S的两个数字2014-02-05 18:15 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于 ...

  5. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  6. 剑指Offer - 九度1514 - 数值的整数次方

    剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...

  7. 剑指Offer - 九度1507 - 不用加减乘除做加法

    剑指Offer - 九度1507 - 不用加减乘除做加法2013-11-29 20:00 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包 ...

  8. 剑指Offer - 九度1389 - 变态跳台阶

    剑指Offer - 九度1389 - 变态跳台阶2013-11-24 04:20 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳 ...

  9. 剑指Offer - 九度1388 - 跳台阶

    剑指Offer - 九度1388 - 跳台阶2013-11-24 03:43 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包 ...

随机推荐

  1. 323. Number of Connected Components in an Undirected Graph (leetcode)

    Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...

  2. 快餐店之间插入仓库,路最短,DP,POJ(1485)

    题目链接:http://poj.org/problem?id=1485 暂时我还没想出思路求路径.哈哈哈,先写一下中间步骤吧. #include <stdio.h> #include &l ...

  3. 【转】批处理命令 For循环命令详解!

    批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文 ...

  4. Mac下安装OpenCV3.0和Anaconda和环境变量设置

    入手Mac几天了,想在Mac OS下玩玩OpenCV和keras,间歇捣鼓了两天,终于搞定zsh.OpenCV3.0以及Anaconda.OpenCV3.0刚发布不久,这方面的资料也不是很多,能够查到 ...

  5. Git基础篇

    对于Git的一些基础了解,安装,里面的一些名词,这里就不做介绍了.主要记录怎么使用GIt. 本篇介绍: 配置个人信息        生成本地仓库并与远程库相连        添加SSH秘钥       ...

  6. Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-9enuqi/MySQL-python/

    hu@hu-VirtualBox:/home/newdisk/telnet-scanner$ sudo pip install MySQL-python[sudo] hu 的密码: The direc ...

  7. MySQL-常用的存储引擎

    MySQL-常用的存储引擎 存储引擎 事务 锁粒度 主要应用 忌用 MyISAM 不支持 支持并发插入的表级锁 select,insert 读写操作频繁 MRG_MYISAM 不支持 支持并发插入的表 ...

  8. java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量

    package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...

  9. DateTools,可能是最好用的iOS日期工具库

    项目简介 DateTools 用于提高Objective-C中日期和时间相关操作的效率.灵感来源于 DateTime和Time Period Library. 项目主页: DateTools 最新示例 ...

  10. JavaScript对象回收机制

    js维护了一张对象引用表: 当一个对象被创建以后,栈内就有一个a,a这个对象就指向了对这个地址,当a=new Person()执行后,引用次数加1.当a=null置空,引用次数减1.由系统来维护对象引 ...