趣味程序设计
有关趣味程序设计的博客
海岛Blog
专注于程序设计及其竞赛,专注于集成电路EDA设计
展开
-
平方取中法随机数函数
平方取中法(midsquare method)是产生[0,1]均匀分布随机数的方法之一,亦称冯·诺伊曼取中法,最早由冯·诺伊曼(John von Neumann,1903-1957)提出的一种产生均匀伪随机数的方法。此法将一个2s位十进制随机数平方后得到的一个4s位数,去头截尾取中间2s位数作为一个新的随机数,重复上述过程可得到一个伪随机数列。 平方取中法是冯·诺依曼提出的。此法开始取一个2s位的整数,称为种子,将其平方,得4s位整数(不足4s位时高位补0),然后取此4s位的中间2s位作为下一个种子数,原创 2021-09-29 14:09:43 · 1858 阅读 · 0 评论 -
I00037 亏数(Deficient number)
数论中,若一个正整数除了本身之外所有因子之和比此数自身小,则称此数为亏数。亏数(Deficient number)也称为缺数,参见百度百科_亏数,或参见维基百科的Deficient number。亏数在OEIS中的数列号为A005100。问题描述:输入n(n≤40000000),计算输出≤n的所有亏数,每个数之间用空格隔开,输出在一行里。问题分析:可以使用筛选法原理计算各个数的因子原创 2016-08-29 11:40:46 · 1959 阅读 · 0 评论 -
I00033 消除游戏
消除游戏是众多游戏中的一种,貌似十分流行。其内部实现也许是程序员们所感兴趣的。问题描述:可以输入多组测试用例,每组测试用例首先输入正整数m和n,分别为矩阵的行和列数,m,n≤1000,然后输入m行n列的正整数数据。将m×n矩阵中行或列连续三个元素同值的变为0。当m和n同时为0时程序结束。问题分析:有各种各样的实现方法。这里采用一种不使用另外存储的做法,需要消除的元素暂时将其值变为负值,原创 2016-08-28 11:04:35 · 1226 阅读 · 0 评论 -
I00034 累加与累乘
这是一个基础练习级的问题,既有累乘问题,又有累加问题。问题描述:输入n(n≤20),计算1+2!+3!+...+n!,输出从1到n的各个和,对于输入的n输出n行,每行包括两个整数,由": "(冒号和空格分割),第1个整数是n,第2个整数是和。问题分析:看似既有加法又有乘法,其实一个循环就够了。累加的初值要设置为0,累乘的初值要设置为1,这是套路。程序说明:(略)。AC的原创 2016-08-28 11:46:58 · 3132 阅读 · 0 评论 -
I00028 整数逆序
把一个整数逆序输出有两种办法。1.使用字符串处理,先将整数转换为字符串,然后将字符串逆序。可以使用I/O函数,将整数值输出到字符串数组中,即转换为字符串,然后再对字符串的前后字符进行对换即可。2.将整数变量中的值逆序。计算机程序中,用10去除整数时,商为10进制右移一位(去掉个位),余数为个位数。重复这样的计算,每次将取出的个位数再拼装成一个整数(原先的低位被拼装到高位),就得到了整数的逆原创 2016-06-18 06:54:20 · 1385 阅读 · 1 评论 -
I00029 C语言程序-打印九九乘法表
这是小时候背的九九乘法表,是中文版,不是数字版,用C语言程序打印出来了。C语言程序如下:/* I00029 C语言程序-打印九九乘法表 */#include #include char *dw[] = {"十", "一", "二", "三", "四", "五", "六", "七", "八", "九", "得", " " };void conver(char t[], in原创 2016-06-19 19:59:23 · 2457 阅读 · 1 评论 -
I00030 Grades conversion
问题:将100分制的成绩转换成"优秀","良好","中等","及格"和"不及格"。一般教科书上,实现成绩转换功能用if语句或switch语句。那是浮云。这里用二次查表法来实现。这样做逻辑简单,程序运行速度快,语句简洁。简单到几乎看不见逻辑语句的程序才是好程序。程序如下:/* I00030 Grades conversion */#include int ma原创 2016-06-26 01:56:37 · 1003 阅读 · 1 评论 -
I00031 Look-and-say sequence
Look-and-say数列是一个有趣的数列。有关介绍参见维基百科的Look-and-say sequence。在OEIS网站上,数列号为A005150。这个程序打印输出Look-and-say数列的前18项。C语言程序如下:/* I00031 Look-and-say sequence */#include #include #define MAXN 100000原创 2016-07-18 17:32:27 · 1465 阅读 · 4 评论 -
I00012 打印三位数的水仙花数及其个数
各个位数的立方数之和等于数本身的数,称为水仙花数。这里使用穷举法打印3位数的水仙花数。程序的关键是如何取出给定数的各个位的值。另外需要注意的一点是,求和变量的初值是零。乘积变量的初值则为1。程序如下:/* 打印三位数的水仙花数及其个数 */#include int main(void){ int sum=0, d1, d2, d3, i;原创 2016-05-12 20:08:05 · 1473 阅读 · 1 评论 -
I00027 Java语言程序-打印九九乘法表
这是小时候背的九九乘法表,是中文版,不是数字版,用Java程序打印出来了。Java源程序如下:package com.elephant.multiply99table;public class Multiply99table { public static String Convert(int digit) { String[] digitWords = { "十", "一"原创 2016-06-17 10:50:02 · 2496 阅读 · 1 评论 -
I00036 盈数(Abundant number)
数论中,若一个正整数除了本身之外所有因子之和比此数自身大,则称此数为盈数。盈数(Abundant number)也称为丰数或过剩数,参见百度百科_盈数,或参见维基百科的Abundant number。亏数在OEIS中的数列号为A005101。问题描述:输入n(n≤40000000),计算输出≤n的所有盈数,每个数之间用空格隔开,输出在一行里。问题分析:可以使用筛选法原理计算各个数的原创 2016-08-29 14:36:15 · 1392 阅读 · 0 评论 -
I00035 完美数(Perfect number)
笛卡尔说:“能找出的完美数是不会多的,好比人类一样,要找一个完美人亦非易事。”数论中,若一个正整数除了本身之外所有因子之和正好等于此数自身,则称此数为完美数。完美数(Perfect Number)也称为完全数或完备数,参见百度百科_完全数,或参见维基百科的Perfect number。完美数在OEIS中的数列号为A000396。问题描述:输入n(n≤40000000),计算输出≤n的所有完...原创 2016-08-28 20:51:58 · 2754 阅读 · 0 评论 -
I00038 自守数(Automorphic number)
如果某个数的平方的末尾几位数等于这个数,那么就称这个数为自守数(Automorphic number),参见百度百科_自守数,或参见维基百科的Automorphic number。自守数在OEIS中的数列号为A003226。问题描述:输入n(n为int类型),计算输出≤n的所有自守数,每个数之间用空格隔开,输出在一行里。问题分析:解决该问题有暴力法(brute force meth原创 2016-08-29 17:17:33 · 1435 阅读 · 0 评论 -
I00014 汉若塔问题的C++程序
代码来自维基教科书:C++ Programming As A Set Of Problems。程序如下: #include void hanoi(int depth, int from, int to, int alternate) { if(depth == 0) { return; } hanoi(depth-1, fr转载 2016-05-18 06:50:14 · 1175 阅读 · 1 评论 -
CCF NOI1008 水仙花数
问题链接:CCF NOI1008 水仙花数。时间限制: 1000 ms 空间限制: 262144 KB题目描述 输入一个三位数n,判断是否为水仙花数,如果是则输出“YES”,不是则输出“NO”。水仙花数:是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)输入 输入一个三位数n。输出原创 2017-04-03 20:14:07 · 2256 阅读 · 0 评论 -
POJ NOI0105-42 画矩形
问题链接:POJ NOI0105-42 画矩形。总时间限制:1000ms内存限制: 65536kB描述根据参数,画出矩形。输入输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。输出输出画出的图形。样例输入7原创 2017-05-10 21:59:13 · 2316 阅读 · 0 评论 -
POJ NOI0101-09 字符菱形
问题链接:POJ NOI0101-09 字符菱形。总时间限制:1000ms内存限制: 65536kB描述给定一个字符,用它构造一个对角线长5个字符,倾斜放置的菱形。输入输入只有一行, 包含一个字符。输出该字符构成的菱形。样例输入*样例输出 * ******** *** *提示来源原创 2017-05-10 21:36:20 · 1779 阅读 · 0 评论 -
POJ NOI0101-08 字符三角形
问题链接:POJ NOI0101-08 字符三角形。总时间限制:1000ms内存限制: 65536kB描述给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形。输入输入只有一行, 包含一个字符。输出该字符构成的等腰三角形,底边长5个字符,高3个字符。样例输入*样例输出 * ********提示来源原创 2017-05-10 21:21:43 · 7538 阅读 · 0 评论 -
I00039 亲密数(Amicable numbers)
一个正整数a的所有正因子之和等于b,b的所有正因子之和等于a,其中因子包括1但不包括本身,且a不等于b,则称a,b为亲密数对。问题描述:输入n(n为int类型),计算输出≤n的所有亲密数对,亲密数对的两个数用“..”连接,例如:220..284,每个亲密数对之间用空格隔开,输出在一行里。问题分析:可以使用筛选法原理计算各个数的因子之和,然后再判定输出。程序说明:数组sum[]中存放除了原创 2016-08-29 21:03:23 · 2840 阅读 · 1 评论 -
I00040 计算1000以内的勾股数
对于三元组,若满足a^2+b^2=c^2,则称该三元组为勾股数。可以假定aa该程序未必是最优的,还可以进行优化,但是对于较小的a、b和c,计算时间可以接受。程序代码如下:/* I00040 计算1000以内的勾股数 */#include #define N 1000int main(void){ int a, b, c; for(a=1; a原创 2016-11-20 23:41:09 · 3677 阅读 · 0 评论 -
I00032 约瑟夫环(Joseph problem)
有关约瑟夫环的介绍,可以参见百度百科的约瑟夫环。程序中假定人数n小于100,输入数据为n和m。其中,n为人数,数到第m个人出局。输出出局人的顺序。输入数据为0和0时程序结束。AC的C语言程序如下:/* I00032 约瑟夫环(Joseph problem) */#include #define MAXN 100#define next(p, n) (p + n) %原创 2016-08-11 11:31:28 · 1314 阅读 · 0 评论 -
I00020 计算卡特兰数函数
卡特兰数是组合数学中的一个重要概念。卡特兰数可以解决以下四种典型的问题:1.括号化问题 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)2.出栈次序问题 一个无穷大堆栈的进栈序列为1,2,3,..n,有多少个不同的出栈序列?3.凸多边形三角划分问题 将一个凸多边形区域分成三角形区域的方法数?原创 2016-06-04 17:52:53 · 2673 阅读 · 3 评论 -
I00023 鸡兔同笼解法二
穷举法是程序员常用的手法,参见《鸡兔同笼》。鸡兔同笼问题是《孙子算经》卷下中的第31题。今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?答曰:雉二十三。兔一十二。一天,老师布置家庭作业,做鸡兔同笼问题。小明不喜欢做复杂计算,回家后开始训练鸡和兔。小明吹一声哨,鸡和兔都抬起一条腿,小明又吹一声哨,鸡和兔又再抬起一条腿,鸡就一屁股坐地下了,兔两腿站立。于是,小明明白了应该怎原创 2016-06-11 20:42:29 · 2196 阅读 · 2 评论 -
I00026 计算数根
什么是数根,请阅读源程序中的注释。人们通常使用10进制,对于一个10进制数整数,用除数10除(/)和取余数(%)运算是常用的运算。这两个运算分别是10进制右移一位运算和取个位数运算,程序中运用十分广泛。给出的源程序一次运行,可以对输入的多个整数计算其数根。程序如下:/* I00026 计算数根 * * 一个数的数根是该数的各个位数字之和。 * 如果得到的和是一位数,那么这原创 2016-06-14 21:00:48 · 1671 阅读 · 1 评论 -
I00008 百鸡问题
这个问题出自《张邱建算经》卷下。百鸡问题通常用试探法来解决,另外的方法是用求不定方程整数解的方法来解决这个问题。试探法程序中,各种参数用宏定义来给定比较合适。如果将本程序用于求解其他问题,只需要修改这些宏定义。有了这个程序,很容易将这些宏定义值改为程序输入。程序中分别用i,j,k表示鸡翁、鸡母和鸡鶵所卖的钱数,从0到最大的可能进行试探。程序如下:/* 百鸡问题:今有鸡翁原创 2016-05-01 19:20:07 · 1454 阅读 · 5 评论 -
I00007 打印菱形字符图案
曾经的计算机,没有显示屏,人们操作计算机时,用打印机记录执行的操作命令。后来有了显示屏,不过最初的显示屏是字符频幕,输出只能是字符。即使是今日,计算机已经进入多窗口图形界面时代,有时程序的输出也依然是字符的。打印菱形程序,关键是有关循环控制,只是控制逻辑多一些。对于输入的n,打印2n-1行的菱形字符图案。程序中需要控制好总行数和每一行的字符。每一行的字符从左到右包括空格(可能是0个原创 2016-05-01 18:15:16 · 3583 阅读 · 1 评论 -
I00006 打印等腰三角形字符图案(底边在下)
曾经的计算机,没有显示屏,人们操作计算机时,用打印机记录执行的操作命令。后来有了显示屏,不过最初的显示屏是字符频幕,输出只能是字符。即使是今日,计算机已经进入多窗口图形界面时代,有时程序的输出也依然是字符的。打印等腰三角形程序,关键是有关循环控制。程序中需要控制好总行数和每一行的字符。每一行的字符从左到右包括空格(可能是0个)、*号字符(若干个)和换行符。程序如下:/* 打原创 2016-04-30 17:55:10 · 2399 阅读 · 2 评论 -
I00005 打印直角三角形字符图案
曾经的计算机,没有显示屏,人们操作计算机时,用打印机记录执行的操作命令。后来有了显示屏,不过最初的显示屏是字符频幕,输出只能是字符。即使是今日,计算机已经进入多窗口图形界面时代,有时程序的输出也依然是字符的。打印直角三角形程序,关键是有关循环控制。程序中需要控制好总行数和每一行的字符。每一行的字符从左到右包括空格(可能是0个)、*号字符(若干个)和换行符。这里给出输出四种直原创 2016-04-30 17:35:07 · 2396 阅读 · 3 评论 -
I00004 贝尔三角形(解法二)
之前的版本使用了一个二维数组来存储贝尔三角形,这个版本则使用了一维数组来存储,技巧要高很多。在组合数合里,贝尔数给出了集合划分的数目,以数学家埃里克·坦普尔·贝尔(Eric Temple Bell)命名,是组合数学中的一组整数数列。有关贝尔三角形,这里重复介绍一下。1.第一行第一项是12.对于n>1,第n行第一项等同第n-1行最后一项。3.对于m,n>1,第n行第m项等原创 2016-04-30 06:48:09 · 3215 阅读 · 0 评论 -
I00003 贝尔三角形
在组合数合里,贝尔数给出了集合划分的数目,以数学家埃里克·坦普尔·贝尔(Eric Temple Bell)命名,是组合数学中的一组整数数列。贝尔三角形类似于杨辉三角,只是其中各个项的计算规则不同。其规则如下:1.第一行第一项是12.对于n>1,第n行第一项等同第n-1行最后一项。3.对于m,n>1,第n行第m项等于它左边和左上方的两个数之和。相对于贝尔三角形,还有贝尔数原创 2016-04-28 11:00:06 · 3000 阅读 · 2 评论 -
I00002 打印九九乘法表
打印九九乘法表,其结果要像口诀一样顺口。程序的关键是有关循环控制问题。#include int main(void){ int i, j; for(i=1; i<=9; i++) { for(j=1; j<=i; j++) { printf("%1d*%1d=%2d ", j, i, i*j); }原创 2016-04-25 20:07:20 · 1080 阅读 · 1 评论 -
I00001 杨辉三角
杨辉三角国际上称为Pascal三角形。杨辉三角与菲波拉契数列也是有关系的,看以下的图就知道了。这里给出来两种方法的实现,一是使用二维数组来存储杨辉三角,二是使用一维数组来存储杨辉三角并且一边计算一边输出结果。使用一维数组作为存储,实现打印杨辉三角,需要的技巧更高一些。本文插图来自维基百科。#include // 使用二维数组的杨辉三角程序void pasc原创 2016-04-25 11:15:16 · 1453 阅读 · 2 评论 -
I00024 出钱买羽
《九章算术》属于算经十书中的一部,是中国古典数学专著。这些经典数学专著中,有许多众所周知的问题。现在是计算机无所不在的时代,那些问题与其用数学方法来解,不如用计算机程序来解。这个时代是计算解决问题的时代。《九章算术》卷第二 粟米的四十五题和四十六题如下:〔四五〕今有出钱六百二十,买羽二千一百翭。欲其贵贱率之,问各几何?答曰:其一千一百四十翭,三翭一钱。其九百六十翭,四翭一钱。〔原创 2016-06-12 22:22:37 · 1709 阅读 · 1 评论 -
I00009 用1生成回文数
这是数学之美系列的一个程序。用1生成回文数是一种办法,1个1到9个1的平方都是回文数,10个1的平方就不是了。程序如下:/* 用1生成回文数 */#include int main(void){ long g=1; int i; for(i=1; i<=9; i++) { printf("%9ld * %-9ld = %ld\n",原创 2016-05-02 10:39:23 · 1106 阅读 · 2 评论 -
I00010 打印1到输入数之间的回文数
对于一个数,要判定它是否是回文数,直观的做法是先判定其最高位(首位)与最低位(最后一位)是否相同,如果不同则不是回文数;如果相同则其掉其做高位和最低位,对剩余的位继续进行判定;如果剩余的位只有一位或零位(即整个数是偶数位)则为回文数。本程序就是基于这样的基本思想进行计算的。本程序通用性强,可以计算1到任意指定数之间的所有回文数。计算回文数还可以用数字字符组合的方法来实现,算法上采用原创 2016-05-06 23:38:38 · 1343 阅读 · 1 评论 -
I00022 孙子定理
问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?答曰:二十三。这个问题用现在的话说就是,有一个数,用3除余2,用5除余3,用7除余2,问该数是多少?该问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题。是一个数学问题,更准确地说是一个数论问题,也是一个经典的数论问题。孙子定理是中国古代求解一次同余式组的方法,是数论四大定理之一,国际上原创 2016-06-10 23:14:56 · 1291 阅读 · 1 评论 -
I00021 有负数项的数列之和
问题:编写函数计算数列前n项之和,数列为1-2+3-4+5-6+7-8+......。这个问题简单,编写一个计算数列之和的函数太容易了。人们通常用计算解决问题,也就是编写程序解决问题。然而,编写程序解决问题,是多解的,即不同的程序可以计算出相同的结果。解决这个问题,编写了3个不同的函数。函数sum1(),遇到整数项则相加,遇到负数项则相减,使用逻辑判定来决定是做相加还是相减,即对于原创 2016-06-10 10:33:22 · 1847 阅读 · 1 评论 -
I00019 生成全8数
这是数学之美系列的一个程序。程序如下:/* 生成全8数 */#include int main(void){ long multinum=0; int i; for(i=8; i>=0; i--) { printf("%8ld*9+%d=%ld\n", multinum, i, multinum * 9 + i); m原创 2016-05-30 08:17:39 · 1148 阅读 · 1 评论 -
I00018 生成全1数
这是数学之美系列的一个程序。程序如下:/* 生成全1数 */#include int main(void){ long multinum=0; int i; for(i=1; i<=10; i++) { printf("%10ld*9+%-2d=%ld\n", multinum, i, multinum * 9 + i);原创 2016-05-30 08:09:23 · 1368 阅读 · 1 评论 -
I00017 生成9开头的按位递减数
这是数学之美系列的一个程序。程序如下:/* 生成9开头的按位递减数 */#include int main(void){ long multinum=1; int i; for(i=1; i<=9; i++) { printf("%9ld*8+%d=%ld\n", multinum, i, multinum * 8 + i);原创 2016-05-30 07:50:25 · 1400 阅读 · 7 评论