剖析SQLsever之01-百钱白鸡-C/sqlsever存储过程

题目及分析原链接如下:
http://c.biancheng.net/view/500.html
参考链接:https://www.cnblogs.com/huangxincheng/archive/2012/08/05/2624156.html

1.1、问题如下:

我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?

1.2.、题目分析

如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组。设公鸡 x 只,母鸡 y 只,小鸡 z 只,得到以下方程式组:
A:5x+3y+1/3z = 100
B:x+y+z = 100
C:0 <= x <= 100
D:0 <= y <= 100
E:0 <= z <= 100

如果用解方程的方式解这道题需要进行多次猜解,计算机的一个优势就是计算速度特别暴力并且无怨无悔,所以我们可以欺负她、蹂躏她!因此我们用穷举法的方式来解题,需要 101^3 次猜解,但对于计算机来说,小 CASE!

1.3、代码如下

1.3.1、C语言

方法一:时间复杂度为 O(n^3)

// hundred chickens.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
	printf("百元买百鸡的问题所有可能的解如下:\n");
	int cock,hen,chicken;
	for( cock=0; cock<21; cock++)
		for( hen=0; hen<34; hen++)
			for ( chicken=0; chicken<300; chicken++)
				if( cock*5+hen*3+chicken/3==100 && cock+hen+chicken==100 && chicken%3==0 )
					printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", cock, hen, chicken);
	return 0;
}


方法二:时间复杂度为 O(n^2)

// hundred chickens.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
	printf("百元买百鸡的问题所有可能的解如下:\n");
	int cock,hen,chicken;
	chicken=0;
	for( cock=0; cock<21; cock++)
		for( hen=0; hen<34; hen++) {
			chicken = 100-cock-hen;
			if( cock*5+hen*3+chicken/3==100 && chicken%3==0 )
				printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", cock, hen, chicken);
		}
	return 0;
}


方法三:时间复杂度为O(n)
从结果中我们可以发现这样的一个规律:公鸡是4的倍数,母鸡是7的递减率,小鸡是3的递增率,规律哪里来,肯定需要我们推算一下这个不定方程。

x+y+z=100          ①
5x+3y+z/3=100    ②

令②*3-① 可得

7x+4y=100
=>y=25-(7/4)x          ③

又因为0<y<100的自然数,则可令

 x=4k                    ④

将④代入③可得
=> y=25-7k ⑤

将④⑤代入①可知
=> z=75+3k ⑥

要保证0<=x,y,z<100的话,k的取值范围只能是1,2,3,4,下面我们继续上代码。

// hundred chickens.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
	printf("百元买百鸡的问题所有可能的解如下:\n");
	int cock,hen,chicken,k;
	cock=hen=chicken=k=0;
	for(k=0; k<5; k++)
	{
		cock = 4*k;
		hen = 25-7*k;
		chicken = 75+3*k;
		printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", cock, hen, chicken);
	}
	return 0;
}


输出:
在这里插入图片描述

1.2、sqlsever存储过程

方法一:等同于C语言,方法三

print '百元买百鸡的问题所有可能的解如下:'

declare @cock int,@hen int,@chicken int,@k int
--cock:公鸡 hen:母鸡 chicken:小鸡 
set @cock=0
set @hen=0
set @chicken=0
set @k=0
while @k<5
begin
	set @cock=4*@k
	select @hen=25-7*@k
	select @chicken=75+3*@k
	select @k=@k+1
	print @cock
	print @hen
	print @chicken
end

方法二:暴力穷举—额,太慢了,跑了很久都没有结果

--百钱买鸡
/*
鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;
百钱买百鸡,则翁、母、雏各几何?
*/

print '百元买百鸡的问题所有可能的解如下:'

declare @cock int,@hen int,@chicken int,@sum int,@money int
--cock:公鸡 hen:母鸡 chicken:小鸡 sum:鸡的总数 money:买sum只鸡所花的钱
set @cock=0
set @hen=0
set @chicken=0
set @sum=0
set @money=0
while @cock<=20 
begin
	while @hen<34
	begin
		while @chicken<=100
		begin
			select @money=5*@cock+3*@hen+@chicken/3
			select @sum=@cock+@hen+@chicken
			if(@money=100 and @sum=100)
			begin
				print '公鸡='+@cock
				print '母鸡='+@hen
				print '小鸡='+@chicken
			end
		end
	end
end
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值