菜鸟学算法--简单的交换和最大公约数算法入门篇

工作之后我们大部分的时间实在研究如何如何学习一门语言 如何如何掌握一门技术,但是作为编程的本质 数据结构和算法 我们慢慢的忽略了 。

工作后的很多程序员真的没有大学生一样的时间 去静下心来去增加自己的底蕴,这是我深有体会的事情当然我这里指的是和我有累死感觉的人。

学习是一个过程,从简入繁 一贯如此,记录下来只为 记录自己的点点滴滴。

算法的本质并不是我们程序员去创造算法 而是我们 按照先人创造的算法思想 用代码来实现算法。

下面开始介绍两个 简单的例子 一个是交换 一个是最大公约数算法。

简单的交换

#include "stdafx.h"
#include <stdio.h>
/*
  我们的目标是
  交换abcd的值为bcda     函数 M1   M2
  此处代码相信都是再小儿科不过的代码了,但是小儿科的代码实际上也是有小儿科的写法。
  我们在写代码的时候要保证的两点  高效 快速 最小的损耗 完成功能即可 。
*/
int a = 1, b = 2, c = 3, d = 4;
int arr[4] = { 1, 2, 3, 4 };

//abcd的值变成 bcda
#define  M1(ta,tb,tc,td)  \
       int tem;  tem=td ; td=ta;ta=tb;tb=tc;tc=tem
//abcd的值变成 bcda
#define M2(ta,tb,tc,td)      \
            ta+=td;td=ta-td;ta-=td; \
            ta+=tc;tc=ta-tc;ta-=tc;  \
			ta+=tb;tb=ta-tb;ta-=tb;
#define  RESET(ta,tb,tc,td)   \
        ta = 1; tb = 2; tc = 3; td = 4; 

