数据结构上机实验(1)
1、求1~n的连续整数和
#include <stdio.h>
#include <time.h>
#include <math.h>
//逐个累加
long add_1(long n) {
long i,sum=0;
for (i = 1; i < n; i++)
{
sum += i;
}
return sum;
}
//高斯法
long add_2(long n) {
return n*(n+1)/2;
}
//测试时间
void add_time1(long n) {
long sum;
clock_t t;
t = clock();
sum = add_1(n);
t = clock() - t;
printf("逐个累加法:\n");
printf(" 结果:1~%d之和:%ld\n", n, sum);
printf(" 用时:%lf秒\n",((float)t)/CLOCKS_PER_SEC);
}
void add_time2(long n) {
long sum;
clock_t t;
t = clock();
sum = add_2(n);
t = clock() - t;
printf("高斯法:\n");
printf(" 结果:1~%d之和:%ld\n", n, sum);
printf(" 用时:%lf秒\n",((float)t)/CLOCKS_PER_SEC);
}
//主方法
int main(void) {
int n;
printf("请输入一个n(要大于1000000奥):");
scanf("%d", &n);
if(n < 1000000)
return 0;
add_time1(n);
add_time2(n);
return 0;
}
2、常见算法时间函数的增长趋势分析
#include <stdio.h>
#include<math.h>
int main()
{
//此处图方便直接全部取整,想观察可以运用double
int i,n,t,r,p=1,q=1,m;
printf("请输入n的值:");
scanf("%d",&n);
printf("\n");
//n²和n³
for(i=1;i<=n;i++)
{
t=i*i;
r=i*i*i;
printf("%d的平方为:%d\n",i,t,r);
printf("%d的三次方为:%d\n",i,r);
}
printf("---------------\n");
//n
for(i=1;i<=n;i++)
{
int o;
o=i;
printf("n的第%d项为:%d\n",i,o);
}
printf("---------------\n");
//2的n次方
for(i=1;i<=n;i++)
{
p=p*2;
printf("2的%d次方为:%d\n",i,p);
}
printf("---------------\n");
//n!
for(i=1;i<=n;i++)
{
q=q*i;
printf("%d!=%d\n",i,q);
}
printf("---------------\n");
//log2n和nlog2n
for(i=1;i<=n;i++)
{
int v;
m=log(i)/log(2);
v=i*(log(i)/log(2));
printf("以2为底的Log%d:%d\n",i,m);
printf("%d倍的以2为底的Log%d:%d\n",i,i,v);
}
printf("---------------\n");
//根号n
for(i=1;i<=n;i++)
{
int k;
k=sqrt(i);
printf("根号%d为:%d\n",i,k);
}
return 0;
}
3、求素数个数
-
什么是素数:素数(又叫质数),与之相反的是合数。如果只考虑非负数范围内,一个大于1的数,它只能被 1 和 他本身整除。这样的数就是素数。
-
0 和 1既不是质数也不是合数。
-
素数定理:如果一个数x是素数,那么在整数范围[2,√x ]之间,找不到任何能整除x 的整数。因此,我们不必对 [2, n) 的所有整数去尝试,而只需要对 [2,√x]之间的数尝试整除就OK了,节约了时间。
#include<iostream>
#include<cassert>
#include<time.h>
#include<cmath>
using namespace std;
/**
作用:判断一个数是否是素数
参数x:待判断的素
返回:是素数返回true,否则返回false
*/
bool isPrime(int x)
{
for(int i=2;i<=int(sqrt(x));++i)
{
if(x%i==0) return false;
}
return true;
}
/**
作用:统计[2,n]之间的素数的个数
参数:n
返回:素数的个数
*/
int countPrimes(int n) {
int count=0;
if(n<2) return 0;
for(int i=2;i<=n;++i)
{
if(isPrime(i)) //如果 i为素数
{
++count;
}
}
printf("素数个数为:%d\n",count);
return count;
}
int main()
{
clock_t start = clock();
int total = countPrimes(200000); //此处修改n
clock_t end = clock();
cout<<"耗时:"<<(double(end-start))/CLOCKS_PER_SEC*1000<<"毫秒"<<endl;
return 0;
}
/**********测试数据**************************
n=200000 70毫秒
n=700000 398毫秒
...
*/
4、求连续整数阶乘的和
#include<stdio.h>
int main() {
int i,t,s,n;
printf("请输入一个整数n:");
while(scanf("%d",&n)!=EOF) {
t=1,s=0;
//O(n)
for(i=1;i<=n;i++) {
t*=i;
s+=t;
}
printf("阶乘和为:%d\n\n",s);
}
return 0;
}