博文

人民币大小写转换的程序(2007-04-15 14:00:00)

摘要:原来写过一个,但是有BUG,现在贴一个新的 #include <stdlib.h>
#include <stdio.h>
#include <math.h> int main(void)
{
    double money;
    char pZH[40];
    puts("输入一个数:");
    scanf("%lf", &money);
    double ZH = floor(money);
    gcvt(ZH, 35, pZH);     char *num[10] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    char *RMB[] ={"圆","拾","佰","仟","萬","拾","佰","仟","億", "十", "百", "千", "万", "億"};
    int n = 0;           
    while (pZH[n] != '.')
        n++; 
    n--;
//输出整数部分
    puts("你输入了:");
    int flag = 0;
    int i;
    for (i=0; pZH[i]!='.'; i++, n--)
    {
  ......

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

高精度计算(2007-04-11 14:56:00)

摘要:      前几天写的高精度的基本运算,包括整数和浮点数加减乘除,乘方和整数的阶乘.乘法和除法,以及乘方和阶乘都是以加法为基础,调用了加法的函数.写得很简陋,但是功能还可以,希望各位网友试用,如找到BUG请留言,谢谢!/*用数组存储数字,可以超越数据类型的限制,实现超长整型,高精度基本运算 */ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 200 int Compare(const char *a, const char *b);
void IntAddition(char *augend, char *addend, char *sum);
void IntSubtration(char *minuend, char *subtrahend, char *difference);
void IntMultiplication(char *multiplicand, char *multiplier, char *product);
void IntDivision(char *dividend, char *divisor, char *quotient, char *remainder);
int  Radix(char *toStr, char *fromStr);
void FloatAddition(char *augend, char *addend, char *sum);
void FloatSubtration(char *minuend, char *subtrahend, char *difference);
void FloatMultiplication(char *multiplicand, char *multiplier, char *product);
void FloatDivision(char *dividend, char *divisor, char *quotient, int precision);
void Insert(char s[], int l......

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

看灌水(倒酒)问题有感(2007-04-10 10:37:00)

摘要:昨日在“三思小百科” http://www.oursci.org/ency/math/002.htm看到一篇好文章。该文较详细的介绍了灌水(倒酒)问题的一般解法。根据文章提示的算法,我写了一个程序。
问题和算法简介:
倒水问题的经典形式是这样的:
“假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。”
  当然题外是有一些合理的限制的,比如从池塘里灌水的时候,不管壶里是不是已经有水了,壶一定要灌满,不能和另一个壶里的水位比照一下“毛估估”(我们可以假设壶是不透明的,而且形状也不同);同样的,如果要把水从壶里倒进池塘里,一定要都倒光;如果要把水从一个壶里倒进另一个壶里,也要都倒光,除非在倒的过程中另一个壶已经满了;倒水的时候水没有损失(蒸发溢出什么的)等等等等。
 
算法介绍:“灌水定理”:
“如果有n个壶容积分别为A1,A2,……,An(Ai均为大于0的整数)设w为另一大于0的整数。则用此n个壶可倒出w升水的充要条件为:
 1) w小于等于A1+A2+......+An;
 2) w可被(A1,A2,......,An)(这n个数的最大公约数)整除。”
 这两个条件都显然是必要条件,如果1)不被满足的话,你连放这么多水的地方都没有。2)的道理和上面两个壶的情况完全一样,因为在任何步骤中,任何壶中永远只有(A1,A2,......,An)的倍数的水。

如果A1,A2,……,An是n个整数,(A1,A2,......,An)=s,那么存在整数U1,U2,……,Un,使得
       U1A1 + U2A2 + ...... + UnAn = s.    (*)
在代数学上称此结果为“整数环是主理想环”。
回头看“灌水定理”。w是(A1,A2,......,An)的倍数,根据上节的公式(*),两边乘以这个倍数,我们就有整数V1,V2,……,Vn使得 V1A1 + V2A2 + ...... + VnAn = w.注意......

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

灌水问题——经典智力题推而广(转帖)(2007-04-10 10:36:00)

