剑指Offer - 九度1506 - 求1+2+3+...+n
剑指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的更多相关文章
- 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
- 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...
- 剑指Offer - 九度1360 - 乐透之猜数游戏
剑指Offer - 九度1360 - 乐透之猜数游戏2014-02-05 19:54 题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备 ...
- 剑指Offer - 九度1352 - 和为S的两个数字
剑指Offer - 九度1352 - 和为S的两个数字2014-02-05 18:15 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于 ...
- 剑指Offer - 九度1348 - 数组中的逆序对
剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...
- 剑指Offer - 九度1514 - 数值的整数次方
剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...
- 剑指Offer - 九度1507 - 不用加减乘除做加法
剑指Offer - 九度1507 - 不用加减乘除做加法2013-11-29 20:00 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包 ...
- 剑指Offer - 九度1389 - 变态跳台阶
剑指Offer - 九度1389 - 变态跳台阶2013-11-24 04:20 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳 ...
- 剑指Offer - 九度1388 - 跳台阶
剑指Offer - 九度1388 - 跳台阶2013-11-24 03:43 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包 ...
随机推荐
- PHP : 数据库中int类型保存时间并通过年月份时分秒进行显示
1.表设计: 2.数据库操作页面:将时间戳插入到数据库中 我们到数据库中可以看到: 3.我们将数据进行显示: 页面结果:(二维数组) 4.以为用mysqli_fetch_all得到的是二维数组,那么我 ...
- java IO流——字符流
一.概述 流的概念: 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行.设备可以是文件,网络,内存等. 流具有方向性,至于是输入流还是输出流则是 ...
- STM32-开发环境搭建-STM32CubeMX-安装及配置
STM32CubeMX系列教程之1.流水灯 刚刚接触到STM32CubeMX软件,感觉挺有意思,动动鼠标使STM32开发变得简单,特写文与大家分享.但具体性能如何还需测试. 硬件开发中的流水灯相当于软 ...
- HTML?这些还不懂咋办?
1.什么是空白折叠现象?为什么要空白折叠呢? 对于我们大多数人的习惯来讲,大都喜欢利用空格或者换行来调整文章的文字结构.这样往往可以使我们可以更轻松的阅读.但是,在HTML中却不允许我们这么做,这是为 ...
- IOS 音频的 使用说明
说明 ● 简单来说,音频可以分为2种 ● 音效 • 又称“短音频”,通常在程序中的播放时长为1~2秒 • 在应用程序中起到点缀效果,提升整体用户体验 ● 音乐 • 比如游戏中的“背景音乐”,一般播放时 ...
- MMU CPU及思想
要素: 1)CPU访问寻址地址空间: 2)内存不足以容纳所有进程数据: 3)MMU将进程数据分割,保留当前使用数据. http://baike.baidu.com/link?url=KHyp37Ysi ...
- Map的嵌套,HDU(1263)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263 新学的map的嵌套 #include <stdio.h> #include < ...
- DP上课覆盖知识点,POJ(1513)
题目链接:http://poj.org/problem?id=1513 解题报告: 思路: 知识点从第二个开始扫,递推表达式是:minlec[i]=min(minlec[k])+1,并且要保证,tim ...
- 简单的Nodejs模块
说千遍,道万遍,不如动手做一遍,我们实现一个node所谓的模块 看下上面的图,了解一下模块自始至终的一个流程,首先是创建模块,也就是一个入口的js文件,里面加了一些特定的功能,然后导出这个模块, ex ...
- web的攻击技术
简单的http协议本身并不存在安全性问题,因此技术本身几乎不会成为攻击的对象,应用http协议的服务器和客户端,以及运行在服务器端web应用等资源才是攻击目标,那么怎么攻击,来源于哪里呢 web应用攻 ...