广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一篇文章带你了解论C语言中算法的重要性
  • 941
分享到

一篇文章带你了解论C语言中算法的重要性

2024-04-02 19:04:59 941人浏览 安东尼
摘要

目录一、问题一(打印阶乘)问题描述:问题分析:解决方案:1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身2.这里要引入c++中STL库的一个知识点二、问题二(比较多项

一、问题一(打印阶乘)

问题描述:

打印出数字一到数字20的阶乘

一开始,我总会多打印出一个1,这令我十分苦恼,并且从n等于13开始,数据就开始溢出

问题分析:

让我们分析一下问题,这里面存在着两个问题:

1.多打印出一个1

2.数据溢出

解决方案:

1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身

for (i = 1; i < num; i++)//这句话明显错了

改成


for (i = 1; i <= num; i++) {//i的值要乘以它本身!
			n = n * i;
		}

2.这里要引入C++中STL库的一个知识点

常规的32位整数只能够处理40亿以下的数。

如果遇到比40亿要大的数,就要用到C++的64位扩展。不同的编译器对64位整数的扩展有所不同。这个我也是听别人科普的,大家可以站内搜索一下。

优化后的代码如下:


#include <stdio.h>
void main() {
	__int64 fac(int num);
	int n = 1;
	int num;
	for (num = 0; num <= 20; ++num) {
		printf("%3D! = %I64d\n", num, fac(num));
	}
}
__int64 fac(int num) {
	reGISter __int64 n = 1, i;     //寄存器变量
		for (i = 1; i <= num; i++) {//i的值要乘以它本身!
			n = n * i;
		}
		return n;
}

二、问题二(比较多项式计算时间)

问题描述:

这里先科普几个测试代码中的知识点:

这个表示本程序开始计时:

start = clock();

本程序结束计时:

stop = clock();

clock tick :时钟打点

CLK_TCK:机器时钟每秒所走的时钟打点数

问题分析:

首先这个问题有两种算法

直接算

p1 += (pow(x, i)/i);

把x当成公因式提出计算(秦九韶法)

p2 = 1.0/(a[i - 1])+ (x*p2);

然后我发现了三个问题:

1.测量不出时间

2.程序重复性高

3.第一种结果和第二种结果不一致

解决方案:

1.让被测函数重复运行多次,使得测出的总时钟打点间隔充分长,最后计算被测函数除以运行次数即可得出平均每次的运行时间


duration = ((double)(stop - start)) / CLK_TCK / MAXK;

2.可以通过多设置几个函数,并调用函数解决问题

3.这是算法的问题

这个地方真的特别容易出错,我改了不知道多少遍。。。。。。


double f2(int n, double a[], double x) {
	int i;
	double p2 = 1.0/a[n];
	for (i = n; i > 0; i--) {
		p2 = 1.0/(a[i - 1])+ (x*p2);//算法思路出毛病了(数学)
	}
	return p2;
}

总体的代码:


#include <stdio.h>
#include <math.h>
#include <time.h>
clock_t start, stop;
double duration;
#define MAXN 101//数组里元素个数(多项式的系数),如果看n值需要减一,因为有a0
#define MAXK 1000//重复调用的次数
double f1(int n, double a[], double x)
{
	double p1 = a[0];//a[0]都已经算出来了,循环从1开始
	for (int i = 1; i <= n; i++) {
		p1 += (pow(x, i)/i);
	}
	return p1;	
}
double f2(int n, double a[], double x) {
	int i;
	double p2 = 1.0/a[n];
	for (i = n; i > 0; i--) {
		p2 = 1.0/(a[i - 1])+ (x*p2);//算法思路出毛病了(数学)
	}
	return p2;
}
double ceshijian()
{
	stop = clock();//停止计时
	duration = ((double)(stop - start)) / CLK_TCK / MAXK;//计算单次运行时间
	printf("ticks=%f\n", (double)(stop - start));
	printf("duration=%6.2e\n", duration);
	return 0;
}
int main()
{
	int i;
	double a[MAXN];
	for (i = 0; i < MAXN; i++) {
		a[i] = (double)i;
	}//输入的早就是i值了
	a[0] = 1;
	//不在测试范围内的准备工作写在clock()调用之前
	start = clock();//开始计时
	for (int i = 0; i < MAXK; i++)//重复调用
		f1(MAXN - 1, a, 1.1);//被测函数,这里如果写数组的话就越界了,而且要调用某个值是不确定的,只能写a,因为要定义的就是a值
	printf("第一种结果为%f\n", f1(MAXN - 1, a, 1.1));
	ceshijian();

	start = clock();//开始计时
	for (i = 0; i < MAXK; i++)
		f2(MAXN - 1, a, 1.1);//被测函数,这里如果写数组的话就越界了,而且要调用某个值是不确定的
	printf("第二种结果为%f\n", f2(MAXN - 1, a, 1.1));
	ceshijian();
	return 0;
}

结果如下

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 一篇文章带你了解论C语言中算法的重要性

本文链接: https://www.lsjlt.com/news/132562.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你了解论C语言中算法的重要性
    目录一、问题一(打印阶乘)问题描述:问题分析:解决方案:1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身2.这里要引入C++中STL库的一个知识点二、问题二(比较多项...
    99+
    2022-11-12
  • 一篇文章带你了解C语言函数的可重入性
    目录一、不可重入函数。二、可重入函数。三、如何写出可重入的函数四、函数的可重入性和线程安全的关系五、malloc和printf为什么不可重入总结一、不可重入函数。 在函数中如果我们使...
    99+
    2022-11-12
  • 一篇文章带你了解C++的KMP算法
    目录KMP算法步骤1:先计算子串中的前后缀数组NextC++代码:步骤2:查找子串在母串中出现的位置。总结KMP算法 KMP算法作用:字符串匹配 例如母串S = “aaagoogle...
    99+
    2022-11-12
  • 一篇文章带你了解c++运算符重载
    目录友元函数重载:复合赋值Operator pairings自增自减运算符的重载c++20,spaceship operator总结友元函数 一种全局函数,可以在类里声明,其他地方定...
    99+
    2022-11-12
  • 一篇文章带你了解C语言操作符
    目录一、操作符分类 二、算术操作符三、移位操作符1、左移操作符 2、右移操作符2.1算术移位 2.2逻辑移位 四、位操作符 1、按位...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的文件操作
    目录为什么使用文件什么是文件程序文件数据文件文件名文件的打开和关闭文件指针fopen和fclose函数文件的顺序读写总结为什么使用文件 我们在想既然是通讯录就应该把信息记录下来,只有...
    99+
    2022-11-13
  • 一篇文章带你了解C语言中volatile关键字
    目录C语言中volatile关键字总结C语言中volatile关键字 volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多。 当不用这个关键字的时候,CP...
    99+
    2022-11-12
  • 一篇文章带你了解C语言内存对齐
    目录内存对齐三、在内存对齐话题下的sizeof与offsetof宏3.1、sizeof3.2、offsetof宏3.3、Debug总结内存对齐 先看如下代码: 结构体Test1...
    99+
    2022-11-12
  • 一篇文章带你了解C语言函数递归
    目录什么是递归?递归的两个必要条件递归实例实例1(按照顺序打印一个数的整形值)画图讲解 完整代码 实例2 (使用函数在不创建变量的情况下求字符串长度)画图讲解程序...
    99+
    2022-11-13
  • 一篇文章带你了解C语言:入门基础
    目录C语言本身特点数据类型常量变量变量分类使用小建议生命周期作用域常量分类及其特点字符串+转义字符+注释字符串转义字符两种注释选择循环语句函数数组总结闲话少说,先上思维导图。 如图...
    99+
    2022-11-12
  • 一篇文章带你了解C语言指针进阶
    目录1.字符指针2.指针数组3.数组指针4.函数指针5.数组传参总结1.字符指针 我们已经知道了数组名在大部分时候表示数组的地址,指针本质上也表示一个地址,那么我们能否用指针来创建一...
    99+
    2022-11-12
  • 一篇文章带你了解C语言二分查找
    目录总结我们常常需要对数据进行查找,修改,查找数据有许多方法,我们先看看最简单的顺序查找 int main() { int i, k = 0; scanf("%d", &am...
    99+
    2022-11-12
  • 一篇文章带你了解C语言--数据的储存
    目录前言数据类型介绍类型的基本归类整形在内存中的存储原码、反码、补码大小端介绍浮点型在内存中的存储前言 前面我们学习了C语言的一些基本知识和基础的语法,想必大家对C语言都有了自己的认...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的选择结构
    目录一、if-else语句1.单选择 2.双选择3.多选择二.switch语句总结一、if-else语句 1.单选择 单选择通过if语句就可以实现,if语句的语法及执行流程...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的一些重要字符串与内存函数
    目录一.字符串函数1. 求字符串长度的strlen2.比较字符串大小的strcmp3.复制字符串的strcpy4.追加字符串的strcat5.查找字符串函数的strstr二、内存函数...
    99+
    2022-11-12
  • 一篇文章带你了解C语言:入门基础(2)
    目录操作符算术操作符移位操作符位操作符单目操作符逻辑反操作!操作符++,--逻辑操作符条件操作符逗号表达式常见关键字typedefexternstatic修饰局部变量修饰全局变量和函...
    99+
    2022-11-12
  • 一篇文章带你了解C语言内存对齐公式
    目录一、前言二、公式2.1、例子一2.2、例子二2.3、例子三总结一、前言 每一个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。GCC中默认#program pack...
    99+
    2022-11-12
  • 一篇文章带你了解C++语法基础--字符串
    目录总结字符与整数的关联在于ASCII码:每一个常用字符都对应一个-128 ~ 127 的数字,二者之间是可以进行相互转换的: #include <iostream>...
    99+
    2022-11-12
  • 一篇文章带你了解C++中的异常
    目录异常抛出异常基本操作自定义的异常类栈解旋异常接口声明异常变量的生命周期异常的多态c++的标准异常库编写自己的异常类总结异常 在c语言中,对错误的处理总是两种方法: 1,使用整型的...
    99+
    2022-11-13
  • 一篇文章带你了解C语言文件操作中的几个函数
    目录总结fopen:有两个参数,第一个是要被打开或者被创建的文件名,第二个是以什么方式打开。这两个参数要分别用双引号括起来 打开文件和关闭文件的基本流程,关闭文件之后要置空 f...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作