1.求1+2+...+n 的代码
//文件名:exp1-1.cpp
#include <stdio.h>
#include <time.h> //clock_t, clock, CLOCKS_PER_SEC
#include <math.h>
//------方法1-----------------------------------------------
long add1(long n) //方法1:求1+2+...+n
{
long i,sum=0;
for (i=1;i<=n;i++)
sum+=i;
return sum;
}
void AddTime1(long n) //采用方法1的耗时统计
{
clock_t t;
long sum;
t=clock();
sum=add1(n);
t=clock()-t;
printf("方法1:\n");
printf(" 结果:1~%ld之和:%ld\n",n,sum);
printf(" 用时:%lf秒\n" ,((float)t)/CLOCKS_PER_SEC);
}
//------方法2-----------------------------------------------
long add2(long n) //方法2:求1+2+...+n
{
return (n/2)*(n+1);
}
void AddTime2(long n) //采用方法2的耗时统计
{
clock_t t;
long sum;
t=clock();
sum=add2(n);
t=clock()-t;
printf("方法2:\n");
printf(" 结果:1~%ld之和:%ld\n",n,sum);
printf(" 用时:%lf秒\n" ,((float)t)/CLOCKS_PER_SEC);
}
//------------------------------------------------------------
int main()
{
long n;
printf("n(大于1000000):");
scanf("%ld",&n);
if (n<1000000) return 0;
AddTime1(n);
AddTime2(n);
return 1;
}
2.常见算法时间函数的增长趋势分析
//文件名:exp1-2.cpp
#include <stdio.h>
#include <math.h>
double log2(double x) //求log2(x)
{
return log10(x)/log10(2);
}
long exponent(int n) //求2^n
{
long s=1;
for (int i=1;i<=n;i++)
s*=2;
return s;
}
long factorial(int n) //求n!
{
long s=1;
for (int i=1;i<=n;i++)
s*=i;
return s;
}
void fun(int n)
{
printf("log2(n) sqrt(n) n nlog2(n) n^2 n^3 2^n n!\n");
printf("===========================================================================\n");
for (int i=1;i<=n;i++)
{
printf("%5.2f\t",log2(double(i)));
printf("%5.2f\t",sqrt(i));
printf("%2d\t",i);
printf("%7.2f\t",i*log2(double(i)));
printf("%5d\t",i*i);
printf("%7d\t",i*i*i);
printf("%8d\t",exponent(i));
printf("%10d\n",factorial(i));
}
}
int main()
{
int n=10;
fun(n);
return 1;
}
3.求素数的个数
方法2比方法1 快很多
#include <stdio.h>
#include <math.h>
#include<time.h>
//求1--n之间 素数的个数
int f1(int n)
{
int i,j;
int count=1;//记录素数个数,2为素数,记为1
for(i=3;i<=n;i+=2)//提供数,从3处理方便
{
for(j=2;j<i;j++)
{
if(i%j==0)break;//判断2到i-1,i是否能整除,整除则跳出
if(i==j+1)count++;//执行到最后一步,未跳出,表明为素数
}
}
return count;
}
void time1(int n)
{
clock_t t;
t=clock();
f1(n);//函数调用
t=clock()-t;
printf("方法1:\n");
printf("1--%d之间有%d个素数\n",n,f1(n));
printf("所用时间为:%lf\n",(double)t/CLOCKS_PER_SEC);
return ;
}
int f2(int n)
{
int i,j,flag;
int count=2;//记录素数个数,2和3为素数,记为2
for(i=5;i<=n;i+=2)//提供数,从5处理方便
{
for(j=2;j<=sqrt(i)+0.01;j++)//判断2到sqrt(i) i是否能整除
{
if(i%j==0)
{
flag=0;//不是素数
break;
}
else
flag=1;//是素数
}
if(flag==1)count++;//记录素数个数
}
return count;
}
void time2(int n)
{
clock_t t;
t=clock();
f2(n);
t=clock()-t;
printf("方法2:\n");
printf("1--%d之间有%d个素数\n",n,f2(n));
printf("所用时间为:%lf\n",(double)t/CLOCKS_PER_SEC);
return ;
}
int main()
{
printf("请输入一个整数(>=100000):");
int n;
scanf("%d",&n);
time1(n);
time2(n);
return 0;
}