简单问题藏着大陷阱

写一个函数计算当参数为n(n很大)时的值1-2+3-4+5-6+7....+n.

你可能会马上写出如下代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 long fn(long n)
  4 {
  5     long temp=0;
  6     int i,flag=1;
  7     if(n<=0)
  8     {
  9         printf("input error\n");
 10         exit(1);
 11     }
 12     for(i=1;i<=n;++i)
 13     {
 14         temp+=(flag*i);
 15         flag=-1*flag;
 16     }
 17     return temp;
 18 }

但....

执行结果肯定没问题,但是当n很大时这个程序效率很低,尤其在嵌入式系统开发中,程序的运行效率很重要。

然后你可能改进了代码

 19 long fn1(long n)
 20 {
 21     long temp=0;
 22     int i=1,j=1,flag=1;
 23     if(n<=0)
 24     {
 25         printf("input error\n");
 26         exit(1);
 27     }
 28     while(j<=n)
 29     {
 30         tmpe+=i;
 31         i=-i;
 32         i>0?i++:i--;
 33         j++;
 34     }
 35     return temp;
 36 }

比起上一个程序,将所有涉及到乘法指令的语句改为执行加法语句,在运算时间上缩短了很多,而代价只是增加了一个整型变量。

仍然不够优化欧!

37 long fn2(long n)
 38 {
 39     if(n<=0)
 40     {
 41         printf("input error\n");
 42         exit(1);
 43     }
 44     if(0==n%2)
 45         return (n/2)*(-1);
 46     else
 47         return (n/2)*(-1)+n;
 48 
 49 }

有没有很惊讶!!

不要认为CPU运算速度快就把所有问题推给它做,我们应该将代码优化再优化。

不要忘了最后的测试工作!!

 50 int main()
 51 {
 52     printf("ret: %d %d %d\n",fn(100),fn1(100),fn2(100));
 53     return 0;
 54 }
时间: 2024-10-13 01:34:11

简单问题藏着大陷阱的相关文章

java中,一个简单但出错率又大的‘加法’题,1+1+&#39;1&#39;+1+1+1+1+&quot;1&quot;=?

1+1+'1'+1+1+1+1+"1"=? 结果是多少?很多人看了题之后,可能会说结果是71.  当然有的童鞋可能会说很简单,放工具里运行一下就知道结果了,如果不运行代码,你会得出一个什么样的结果呢? 如果告诉你答案是551,会迷惑么?怎么会得出551? 下面我们来看看怎么算的: 1.我们大家都知道1 .'1'."1"的区别,1 表示一个int类型,’1'是表示一个char类型,"1" 表示一个字符串类型. 2.1+1+'1'+1+1+1+1+&

u-boot分析(十一)----MMU简单分析|u-boot分析大结局|学习规划

u-boot分析(十一) 通过前面十篇博文,我们已经完成了对BL1阶段的分析,通过这些分析相信我们对u-boot已经有了一个比较深入的认识,在BL2阶段大部分是对外设的初始化,并且有的我们已经分析过,在这篇博文我打算对BL1阶段没有分析到的重要外设进行简单分析,并结束对u-boot的分析,同时对后面自己的博文进行简单的规划,希望有兴趣的朋友跟我一块学习和研究嵌入式. 今天我们会分析到以下内容: 1.      MMU分析(内容出自我以前的博客) 2.      裸机开发总结 3.      后期

python财经数据接口包Tushare pro的入门及简单使用方式(大数据,股票数据接口)

最近在做一个项目,需要用到股票的数据,我在网上查了很久,最终发现在股票数据上面还是tushare比较专业,而且对于将来做金融行业的大数据这一块的,tushare绝对是你的一个好帮手,所以下面我就简单介绍一下. 一.Tushare Pro简介 Tushare旧的版本运行了三年,在旧的版本运行了三年之后,Tushare Pro被发布,相对于之前的版本,它更加稳定质量更好,而且有了前三年的运行经验,Pro用起来更加流畅,而且将数据扩大到了股票.基金.期货.债券.外汇.行业大数据等区块链的数据,数据量更

简单实现兼容各大浏览器的js复制内容到剪切板

因为网站文章需要提供几个按钮,单击后实现复制文章内容到剪贴板. 在网上搜索了很多内容,发现都比较乱这里自己整理下,分享给大家 效果图如下: 之前使用的是window.clipboardData.setData,只能支持IE和火狐.360浏览器.搜狗等浏览器,都泪崩.所以,研究了ZeroClipboard,尽量使用js代码写. 使用前先引用三个东西(没有提供上传附件,这里就不提供下载地址了,很常见,大家自己找度娘吧): jquery-1.4.1.min.js    ZeroClipboard.js

用Properties类创建对象读取文档*txt格式书写ATM简单版本,看大神们有什么改进的,欢迎交流

先创建了一个ATM.txt格式的的文档,将卡的账号.密码.内存金额放在此文档 password=123money=5000userName=123 然后用类Properties创建一个对象,将银行卡的属性放进对象中,书写一个简单的ATM机实现简单的登录.存款.取款.查看.修改密码.退出程序等功能具体代码示例如下:package unit331; import java.io.FileReader; import java.io.FileWriter; import java.util.Prope

HDFS简单的shell操作--大数据纪录片第二记

一.基本语法: bin/hadoop fs -具体命令 二.部分简单命令操作 1.显示命令的参数: help ls 2.显示该目录下所有文件: ls 目录 3.在hdfs上创建目录: mkdir 目录 4.从本地剪切到hdfs上: moveFromLocal 本地位置 hdfs上位置 5.追加一个文件A到已存在文件B末尾: appendToFile A B 6.显示文件内容: cat 文件 7.显示文件末尾: tail 文件所在位置 其实hdfs上的shell命令和linux下差不多,不继续列举

超多分析结果表 简单字段关联 生成大宽表 的 初步猜想

业务背景: 1. 广告投放涉及到用户的诸多特征 2. 用户特征通常不在同一个表中 3. 通过各种算法逻辑会产生很多的中间表 4. 各中间表的唯一标志基本为单一字段,通常会员标志或设备标志(两者一般取较新的一对组合使用) 5. 进入算法(或机器学习)前,需要一个统一的大宽表作为入参方便取值 业务解析: 1. 若干(通常10+)结果表 2. 每张表的数据量都很大(千万-亿) 3. 每个表都有同样的唯一标志字段(具体内容不同) 结果表产生过程隐藏条件: 1. 存在一张主表,包含有所有可能的唯一标志 处

超多分析结果表 简单字段关联 生成大宽表 的 并发拓展

年前有些放纵了,一直没有完成该篇的节奏感.推延至今 大数据量面前单机显然是不合适的,所以尝试将前述逻辑 并发化 考虑 以适应 分布式处理. 回溯数据清洗流程, 1.流量数据区间圈定, 2.流量数据按要求筛选聚合 3.各汇总表按唯一标志联合 在初步猜想中,需要一张包含所有唯一标志的主表,这也是减少匹配次数的关键. 主表的产生不应该到流程第三步,也完全没有必要. 清洗流程第二步流量数据聚合的同时,完全可以完成 该主表的去重和排序. 接下来按照 记录总数均匀分发主表数据到个 executor,并记录下

java List.subList方法中的超级大陷阱

ArrayList 中 subList 的基本用法: subList(fromIndex:int,toIndex:int):List<E> 返回从fromIndex到toindex-1 的 子列表 在使用集合中,可能常常需要取集合中的某一部分子集来进行一下操作,于是subList这个方法就映入我们的眼帘,毫不犹豫地使用. 例如以下代码: public static void main(final String[] args) { List<Object> lists = new A