热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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


文章目录

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


验证性实验


求1~n的连续整数和


说明

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

对于相同的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
#include // clock_t, clock, CLOCKS_PER_SEC
#include //方法1:老实累加
long add1(long n)
{long i, sum &#61; 0;for (i &#61; 1; i <&#61; n; i&#43;&#43;)sum &#43;&#61; i;return(sum);
}void AddTime1(long n) /* 采用方法1的耗时统计 */
{clock_t t &#61; clock();long sum &#61; add1(n);t &#61; clock() - t;printf("方法1:\n");printf(" 结果:1&#xff5e;%d之和:%ld\n", n, sum);printf(" 用时:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//方法2&#xff1a;用公式
long add2(long n) /* 方法2&#xff1a;求1&#43;2&#43;...&#43;n */
{return(n * (n &#43; 1) / 2);
}void AddTime2(long n) /* 采用方法2的耗时统计 */
{clock_t t &#61; clock();long sum &#61; add2(n);t &#61; clock() - t;printf("方法2:\n");printf(" 结果:1&#xff5e;%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&#xff5e;99999999之和:887459712用时:0.222000秒
方法2:结果:1&#xff5e;99999999之和:887459712用时:0.000000秒
请按任意键继续. . .

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


说明

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

对于1~n的每个整数n&#xff0c;输log⁡2n\log_2nlog2nn\sqrt nn

nnnnlog⁡2nn \log_2nnlog2nn2n^2n2n3n^3n32n2^n2nn!n!n!


放码

//文件名&#xff1a;exp1-2.cpp
#include
#include double log2(double x) //求log2(x)
{return log10(x)/log10((double)2);
}long exponent(int n) //求2^n
{long s&#61;1;for (int i&#61;1;i<&#61;n;i&#43;&#43;)s*&#61;2;return s;
}long factorial(int n) //求n!
{long s&#61;1;for (int i&#61;1;i<&#61;n;i&#43;&#43;)s*&#61;i;return s;
}void fun(int n)
{printf("log2(n) sqrt(n) n nlog2(n) n^2 n^3 2^n n!\n");printf("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;\n");for (int i&#61;1;i<&#61;n;i&#43;&#43;){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&#61;10;fun(n);return 1;
}

结果

log2(n) sqrt(n) n nlog2(n) n^2 n^3 2^n n!
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;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
请按任意键继续. . .

设计性实验


求素数个数


说明

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

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


放码

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

结果

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

求连续整数阶乘的和


说明

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


放码

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

结果

n(3-20):15
1!&#43;2!&#43;…&#43;15!&#61;1443297817
请按任意键继续. . .

推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细探讨了C语言中指针的概念,特别是指针在变量和数组中的应用。通过实例讲解,帮助读者更好地掌握指针的使用方法。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
author-avatar
周俊瑶zjy_963
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有