1-2+3-4+5-6+7......+n的几种算法及其他

本文探讨了编写高效程序所需的知识,包括理解硬件特性、掌握数据类型和运算符、熟悉编译环境,以及CPU执行原理。同时,文章深入讨论了数据结构、算法在提升程序效率中的作用,并介绍了利用High-Resolution Timer进行程序效率测定的方法。

 

"写高效率程序需要的知识"

对使用硬件设备特性的知识

对数据类型、运算符和混合运算的了解

对编译环境的使用

CPU执行程序原理

编译原理的相关知识

编译环境反汇编

对所求问题的具体分析

数据结构

算法

程序效率测定的方法(High-Resolution Timer

编程风格

/*

 

"不要认为 CPU 运算速度快就把所有的问题都推给它去做,程序

设计师应该将代码优化再优化,我们自己能做的决不要让CPU

,因为 CPU 是为用户服务的,不是为我们程序设计师服务的!"

 

"空间换时间的算法"

 

*/

 

/*

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

*/

#include<windows.h>

#include<conio.h>

#include<stdio.h>

//

int fun1(int); //大量使用了乘法,效率低

int fun2(int); //减少了乘法的使用,效率稍高

int fun3(int); //效率最高

int fun4(int); //我的算法1,也使用了乘法

int fun5(int); //我的算法2

//

//

void main()

{

     float f = 5.1f;

     double d = 5.1;

     int ii = 5555;

     int n=100000;

    

     LARGE_INTEGER li1,li2;

     LARGE_INTEGER liF;

     QueryPerformanceFrequency(&liF);

     printf("本机Frequency %I64d/n",(&liF)->QuadPart);

    

     QueryPerformanceCounter(&li1);

     f+=4.2;

     QueryPerformanceCounter(&li2);

     printf("f+=4.2: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     d+=4.2;

     QueryPerformanceCounter(&li2);

     printf("d+=4.2: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     ii/=22;

     QueryPerformanceCounter(&li2);

     printf("ii/=22: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     ii%=23;

     QueryPerformanceCounter(&li2);

     printf("iimod=33: %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     fun1(n);

     QueryPerformanceCounter(&li2);

     printf("fun1(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     fun2(n);

     QueryPerformanceCounter(&li2);

     printf("fun2(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     fun3(n);

     QueryPerformanceCounter(&li2);

     printf("fun3(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     fun4(n);

     QueryPerformanceCounter(&li2);

     printf("fun4(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     QueryPerformanceCounter(&li1);

     fun5(n);

     QueryPerformanceCounter(&li2);

     printf("fun5(n): %I64d/n",(&li2)->QuadPart-(&li1)->QuadPart);

 

     getch();

}

 

int fun1(int n)

{

     long temp=0;

    int i,flag=1;

     if(n<=0)

     {

         printf("error: n must > 0");//常数中不能有换行符

         exit(1);

     }

     for(i=1;i<=n;i++)

     {

         temp=temp+flag*i;

         flag=(-1)*flag;

     }

     return temp;

}

int fun2(int n)

{

     long temp=0;

     int j=1,i=1,flag=1;

     if(n<=0)

     {

         printf("error: n must > 0");

         exit(1);

     }

     while(j<=n)

     {

         temp=temp+i;

         i=-i;

         i>0?i++:i--;

         j++;

     }

     return temp;

}

/*

 1-2+3-4+5-6+7......+n

 ---------------------

 --首先看清楚序列规律,看结果和n有什么直接关系

 if n是偶数 结果为(-1)*n/2

 if n是奇数 结果为(-1)*n/2

*/

int fun3(int n)

{

     if(n<=0)

     {

         printf("error: n must > 0");

         exit(1);

     }

     if(0==n%2)

         return (n/2)*(-1);

     else

         return (n/2)*(-1)+n;

}

int fun4(int n)

{

     if(n<=0)

     {

         printf("error: n must > 0");

         exit(1);

     }

     int sum=0;

     int flag=1;

     for(int i=1;i<n;i++)

     {

         flag = (i%2)?1:-1;

         sum+=flag*i;

     }

     return sum;

}

int fun5(int n)

{

     if(n<=0)

     {

         printf("error: n must > 0");

         exit(1);

     }

     int sum=0;

     int t;

     for(int i=1;i<n;i++)

     {

         (i%2)?(t=i):(t=-i);

         sum+=t;

     }

     return sum;

}

/*

结论:

尽量使用加减代替乘除

尽量寻找问题规律,减少程序运算

使用实数的地方尽量使用double

*/

 结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值