• 数据结构上机实验(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("逐个累加法:
    ");
        printf("    结果:1~%d之和:%ld
    ", n, sum);
        printf("    用时:%lf秒
    ",((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("高斯法:
    ");
        printf("    结果:1~%d之和:%ld
    ", n, sum);
        printf("    用时:%lf秒
    ",((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³
        for(i=1;i<=n;i++)    
        {
            t=i*i;
            r=i*i*i;
            printf("%d的平方为:%d
    ",i,t,r);
            printf("%d的三次方为:%d
    ",i,r);
        }
        printf("---------------
    ");
        
        //n
        for(i=1;i<=n;i++)  
        {
            int o;
            o=i;
            printf("n的第%d项为:%d
    ",i,o);
        }
        printf("---------------
    ");
        
        //2的n次方
        for(i=1;i<=n;i++)  
        {
    
            p=p*2;
            printf("2的%d次方为:%d
    ",i,p);
        }
        printf("---------------
    ");
        
        //n!
        for(i=1;i<=n;i++)   
        {
    
            q=q*i;
            printf("%d!=%d
    ",i,q);
        }
        printf("---------------
    ");
        
        //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
    ",i,m);
            printf("%d倍的以2为底的Log%d:%d
    ",i,i,v);
        }
        printf("---------------
    ");
        
        //根号n 
        for(i=1;i<=n;i++)
        {
            int k;
            k=sqrt(i);
            printf("根号%d为:%d
    ",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
    ",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
    
    ",s);
    }
    return 0;
    }
    
  • 相关阅读:
    Raid5 Raid10性能测试
    MetaData_model_package
    UBoot命令说明
    ubuntu 12.10 配置一个Apache+MySQL+phpMyAdmin环境
    SSH服务器
    VC2008使用boost库方式
    嵌入式Web服务器BOA移植
    利用matlab将数据写入指定列的方法
    error LNK2019: 无法解析的外部符号,解决办法
    在CYGWIN下编译和运行软件Bundler ,以及PMVS,CMVS的编译与使用
  • 原文地址:https://www.cnblogs.com/wangzheming35/p/12881492.html
Copyright © 2020-2023  润新知