《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论

文章目录

  • 验证性实验
    • 求1~n的连续整数和
      • 说明
      • 放码
      • 结果
    • 常见算法时间函数的增长趋势分析
      • 说明
      • 放码
      • 结果
  • 设计性实验
    • 求素数个数
      • 说明
      • 放码
      • 结果
    • 求连续整数阶乘的和
      • 说明
      • 放码
      • 结果

验证性实验

求1~n的连续整数和

说明

对于给定的正整数n,求1+2+…+n1+2+…+n1+2++n,采用逐个累加和n(n+1)2\frac {n(n+1)} 22n(n1)(高斯法)两种解法。

对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。

  • clock_t类型、clock()函数和CLOCKS_PER_SEC常量均在time.h头文件中声明。
  • clock_t是时钟数据类型(长整型数)
  • clock()函数返回CPU时钟计时单元数(以毫秒为单位)
  • CLOCKSPER_SEC是一个常量,表示1秒包含的毫秒数。
  • 表达式((float) t)/CLOCKS_PER_SEC返回t转换成的秒数;

放码

//文件名:exp1-1.cpp//求1+2+...+n
#include <stdio.h>
#include <time.h>       // clock_t, clock, CLOCKS_PER_SEC
#include <math.h>//方法1:老实累加
long add1(long n)     
{long i, sum = 0;for (i = 1; i <= n; i++)sum += i;return(sum);
}void AddTime1(long n)  /* 采用方法1的耗时统计 */
{clock_t t = clock();long sum = add1(n);t = clock() - t;printf("方法1:\n");printf("  结果:1~%d之和:%ld\n", n, sum);printf("  用时:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//方法2:用公式
long add2(long n)     /* 方法2:求1+2+...+n */
{return(n * (n + 1) / 2);
}void AddTime2(long n) /* 采用方法2的耗时统计 */
{clock_t t = clock();long sum = add2(n);t = clock() - t;printf("方法2:\n");printf("  结果:1~%d之和:%ld\n", n, sum);printf("  用时:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}int main()
{int n;printf("n(大于1000000):");scanf("%d", &n);if (n < 1000000)return(0);AddTime1(n);AddTime2(n);return(1);
}

结果

n(大于1000000):99999999
方法1:结果:1~99999999之和:887459712用时:0.222000秒
方法2:结果:1~99999999之和:887459712用时:0.000000秒
请按任意键继续. . .

常见算法时间函数的增长趋势分析

说明

理解常见算法时间函数的增长情况。

对于1~n的每个整数n,输log⁡2n\log_2nlog2nn\sqrt nnnnnnlog⁡2nn \log_2nnlog2nn2n^2n2n3n^3n32n2^n2nn!n!n!

放码

//文件名:exp1-2.cpp
#include <stdio.h>
#include <math.h>double log2(double x)	//求log2(x)
{return log10(x)/log10((double)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((double)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;
}

结果

log2(n) sqrt(n)  n       nlog2(n)   n^2     n^3      2^n                n!
===========================================================================0.00    1.00    1         0.00     1         1        2                 11.00    1.41    2         2.00     4         8        4                 21.58    1.73    3         4.75     9        27        8                 62.00    2.00    4         8.00    16        64       16                242.32    2.24    5        11.61    25       125       32               1202.58    2.45    6        15.51    36       216       64               7202.81    2.65    7        19.65    49       343      128              50403.00    2.83    8        24.00    64       512      256             403203.17    3.00    9        28.53    81       729      512            3628803.32    3.16   10        33.22   100      1000     1024           3628800
请按任意键继续. . .

设计性实验

求素数个数

说明

通过对比同一问题不同解法的绝对执行时间 ,体会如何设计“好”的算法。

求1~n的素数个数。对于相同的n,给出这两种解法的结果和求解时间,并用相关数据进行测试。

放码

//文件名:exp1-3.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>		 	//clock_t, clock, CLOCKS_PER_SEC
#include <math.h>//------方法1-----------------------------------------------
bool prime1(long n) //方法1:判断正整数n是否为素数
{long i;for (i = 2; i < n; i++)if (n % i == 0)return false; //若n不是素数,则退出并返回falsereturn true;
}void PrimeTime1(long n) //采用方法1的耗时统计
{long sum = 0, i;clock_t t = clock();for (i = 2; i <= n; i++)if (prime1(i))sum++;t = clock() - t;printf("方法1:\n");printf("  结果:2~%d的素数个数:%d\n", n, sum);printf("  用时:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//------方法2-----------------------------------------------
bool prime2(long n) //方法2:判断正整数n是否为素数
{long i;for (i = 2; i <= (int)sqrt((double)n); i++)//对n开方进行优化if (n % i == 0)return false; //若n不是素数,则退出并返回falsereturn true;
}
void PrimeTime2(long n) //采用方法2的耗时统计
{long sum = 0, i;clock_t t = clock();for (i = 2; i <= n; i++)if (prime2(i))sum++;t = clock() - t;printf("方法2:\n");printf("  结果:2~%d的素数个数:%d\n", n, sum);printf("  用时:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//------方法3-----------------------------------------------
int countPrimes(long n) //方法3:埃拉托色尼筛选法,空间换时间,n不能过大,否则程序报错
{bool *flag = (bool *)malloc(n * sizeof(bool));for (long i = 0; i < n; i++)//这步不能省略,否则得不到正确值flag[i] = 0;int count = 0;for (long i = 2; i < n; i++){if (flag[i] == 0){count++;for (long j = i; i * j < n; j++) {flag[i * j] = 1;}}}free(flag);return count;
}
void PrimeTime3(long n) //采用方法3的耗时统计
{long sum = 0;clock_t t = clock();sum = countPrimes(n);t = clock() - t;printf("方法3:\n");printf("  结果:2~%d的素数个数:%d\n", n, sum);printf("  用时:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//------------------------------------------------------------
int main() {long n;printf("n(取值范围[10000, 40000]):");scanf("%d", &n);if (!(10000 <= n && n <= 40000)) return 0;PrimeTime1(n);PrimeTime2(n);PrimeTime3(n);return 1;
}

结果

n(取值范围[10000, 40000]):40000
方法1:结果:2~40000的素数个数:4203用时:0.236000秒
方法2:结果:2~40000的素数个数:4203用时:0.009000秒
方法3:结果:2~40000的素数个数:4203用时:0.001000秒
请按任意键继续. . .

求连续整数阶乘的和

说明

对于给定的正整数n,求1!+2!+3!+…+n !。给出一种时间复杂度为O(n)的解法。

放码

//文件名:exp1-4.cpp
#include <stdio.h>//循环版
long Sum(int n) {long sum = 0, fact = 1;for (int i = 1; i <= n; i++) {fact *= i;sum += fact;}return sum;
}//TODO:递归版//------------------------------------------------------------
int main() {int n;printf("n(3-20):");scanf("%d", &n);if (n < 3 || n > 20) return 0;printf("1!+2!+…+%d!=%ld\n", n, Sum(n));return 1;
}

结果

n(3-20):15
1!+2!+…+15!=1443297817
请按任意键继续. . .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性表实现一元多项式操作

数组存放&#xff1a; 不需要记录幂&#xff0c;下标就是。 比如1&#xff0c;2&#xff0c;3&#xff0c;5表示12x3x^25x^3 有了思路&#xff0c;我们很容易定义结构 typedef struct node{float * coef;//系数数组int maxSize;//最大容量int order;//最高阶数 }Polynomial…

ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件

在Linux下面如何去压缩文件或者目录呢&#xff1f; 在这里我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。 首先了解下Linux里面常用的压缩格式。 在我们探究这些用法之前&#xff0c;我想先跟大家分享一下使用不同压缩格式的经验。当然&#xff0c;我这里讲到的只…

《数据结构上机实验(C语言实现)》笔记(2 / 12):线性表

文章目录验证性实验实现顺序表各种基本运算的算法放码sqlist.hsqlist.cppexp2-1.cpp结果实现单链表各种基本运算的算法放码linklist.hlinklist.cppexp2-2.cpp结果实现双链表各种基本运算的算法放码dlinklist.hdlinklist.cppexp2-3.cpp结果实现循环单链表各种基本运算的算法放码…

链表排序-归并

链表排序&#xff0c;可以插入排序&#xff0c;我就不写了。 实现归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&…

ubuntu麒麟下安装并启用搜狗输入法

1.首先打开UK软件&#xff0c;输入搜狗寻找搜狗拼音软件 然后下载搜狗拼音软件 接着点击启动该软件 2.点击搜狗拼音的图标&#xff0c;进入搜狗拼音的设置窗口 点击高级&#xff0c;并打开FCITX设置 加入英语输入法 3.这样就可以进行中英文切换了

线性表表示集合

集合我们高中都学过吧&#xff1f; 最重要的几个特点&#xff1a;元素不能重复、各个元素之间没有关系、没有顺序 集合内的元素可以是单元素或者是集合。 对集合的操作&#xff1a;交集并集差集等&#xff0c;还有对自身的加减等。 需要频繁的加减元素&#xff0c;所以顺序…

家用无线路由器购买入门指南

视频一&#xff1a;「白问」普通大众 买路由器关注这几个点就够了 来源 例如商品名&#xff1a;AC 1200M 双频 AX前缀wifi6IEEE 802.11 AX AC前缀wifi5IEEE 802.11 AC AX比AC好 1200M 理论峰值 和网速无关 商家噱头 MIMO SU-MIMO 单用户多进多出&#xff08;早期&#xff…

ubuntu linux下执行.sh文件

ubuntu linux下执行.sh文件 首先&#xff0c;要确保这个文件的类型是可执行的。 有两种办法把文件设置为可执行文件。 1) 直接在文件属性标签中选中 "可执行"&#xff0c;--b 如果用的是图形界面&#xff0c;这个方法最简单直接。 2) 使用命令 chmod x file.sh。将可…

链表相交问题

本来想自己写&#xff0c;写了一半发现一篇文章&#xff0c;解释写得简单易懂&#xff0c;我就直接拿过来了。 这个问题值得反复地写&#xff0c;锻炼链表coding能力的好题。 //如果两个链表都不带环 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS写了一个模拟串行加法器

在重温《编码&#xff1a;隐匿在计算机软硬件背后的语言》第12章——二进制加法器时&#xff0c;心血来潮用JS写了一个模拟串行加法器。 测试断言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android学习路线总结

title: Android学习路线总结&#xff0c;绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一、前言 不知不觉自己已经做了几年开发了&#xff0c;由记得刚出来工作的时候感觉自己能牛X&#xff0c;现在回想起来感觉好无知。懂的越…

双栈

利用栈底位置相对不变的特性&#xff0c;可以让两个顺序栈共享一个空间。 具体实现方法大概有两种&#xff1a; 一种是奇偶栈&#xff0c;就是所有下标为奇数的是一个栈&#xff0c;偶数是另一个栈。但是这样一个栈的最大存储就确定了&#xff0c;并没有起到互补空缺的作用&a…

Error when loading the SDK:解决方案

错误情况&#xff1a; 当打开eclipse时出现如下窗口&#xff08;内容如下&#xff09; Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

单调队列优化的背包问题

对于背包问题&#xff0c;经典的背包九讲已经讲的很明白了&#xff0c;本来就不打算写这方面问题了。 但是吧。 我发现&#xff0c;那个最出名的九讲竟然没写队列优化的背包。。。。 那我必须写一下咯嘿嘿&#xff0c;这么好的思想。 我们回顾一下背包问题吧。 01背包问题 …

用Python去除扫描型PDF中的水印

内容概述 含水印扫描型PDF文件&#xff0c;其中某页如下图所示&#xff0c;用Python去除其页顶及页底的水印。 处理思路&#xff1a;PDF中的每一页的水印的相对位置基本相同&#xff0c;将PDF每一页输出成图片&#xff0c;然后进行图片编辑&#xff0c;用白色填充方形覆盖水印…

链表实现栈

栈&#xff0c;是操作受限的线性表&#xff0c;只能在一端进行插入删除。 其实就是带尾指针的链表&#xff0c;尾插 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define Status int #define SElemType int //只在头部进行插入和删除(…

二阶有源滤波器

滤波器是一种使用信号通过而同时抑制无用频率信号的电子装置, 在信息处理、数据传送和抑制干扰等自动控制、通信及其它电子系统中应用广泛。滤波一般可分为有源滤波和无源滤波, 有源滤波可以使幅频特性比较陡峭, 而无源滤波设计简单易行, 但幅频特性不如滤波器, 而且体积较大。…

用JS写了一个30分钟倒计时器

效果图 额外功能 左键单击计时器数字区&#xff0c;不显示或显示秒钟区。左键双击计时器数字区&#xff0c;暂停或启动计时器。计时完毕&#xff0c;只能刷新页面启动计时器。输入框可输入备注信息&#xff0c;输入框失去焦点或计时完毕后&#xff0c;时间戳附带备注信息会存入…

为什么高手离不了Linux系统?我想这就是理由!

通过本文来记录下我在Linux系统的学习经历&#xff0c;聊聊我为什么离不了Linux系统&#xff0c;同时也为那些想要尝试Linux而又有所顾忌的用户答疑解惑&#xff0c;下面将为你介绍我所喜欢的Linux系统&#xff0c;这里有一些你应该知道并为之自豪的事实。 这里你应该首先抛开W…

python学习实例(1)

# #1.2 计算机编程的基本概念 ## #1.2.2 从Python语言进入计算机语言的世界 ##<程序&#xff1a;例子1> def F(x,y):return(x*xy*y) print("F(2,2)",F(2,2)) print("F(3,2)",F(3,2))#<程序&#xff1a;例子2> def Pr():for i in range(0,10)…