int _tmain(int argc, _TCHAR* argv[])
{
	//首先对abcd进行值替换成bcda 一说到替换 很多新手就想到了  t=a  a=b b=t~
	//这里中间多一步 空间的 浪费 即  t中间变量  实际上我们可以  a=a+b; b=a-b; a=a-b;
	//我们可以这样去写这个代码 

	printf("M2----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
	M2(a, b, c, d);
	printf("M2----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
	printf("\n");
	RESET(a, b, c, d);
	//不同的情况下我们使用不同的方式 来解决 ,对于两个变量的交换我们可以用上述的  无中间变量的方式来交换看似减少了空间占用 ,但是四个变量呢 ?四个变量的交换 貌似情况变了
	//实现如M1 尽管我实现的不好 但是的确是减少了 传统意义上的交换步骤  这种代码其实只有在大家 刚接触程序的时候才会写道~~~~哈哈
	//这也印证了一点  情况复杂多变  代码实现方式也很多   我们要做到  最少的代码 最少的计算次数 完成目的即可。
	printf("M1----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
	M1(a, b, c, d);
	printf("M1----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
	return 0;
}

下面一个是 求最大公约数的算法 欧几里得算法

#include "stdafx.h"
//求最大公约数
//算法欧几里得算法的应用
//获得最大公约数
//现在求ab的最大公约数 既能被a又能被b整除的数字
//如果你不了解 欧几里得算法 那么可能会 循环来解决问题 ...那么很糟糕的
//我们程序员的算法本质 是 拿来数学算法 思想转换成代码 这就是我们大部分使用算法的本质  除非你是算法研究者 那么 另当别论
//看看这端程序如果你不知道 欧几里得算法  衍生的 求最大公约数算法 你该如何去写程序?或许是多个循环吧,~
int   GreatestCommonDivision(int a, int b)
{
	//不能为负数
	if (a < 0 || b < 0)
		return -1;
	///保证a一定大于等于b
	if (a < b)
	{
		a = a + b;
		b = a - b;
		a = a - b;
	}
	int r = 0;
	//取余数 如果余数等于0 那么 最大公约数既为 当前a
	while ((r = a%b) != 0)
	{
		//否则 a<-b   b<-r    这里的余数r 一定是小于b的
		a = b;
		b = r;
	}
	//等于0就退出了
	return  b;
}

int _tmain(int argc, char**argv)
{
	int a = 15, b = 220;
	printf("%d和%d的最大公约数是:%d\n", a, b, GreatestCommonDivision(a, b));
	return 0;
}

简单的入门就到这里 ,皮毛技术慢慢的积累 总有一天会有收获滴

时间: 2024-10-15 04:09:30

菜鸟学算法--简单的交换和最大公约数算法入门篇的相关文章

简单的前端js+ajax 购物车框架(入门篇)_javascript技巧

今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的增删改查,也许写的并不是那么完善,但最重要的是一个入门,也希望js达人给些建议,好让我更上一个台阶. HOHO~~~开始咯: Js: 复制代码 代码如下: //为了省事,就没写自己的js ajax了 用了jquery的,当然你也可以添加到jquery的扩展方法内,哈哈,我太懒了,所以就写这里了. var _$ = { AJAX: function (urlparm, d, beforecall, successc

《趣学CCNA——路由与交换》一第2章 TCP/IP协议2.1 TCP协议简介

第2章 TCP/IP协议 趣学CCNA--路由与交换 在上一章,我们郑重其事地介绍了无聊的OSI七层参考模型,并浓墨重彩地讲述了其中每一层负责提供的功能.OSI模型出身名门.条理清晰,只有一个"小小的"缺点,那就是一直没人太拿它当回事儿.所以,如果对它太认真,你就败了. 我们是有职业精神的,因此在介绍OSI模型时反复强调了这个模型是如何地曲高和寡.我们在上一章中花大篇幅介绍OSI模型有三个目的:一是延续各类技术教材的惯例,以免将本书作为技术开蒙读物的读者在与别人讨论技术问题时,因全然不

《趣学CCNA——路由与交换》——6.1节Cisco设备的管理与配置

6.2 Cisco设备的管理与配置 趣学CCNA--路由与交换 6.2.1 通过Console接口连接网络设备 当我们启动Cisco设备后,所面对的是一个完全没有配置过的设备.如果我们需要让它完成某些任务,就必须对它进行配置.在这里,我们介绍最为常用的一种配置方式,那就是通过连接图6-2所示的Console接口对设备进行管理. 当然,通过电脑连接Console接口,需要一根数据线,干这事儿的数据线业内俗称Console线.这类线一端是一个RS-232的DB-9接口(串口),用来连接咱们的电脑:另

菜鸟学Windows Phone 8开发(4)——设置应用程序样式

原文 菜鸟学Windows Phone 8开发(4)--设置应用程序样式 本系列文章来源MSDN的 面向完全新手的 Windows Phone 8 开发  本文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-6-Styling-the-App 源代码:http://aka.ms/absbeginnerdevwp8 我 们已经学习了XAML布局和事件基础,接下来让我

《趣学CCNA——路由与交换》——2.2节UDP协议简介

2.2 UDP协议简介趣学CCNA--路由与交换TCP是一个面向连接的协议,而UDP则正好相反,它是一个"无连接的"协议.这意味着,您不会在这一节读到关于握手流程的那些复杂的内容,可以省下一些时间和精力用来刷微博.微信.但是,TCP费那么大工夫去握手可不是因为它空虚寂寞觉得冷,这一切都是为了保障接收方能够收到自己发送的数据.UDP省掉了这个过程,这也就说明,UDP 并不关心对方能不能收到它发送的信息.因此,如果说TCP发送出去的数据是能够随时查询投递状态的快递包裹或者挂号信,那么UDP

《趣学CCNA——路由与交换》一6.2 Cisco设备的管理与配置

6.2 Cisco设备的管理与配置 趣学CCNA--路由与交换 6.2.1 通过Console接口连接网络设备 当我们启动Cisco设备后,所面对的是一个完全没有配置过的设备.如果我们需要让它完成某些任务,就必须对它进行配置.在这里,我们介绍最为常用的一种配置方式,那就是通过连接图6-2所示的Console接口对设备进行管理. 当然,通过电脑连接Console接口,需要一根数据线,干这事儿的数据线业内俗称Console线.这类线一端是一个RS-232的DB-9接口(串口),用来连接咱们的电脑:另

《趣学CCNA——路由与交换》——2.1节TCP协议简介

2.1 TCP协议简介趣学CCNA--路由与交换上一章介绍传输层的时候曾经提到过,传输层的某些协议是"面向连接"的,所谓面向连接是指这个协议可以追踪数据的传输状态,并且可以在传输失败的时候对数据进行重传 ,而本节要进行介绍的TCP 协议就是面向连接的协议. TCP 协议的全称是"传输控制协议",这种协议可以给上层应用提供一种可靠的传输机制 .用人话来说,就是通过这家快递公司发件,它可以通过追踪包裹的实时状态来监控投递进度,就算对方因为某种原因没有收到,它们也会再次上

《趣学CCNA——路由与交换》一导读

前 言 趣学CCNA--路由与交换关于本书本书的核心编写理念是为准备投身网络行业却没有任何基础,或者刚刚学习过一两遍CCNA课程的读者,创作一本可以在如厕时顺手把玩的读物.我们的写作不求精,不求深,更不求全,只求通俗易懂,老少咸宜.我们渴望本书能够把自学这项功能发挥到极致. 换句话说,如果您在阅读某些知识点的时候,发现我的讲解方式比同类教材更难理解,并不意味着我也在故作高深,只单纯意味着我也不精于叙事说理.当然,本书经过多位编辑层层把关,并按照通俗易懂的方式修改处理后,出现上述情况的机会应该不会

菜鸟学用Dreamweaver MX 2004行为教程

dreamweaver|教程 1.菜鸟学用Dreamweaver MX 2004行为(16)设置文本 [2005-03-08]     2.菜鸟学用Dreamweaver MX 2004行为(15)显示弹出菜单 [2005-03-08]     3.菜鸟学用Dreamweaver MX 2004行为(14)预先载入图象 [2005-03-08]     4.菜鸟学用Dreamweaver MX 2004行为(13)拖动层 [2005-03-08]     5.菜鸟学用Dreamweaver MX