1, 1000的阶乘
这个算法主要有两个地方要注意, 一个就是大数的问题, 还有一个就是位数的问题,
只要这两个问题解决了,这个算法也就没有什么问题了,
①首先还是来说一下位数的问题, 有一个比较简单的办法,就是有一个人已经做了一个公式来
做位数的问题了: lnN!=NlnN-N+0.5ln(2N*pi), log10(N!)取整后加1就是1000!的位数,这里log10(N!)=lnN!/ln(10),
是不是很简单,看来数学这个东西还真是要学好不可啊,
Code
1public static int DigitNum(int n)
2 {
3 if (n < 0)
4 return -1;
5 if (n == 0 || n == 1)
6 return 1;
7
8 return (int)((n * Math.Log(n) - n + Math.Log(2 * n * Math.PI) / 2) / Math.Log(10)) + 1;
9 }
②大数的问题, 因为在阶乘运算中,常常用一个long int型是不能够的,这样就要找其它的办法,要在存储数字,这样的话就只有数组了,
用数组里a[0]--个位,a[1]--十位,a[2]--百位.......这样不就可以表达所有的数了吗?
最后 1000阶乘源码
源文件:/Files/ouzi/WinForm/Factorial1000.rar
2, 快速排序法
快速排序法可以说是运用递归的最经典的例子,哦,这个话好象不对, 最经典的应该是这个Fibonacci了
Code
public static int Fibonacci(int n)
{
if (n < 1)
throw new Exception("error");
if (n == 1 || n == 2)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
我以前好象说过,我在项目中用的快速排序也不多,主要用的是插入排序法,因为插入排序法的代码相对少一些,也比较直观,
现在闲来无事,也就将这个做一下,快速排序法的主要思想就是不停的填位,再不停的分割,填位就是为了让基数左边的所有数都
小于基数,右边的数都大于基数(这个是按由小到大来说的).
Code
public void Sort(int[] array, int low, int height)
{
if (low >= height)
return;
int i = low;
int j = height;
int baseValue = array[i];
while (i < j)
{
while ((array[j] >= baseValue) && (i < j)) j--;
array[i] = array[j];
while ((array[i] <= baseValue) && (i < j)) i++;
array[j] = array[i];
}
array[i] = baseValue;
Sort(array, low, i - 1);
Sort(array, i + 1, height);
}
3,分页的存储过程
这个应该不能算是算法,但好象也不能不算,不管那么多了,就这样的吧,放到这里,这个存储过程中也有一些技巧的东西。
Code
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id=OBJECT_ID(N'[dbo].[GetDataByPage]') AND type IN (N'P',N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement=N'
CREATE PROCEDURE [dbo].[GetDataByPage]
(
@table VARCHAR(200),
@field VARCHAR(200)=''*'',
@where VARCHAR(200)=NULL,
@orderBy VARCHAR(200)=NULL,
@pageIndex INT=1,--注意这里的页码计数是从1开始的
@pageSize INT=10,
@totalCount INT=0 OUTPUT
)
AS
BEGIN
DECLARE @sqlString VARCHAR(5000)
-------------------------------------------------------------------------------------
SET @sqlString=''SELECT @totalCount=COUNT(*) FROM ''+@table
EXEC sp_executesql @sqlString,N''@totalCount INT OUTPUT'',@totalCount OUT
-------------------------------------------------------------------------------------
DECLARE @whereString VARCHAR(200)
IF @where IS NOT NULL AND @where <>''''
SET @whereString='' WHERE ''+@where;
ELSE
SET @whereString=''''
DECLARE @orderByString VARCHAR(200)
IF @orderBy IS NOT NULL AND @orderBy <>''''
SET @orderByString='' ORDER BY ''+@orderBy;
ELSE
SET @orderByString=''''
IF @pageIndex<1
BEGIN
SET @pageIndex=0
SET @sqlString=''SELECT TOP ''+STR(@pageSize)+@field +'' FROM ''+@table+@whereString+@orderByString
EXEC sp_executesql @sqlString
END
ELSE
BEGIN
IF @orderByString<>''''
BEGIN
--SELECT id,author FROM (SELECT ROW_NUMBER() OVER(ORDER BY specialMark) AS ROWNUM,id,author,specialMark FROM Article) AS T
SET @sqlString=''SELCT ''+@field+'' FROM (SELECT ROW_NUMBER() OVER(''+@orderBy+'') AS ROWNUM,''
+@field+'' FORM ''+@table+@whereString+'') AS T WHERE BETWEEN ''+STR((@pageIndex-1)*@pageSize)+'' AND ''
+STR(@pageIndex+1*@pageSize-1)
EXEC sp_executesql @sqlString
END
END
END
--'
这个里面的sp_executesql的用法要注意,可以在存储过程中返回值,这样在分页中就不用返回两个表了,
DECLARE @sqlString NVARCHAR(500)
DECLARE @totalCount INT
SET @sqlString='SELECT @totalCount=COUNT(*) FROM Blog'
EXEC sp_executesql @sqlString,N'@totalCount INT OUTPUT',@totalCount OUT
PRINT @totalCount
4,两张表列的拼接
也就是没有关系的两张表的列拼接
Code
SELECT ta.TermSN,ta.TeacherSN,ta.CourseSN,ta.ClassName,tb.ClassID FROM
(
SELECT *,ROW_NUMBER() OVER(ORDER BY TermSN) AS RowNumA FROM
(SELECT DISTINCT cc.TermSN,cc.CourseSN,cc.TeacherSN,cc.ClassName,cr.Weeks
FROM dbo.CourseClass AS cc,dbo.CourseRoom AS cr WHERE
cc.TermSN =cr.TermSN AND cc.TeacherSN=cr.TeacherSN AND cc.CourseSN =cr.CourseSN) AS B) AS ta
LEFT JOIN
(
SELECT ClassID, ROW_NUMBER() OVER(ORDER BY ClassID) AS RowNumB FROM dbo.Class
) AS tb ON ta.RowNumA=tb.RowNumB
----------------------------------------------------------------------------------------------------------------
算法之路永无止境---ouzi--just love it