剑指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的值。

样例输入:
3
5
样例输出:
6
15
题意分析:
  给定正整数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,如果a和b都是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吧。
 // 653472    zhuli19901106    1506    Accepted    点击此处查看所有case的执行结果    1020KB    1606B    50MS
//
#include <cstdio>
using namespace std; void add2(long long int &x, long long int &y, int i, int j, long long int &res)
{
res += (((!!(x & ( << i))) & (!!(y & ( << j)))) << (i + j));
} void add1(long long int &x, long long int &y, int i, long long int &res)
{
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
add2(x, y, i, , res);
} int main()
{
long long int n;
long long int res;
long long int x, y; while(scanf("%lld", &n) == ){
res = ;
x = n;
y = n + ;
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
add1(x, y, , res);
res >>= ;
printf("%lld\n", res);
} return ;
}

剑指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. Mercurial (hg)

    附上两个站点: http://z42.readthedocs.org/zh/latest/devtools/hg.html http://bucunzai.net/hginit/ Mercurial( ...

  2. SAP成都C4C小李探花:浅谈Fiori Design Guidelines

    Jerry: 我和周帅认识不久,自去年7月SAP成都研究院Cloud for Customer(以下简称为C4C)开发团队组建至今,根据这段时间和周帅愉快的合作经历,我觉得如果把周帅比作我读过的小说里 ...

  3. 在vue中同时使用过渡和动画

    在上次的动画中,在显示和隐藏有动画效果,但是,刷新页面的时候,第一次的显示没有动画效果 需求:刷新页面的时候也有动画效果 <transition name='fade' appear enter ...

  4. css术语和概念

      .vocabulary{ height:99px; color:transparent; } 属性 上面示意css代码中的height和color就是属性.   值 上面的99px就是值 整数值: ...

  5. 2017.11.4 JavaWeb-----基于JavaBean+JSP求任意两数代数和(改进的在JSP页面中无JSP脚本代码的)+网页计数器JavaBean的设计与使用

    修改后的JSP中不含有JSP脚本代码这使得JSP程序的清晰性.简单 1.设计JavaBean 的Add.java 类 package beans; public class Add { private ...

  6. c#中的 MessageBox 弹出提示框的用法

    MessageBox.Show(<字符串str> Text, <字符串str> Title, <整型int> nType,MessageBoxIcon); 例:Me ...

  7. 编写第一个OpenACC程序

    原文链接 在PGI的官方网站上获得示例代码: http://www.pgroup.com/lit/samples/pgi_accelerator_examples.tar 我们的第一个例子从一个简单的 ...

  8. barnes-hut算法 && Fast Multipole Methods算法

    barnes-hut算法 http://arborjs.org/docs/barnes-hut Fast Multipole Methods算法 http://www.umiacs.umd.edu/~ ...

  9. A Multigrid Tutorial中涉及到的难点词汇

    Multigrid Tutorial中涉及的词汇: Elliptic PDEs 椭圆型偏微分方程 Lawrence Livermore National Laboratory 劳伦斯利福摩尔国家实验室 ...

  10. git提交远程报错[rejected] master -> master (fetch first)

    1 先下载git for windows 然后一直点下一步安装. 2 安装之后,选择git gui.生成ssh 链接 git 公钥. 用命令也可以: $ ssh-keygen -t rsa -C &q ...