博文

万年历算法(2006-07-30 02:13:00)

摘要:一、 阳历算法具体算法见函数Void get_solar_day_date(void),这样阳历日历的星期排法就确定了。表1:月份 1 2 3 4 5 6 7 8 9 10 11 12 闰年 31 29 31 30 31 30 31 31 30 31 30 31 非闰年 31 28 31 30 31 30 31 31 30 31 30 31 变量定义:Public:Unsigned int temp_total_day;Unsigned char gc_solar_calendar_year;Unsigned char gc_solar_calendar_month;Unsigned char gc_solar_calendar_date;Unsigned char gc_lunar_calendar_year;Unsigned char gc_lunar_calendar_month;Unsigned char gc_lunar_calendar_date;Unsigned char start_day_of_week;说明:函数get_solar_day_date(void)的输入变量:gc_solar_calendar_year和gc_solar_calendar_month输出变量:start_day_of_week和temp_total_dayVoid get_solar_day_date(void){unsigned char temp01;/*------calculate what day is the day of the current month and year. Mon~Sun?---*//*条件初始化二次,减少运算数据量. temp_total_day 是int型变量*/start_day_of_week = 2; temp_total_day = 0;calculate_temp = 1;if(gc_solar_calendar_year > 99){start_day_of_week = 6;calculate_temp = 100;}for(temp01 = calculate_temp; temp01<gc_solar_calendar_year; temp01++){ if(temp01%4 == 0){start_......

阅读全文(2947) | 评论:3

全选主元高斯消去算法(2006-07-30 02:12:00)

摘要:/*    全选主元高斯消去算法,求解线性方程组 A * x = b    By Kingwei  2005.2.27*/#include <stdio.h>#include <math.h>#define EPS        1e-11#define MAX_DIM        20int GaussLEquation(double x[], int dim, double A[][MAX_DIM], double b[]){    int maxColPos[MAX_DIM], maxRowPos;    double maxElem, absElem, temp;    int k, i, j, status = 1;        for (k=0; k<dim; k++)    {        maxElem = 0.0;        for (i=k; i<dim; i++)            for (j=k; j<dim; j++)            {             &n......

阅读全文(1844) | 评论:0

阶乘的两种算法(2006-07-30 02:11:00)

摘要:/***作者:twopiece12**版本:0.9**/# include <conio.h># include <malloc.h># include <stdio.h># define MAX 100main(){    int *a;    int i,k,count,j = 1;    int n;    int temp;    a = (int *)malloc(sizeof(int)*MAX);    printf("please input the number of n which you want to used to calculate the n! \n");    scanf("%d",&n);    for (i=0; i<MAX; i++)    {        a[i] = 0;        }    a[MAX-1]=1;    while (j <= n)    {        i = 1;        while ( MAX-i >= 0)        {            ......

阅读全文(2762) | 评论:1

基本的算法归纳总结(2006-07-29 02:11:00)

摘要:基本的算法归纳总结一下: 一、排序算法:(1)冒泡排序法(2)选择法(3)插入排序 二、查找算法:(1)顺序查找(2)二分查找(有序数列查找) 三、字符串操作(1)求串长(2)串连接(3)串拷贝(4)求子串(5)串比较 四、斐波那契数列(1)使用单变量(2)使用数组(3)使用递归函数 五、求最大数最小数算法(1)求最大数最小数(2)求最大数最小数所在的位置 六、杨辉三角形(1)使用一维数组(2)使用二维数组 七、倒序算法(1)倒序一个整数数组(2)倒序一个字符串 八、矩阵的操作(1)求最大数的行列下标(2)转置矩阵 这些算法我将一一动手写出来.若有更好的,更快的,高效的算法都可以贴出来. 一、排序算法:(1)冒泡排序法(2)选择法(3)插入排序 (1).#include     #include int Bubble(int source[],int n) {   int start=0,end=n-1;   int i;   int count=0;   while(start......

阅读全文(2182) | 评论:0

排序算法小结(2006-07-29 02:09:00)

摘要:排序算法小结 排序小结    排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。    而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。     对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。    我将按照算法的复杂度,从简单到难来分析算法。    第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。    第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。    第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。    第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。        现在,让我们开始吧:    一、简单排序算法由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法:这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:#include void BubbleSort(int* pData,int Count){    int iTemp;    for(int i=1;i    {    &n......

阅读全文(1243) | 评论:0

算法:元素选择问题总结(2006-07-29 02:09:00)

摘要:元素选择问题 注:中位数:中间大小的数 ;上取整用|  |表示,下取整用[ ]表示 1.选最大输入:n个不等的数输出:max算法1    Findmax1. max←L[1]2. for i←2 to lenth[L]        do if max ......

阅读全文(1819) | 评论:0

C语言初学者入门讲座 第七讲 循环结构(2006-07-29 02:04:00)

摘要:循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C语言提供了多种循环语句,可以组成各种不同形式的循环结构。   while语句  while语句的一般形式为: while(表达式)语句; 其中表达式是循环条件,语句为循环体。  while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用图3—4表示。 统计从键盘输入一行字符的个数。#include <stdio.h>void main(){int n=0;printf("input a string:\n");while(getchar()!='\n') n++;printf("%d",n);} int n=0;printf("input a string:\n");while(getchar()!='\n')n++;printf("%d",n);    本例程序中的循环条件为getchar()!='\n',其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。  使用while语句应注意以下几点:  1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); while (n--) printf("%d ",a++*2);} int a=0,n;printf("\n input n: ");scanf("%d",&n);while (n--)printf("%d ",a++*2);    本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于(a*2;a++)  2.循环体如包括有一个以上的语句,则必须用{}括起来, 组成复合语句。  3.应注意循环条件的选择以避免死循环。void main(){ int a,n=0; while(a=5)  printf("%d ",n++);} int a,n=0;while(a=5)print......

阅读全文(725) | 评论:0

《C程序设计》第五章第六章算法总结(2006-07-29 01:58:00)

摘要:第五章 选择结构 1. 求闰年    判别某一年year是否为闰年。条件是:    能被4整除,但不能被100整除;能被400整除。    if((year%4==0&year%100!=0)||(year%400)==0)printf("%d is a leap year",year);elseprintf("%d is not a leap year",year);   2. 交换法    空杯原理:要交换a、b杯的水,要借助第三个杯cup,先把a杯的水倒入到cup中,此时a空,再把b杯的水倒入a中,此时b空,最后把cup中的水倒入b杯,这样就实现了a、b杯水的交换。 例1:按代数值由小到大次序输出两个数。 if(a>b) {cup=a;a=b;b=cup;}      例2:求三个数a,b,c由小到大顺序输出。    用交换法,算法是,使最小值赋值给a,第二小赋值给b,最大值赋值给c。    所以a 先与b 比较,如果a>b,就交换它们的值;然后a与c比较,如果a>c就互换。这两个步骤得到a最小。最后比较b和c,如果b>c,就交换它们的值。 if(a>b) {cup=a;a=b;b=cup;}if(a>c) {cup=a;a=c;c=cup;}if(b>c) {cup=b;b=c;c=cup;}   /* 这样,书本上的习题“输入四个整数,要求按由大小顺序输出。”就难不倒你了。 */     第六章 循环控制 1. 累加(循环应用一)    如书本上的例题:1+2+3+……+100    定义两个变量:sum存累加和;i为每一次循环的加数。    变量初始值:sum=0;i=1;    每次循环结束前,要计算下一次i的值。    While(i<=100)    { sum=sum+i; /*sum存累加和*/    ......

阅读全文(2800) | 评论:0

我所理解的归并排序算法(2006-07-29 01:48:00)

摘要:归并排序算法以O(nlogn)最坏情形运行时间运行,而所使用的比较次数几乎是最优的。它可以用递归的形式实现,形式简洁易懂。但是需要注意的是当用递归形式时,如果数据较多,则开销很大,实用性很差,所以我们一般采用非递归的形式。我这里两种形式都给出。      不管是递归还是非递归,归并排序算法中基本的操作是合并两个已经排序的数组。递归形式:template <class T>void MSort(T a[], int left, int right){      if (left < right)      {            int center = (left + right) / 2;            MSort(a, left, center);            MSort(a, center+1, right);            Merge(a, left, center, right, right-left+1);      }}template <class T>void MergeSort(T a[]......

阅读全文(3361) | 评论:0

我所理解的堆排序算法(2006-07-29 01:28:00)

摘要: 我所理解的堆排序算法      堆排序在最坏的情况下,其时间复杂度也能达到O(nlogn)。相对于快速排序来说,这是它最大的优点,此外,堆排序仅需要一个记录大小供交换用的辅助存储空间。      堆排序的数据结构是二叉堆,二叉堆的特点有两个,一个是它是一棵完全二叉树,另一个是它的根结点小于孩子结点,所以我们很容易找到它的最小结点----根结点;当然如果你想找到最大结点的话,那就要扫描所有的叶子结点,这是很费时间的,如果你想找的是最大结点的话,你最好把它弄成一个大顶堆,即一棵根结点大于孩子结点的完全二叉树。      二叉堆通常用数组来实现,它舍弃下标0,从下标1开始置数,则很容易满足,对于数组中任意位置i上的元素,其左儿子的位置在2i上,右儿子的位置在2i+1上,双亲的位置则在i/2上。      堆排序的算法之一是把数组构建成二叉堆----这只要增添一个长度为n+1的辅助空间,然后把原数组的元素依次插入到二叉堆即可。然后删除二叉堆的根,把它作为排序后的数组的第一个元素,然后使二叉堆的长度减1,并通过上移使得新得到的序列仍为二叉堆,再提取新二叉堆的第一个元素到新数组。依此类推,直到提取最后一个元素,新得到的数组就是排序后的数组。template <class T>void Insert(T a[], int len, T x)//把x插入到原长度为len的二叉堆,注意保证新二叉堆不越界{      int i;      for (i=len; i/2>0 && a[i/2]>x; i/=2)            a[i] = a[i/2];      a[i] = x;} template <class T>T DeleteMin(T a[], int ......

阅读全文(2608) | 评论:1