摘要:原文地址http://www.oursci.org/ency/math/002.htm
倒水问题的经典形式是这样的:

  “假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。”

  当然题外是有一些合理的限制的,比如从池塘里灌水的时候,不管壶里是不是已经有水了,壶一定要灌满,不能和另一个壶里的水位比照一下“毛估估”(我们可以假设壶是不透明的,而且形状也不同);同样的,如果要把水从壶里倒进池塘里,一定要都倒光;如果要把水从一个壶里倒进另一个壶里,也要都倒光,除非在倒的过程中另一个壶已经满了;倒水的时候水没有损失(蒸发溢出什么的)等等等等。

  事实上,要解决上面这题,你只要用两个壶中的其中一个从池塘里灌水,不断地倒到另一个壶里,当第二个壶满了的时候,把其中的水倒回池塘里,反复几次,就得到答案了。以5升壶(A)灌6升壶(B)为例:

     A  B
     0  0 
     5  0  A→B 
     0  5 
     5  5  A→B 
     4  6 
     4  0  A→B 
     0  4 
     5  4  A→B 
     3  6

  现在我们问,如果是多于2只壶的情况怎么办(这样一来就不能用上面的循环倒水法了)?如何在倒水之前就知道靠这些壶是一定能(或一定不能)倒出若干升水来的?试举数例:
  1) 两个壶:65升和78升,倒38升和39升。
  2) 三个壶:6升,10升和45升,倒31升。

  我们可以看到,在1)中,65=5×13,78=6×13,而39=3×13。所以如果把13升水看作一个单位的话(原题中的“升”是没有什么重要意义的,你可以把它换成任何容积单位,毫升,加仑——或者“13升”),这题和最初的题目是一样的。而38升呢?显然是不可能的,它不是13的倍数,而65升和78升的壶怎么也只能倒出13升的倍数来。也可以这样理解:这相当于在原题中要求用5升和6升的壶倒出38/39升来。

  那么2)......

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

平分七筐鱼(2007-03-08 15:57:00)

