数据结构上机实验(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;
}
posted @ 2020-05-13 11:49  我在吃大西瓜呢  阅读(311)  评论(0编辑  收藏  举报