摘要:甲、乙、丙三位鱼夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有七筐装满了鱼,还有七筐装了半筐鱼,另外七筐则是空的,由于他们没有秤,只好通过目测认为七个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为三份?
*问题分析与算法设计
根据题意可以知道:每个人应分得七个箩筐,其中有3.5筐鱼。采用一个3*3的数组a来表示三个人分到的东西。其中每个人对应数组a的一行,数组的第0列放分到的鱼的整筐数,数组的第1列放分到的半筐数,数组的第2列放分到的空筐数。由题目可以推出:
。数组的每行或每列的元素之和都为7;
。对数组的行来说,满筐数加半筐数=3.5,但为了便于进行关系运算,将其乘以2变成整数7;
。每个人所得的满筐数不能超过3筐;
。每个人都必须至少有1 个半筐,且半筐数一定为奇数
对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的,为了避免出现重复的分配方案,可以规定:甲、乙、丙分到的满筐数依次减少,相应的,分到的半筐数依次增多 * 运行结果
It exists possible distribution plans:
No.1 Full basket Semi--basket Empty
fisher A: 3 1 3
fisher B: 2 3 2
fisher C: 2 3 2
No.2 Full basket Semi--basket Empty
fisher A: 3 1 3
fisher B: 3 1 3
fisher C: 1 5 1 *思考题
晏会上数学家出了一道难题:假定桌子上有三瓶啤酒,癣瓶子中的酒分给几个人喝,
但喝各瓶酒的人数是不一样的。不过其中有一个人喝了每一瓶中的酒,且加起来刚好是一瓶,
请问喝这三瓶酒的各有多少人?
(答案:喝三瓶酒的人数分别是2人、3人和6人) */ #include<stdio.h> int main()
{
 int a[3][3] = {0};//用来存储三个人分得的各种筐的数量,每行表示一个人,每列表示一种筐
 int count = 0; //累计分配方案的数量
 ......

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

精益求精---让你的程序效率更高一些(2007-01-24 16:16:00)

摘要:精益求精---让你的程序效率更高一些 问题背景:
英国大数学家哈代(G.H.Hardy,1877-1947)曾经发现过一种有趣的现象: 153=1^3 + 5^3 + 3^3 371=3^3 + 7^3 + 1^3 370=3^3 + 7^3 + 0^3 407=4^3 + 0^3 + 7^3 他们都是三位数且等于各位数字的三次幂之和,这种巧合不能不令人感到惊讶.更为称奇的是,一位读者看过哈代的有趣发现后,竟然构造出其值等于各位数字四(五,六)次幂之和的四(五,六)位数: 1634=1^4 + 6^4 + 3^4 + 4^4 54748=5^5 + 4^5 + 7^5 + 4^5 + 8^5 548834=5^6 + 4^6 + 8^6 + 8^6 + 3^6 + 4^6 注:3位3次幂回归数又称位“水仙花数” 像这种其值等于各位数字的 n 次幂之和的 n 位数,称为 n 位 n 次幂回归数.本文只讨论这种回归数,故简称为回归数,人们自然要问:对于什么样的自然数 n 有回归数?这样的 n 是有限个还是无穷多个?对于已经给定的 n ,如果有回归数,那么有多少个回归数? 1986年美国的一位数学教师安东尼.迪拉那(Anthony Diluna)巧妙地证明了使 n 位数成为回归数的 n 只有有限个. 设 An 是这样的回归数,即: An=a1a2a3...an=a1^n+a2^n+...+an^n (其中 0<=a1,a2,...an<=9) 从而 10^n-1<=An<=n9^n 即 n 必须满足 n9^n>10^n-1 也就是 (10/9)^n<10n          (1) 随着自然数 n 的不断增大,(10/9)^n 值的增加越来越快,很快就会使得(1) 式不成立,因此,满足(1)的 n 不能无限增大,即 n 只能取有限多个.进一步的计算表明: (10/9)^60=556.4798...<10*60=600  (10/9)^61=618.3109...>10*61=610 对于 n>=61,便有 (10/9)^n>10n 由此可知,使(1)式成立的自然数......

阅读全文(3313) | 评论:2

我所理解的指针和引用(2007-01-24 10:37:00)

摘要:指针和引用的对比 1.  指针存储的内容是其他对象(变量)的地址,使用指针来访问对象的成员函数和成员变量时,要使用“->”操作符;引用是对象(变量)的别名,使用引用来访问对象的成员函数和成员变量时,就像使用对象本身一样,使用“.”操作符。从这个角度来说,使用引用要比指针简洁得多。 2.  引用被创建的同时必须被初始化我们不能创建一个引用,过一会再初始化它(如果是类的话,在构造函数中使用初始化列表初始化);而指针则可以在任何时候被初始化。 3.  引用只能被初始化一次,一旦它们被初始化为一个特定的对象,它们就不能被改变了;指针则可以随时改变所指的对象。从这个意义上来说,引用像const的指针。 4.  不能有NULL引用,引用必须与合法的存储单元关联;指针则可以是NULL。 5.  引用不能像指针那样new或者delete,从这个意义上来说,它们像一个对象。 6.  当调用函数时,按引用或者指针传送比按值传送要节约一大比开支,同时允许改变实参。如果不允许改变实参,请将它们const。一个细微但是很明智的建议,当不允许函数改变某对象是,用const限定的引用就可以了,当需要改变的时候就用指针。 7.  一个好的原则是尽量使用引用,但有些情况下必须使用指针:如果一个对象需要动态创建或者销毁,应当使用指针。此外,指针可以改变指向的对象,指针可以为空,指针可以参与一些数学运算等,都是使用指针的理由。  ......

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

编程语言的昨天、今天和明天(转帖)(2006-12-11 15:25:00)

摘要:编程语言的昨天、今天和明天 要明白计算机语言是怎么回事?它是不是就像我们平常说话那样的语言?计算机语言说白了就是我们与计算机打交道的一套规则而已。按这种规则计算机就能听你的话,否则它只能当你是个外国人,你说什么它都不会理你。
    计算机是靠无数的逻辑电路开开合合来运行的,稍微有些物理常识的人都知道,这些物理元器件根本没有智慧,它们识别的只是高、低电位,用二进制的方法来表示,刚好就是1和0。所有我们发给计算机的指令,以及我们保存在计算机内的数据,都要最终转换成一系列的由0和1组成数字串,计算机才看得明白。这些0与1构成的东东就是我们所说的机器语言。
  直接使用机器语言几乎是不可能的,人们于是用一些特定的符号来代替某些操作,然后由专门的转换程序将这些符号转换为机器语言。这种语言相对于机器语言来说,比较容易记忆和学习,被称为符号语言,或汇编语言。
  我们现在经常所说的编程语言,如VB等等,不属于上面所述的范畴,它们被称为高级语言。在这些语言中我们可以写这样的句子:c=a+b,一看就明白,就是将a与b相加,然后将结果给c,非常方便和自然。高级语言不再是面向机器的了。使用它,人们就不用考虑不同机器内部构造的细节,只需关心希望完成的任务的实现方法。显然,计算机肯定不能直接执行这些语言,这里需要编译程序来作转换工作,将这些语言写成的代码转换成机器指令,然后由计算机来执行。高级语言的出现使得计算机软件开发变得更容易,同时推动了计算机的普及。
  还有一种被称为第四代语言的程序语言,这种语言是非过程的。上面所说的几种语言都是过程化语言,意思就是说你想完成什么任务,怎么完成,加减乘除都需要你一步一步地写清楚。而非过程语言就是你只用说做什么,具体怎么做由它来完成。这种语言的代表就是数据库查询语言SQL。
  在基础知识内我们介绍了计算机语言的分类,实际上就是计算机语言的发展简史,这里着重介绍一下高级语言的发展历史。
  世界上最早出现的高级语言是FORTRAN,它适合于数值计算。对于很多初学者来说,这种语言或许非常陌生,高校也逐渐取消了FORTRAN语言的教学。后来出现了很多高级语言,比较流行的有BASIC、COBOL、PASCAL、PL/1和ADA等等,它们中有些只是用于大型机的。实际上在早期,根本......

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

计算机语言(转帖)(2006-12-11 15:14:00)

摘要:一篇介绍计算机语言比较好的文章!比较全面!现转载如下: 关键词: VF    VC    VB    Delphi    Java                                          

计算机语言

·VF:
  也写作VFP,Visual FoxPro的缩写,Visual在英语中意为“可视的”,Fox意为“狐狸”,原指美国狐狸数据库软件公司,该公司已被微软公司收购。Pro为Progress的略写,意为“更进一层”。Visual
FoxPro是由Microsoft在FoxPro的基础上推出的功能强大、可视化、面向对象的数据库编程语言,同时它也是一种强大的数据库管理系统。

·VC:
  Visual
C++,微软公司高级可视化计算机程序开发语言。C语言被人们称为近十年来对计算机程序设计最大的贡献之一。它有高级语言简单易用的特性,又可以完成汇编语言才能做的许多工作。因此,C语言特别适合用来编写各种复杂软件。如果说BASIC语言是初学者和业余爱好者的编程语言的话
,那么C语言就是专业人员的编程语言了。

·VB:
  Visual Basic的缩写,微软公司高级可视化计算机程序开发语言。BASIC是Beginner’s All-purpose Sybolic Instruction Code(初学者通用符号指令代码)的缩写,从BASIC开始相继推出了Quick BASIC、Ture BASIC等,目前最新的是Microsoft公司推出的Visual
Basic。这是一种功能极强的面向对象的可视化程序设计语言。

·Delphi:
  读音/′delfai/,特尔斐,古希腊城市名,被古希腊人当成世界的中心,因有阿波罗神殿而出名。在电脑英语中指美国宝兰(Borland)公司的一种可视化......

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

计算机语言的发展(转帖)(2006-12-11 15:12:00)

摘要:计算机程序设计语言的发展,经历了从机器语言、汇编语言到高级语言的历程。
1. 机器语言
电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机的语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言,就是机器语言。使用机器语言是十分痛苦的,特别是在程序有错需要修改时,更是如此。而且,由于每台计算机的指令系统往往各不相同,所以,在一台计算机上执行的程序,要想在另一台计算机上执行,必须另编程序,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而运算效率是所有语言中最高的。机器语言,是第一代计算机语言。
2. 汇编语言
为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。
3. 高级语言
从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种这样的语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,1 9 5 4年,第一个完全脱离机器硬件的高级语言—F O RT R A N问世了,4 0多年来,共有几百种高级语言出现,有重要意义的有几十种。
6 0年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是人自为战,缺乏科学规范的系统规划与测试、评估标准,其恶果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可靠,以致几乎没有不出错的软件。这一切,极大地震动了计算机界,史称“软件危机”。人们认识到:大型程序的编制不同于写小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。程序的设计应易于保证正确性,也便于验证正确性。1 9 6 9年,提出了结构化程序设计方法,1 9 7 0年,第一个结构化程序设计语言—P a ......

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