本来是有个问题,如何在HTML中只使用一个table(也就是不能嵌套table,不使用div)的情况下,一个table有N行,每行的列数与对应的行的位置是相同的(也就是1行有1列,第2行有两列,依次类推,第N行有N列),要求每行中的每列都平均分割显示。
当时一下子没有想起来,以为通过colspan加width可以实现,后来发现不对。只好用一个相对愚蠢的方式,也就是算出1到N之间的最小公倍数,然后对于每行,在除以行数,就得出colspan的值,从而实现这个问题。比如说有6行,它们的最小公倍数是2*5*6也就是60,那么第1行就是colspan=60, 第2行就是colspan=30, 第3行就是colspan=20,第4行就是colspan=15, 第5行就是colspan=12, 第6行就是colspan=10. 这样也就可以实现上述问题,当然了,这种方法是在N不会太大的情况下,否则最小公倍数是会溢出的。
不过这个问题给我另外一个思考,如果N未定,但有限(比如不会溢出),那么如何比较快速有效地找到一系列连续自然数的最小公倍数?这种高效,本人希望是不仅对计算机而言,更对人而言。比如说通过数相乘然后除以下一个自然数,模数为0的忽略,不为0的再累积乘的方式,对计算机而言是快速的,但是对人而言就是复杂的了(每次计算一个大数除以一个较小数都比较麻烦)。
虽然想到下面这个简单的算法,个人认为不算那么高效(因为需要对合数进行分解)。
1. 对于每个数,如果是素数,则一定是最小公倍数的构成,参与计算。如果是合数,则分解成一组素数。
2. 对于每个素数,都有一个类似map的结构(这种结构不仅仅是指语言的中map,而是类似的二维表),key为素数,value为素数出现的次数(可以是出现在自然数列中的,也可以是由合数分解出来的)。
3. 如果合数分解出的素数组存在于map中(key=素数,value>=分解的素数次数),则该合数不参与计算中。
呵呵,有兴趣的朋友可以讨论讨论,提提自己的想法。
----2009-10-27补充----
昨天吃完饭散步的时候,突然把三楼elmar的数学原理想通了,其实一点都不难。我们知道任何合数都可以分解成两个或以上素数,因为合数本身是需要在连续数列范围中,那么分解出来的素数的乘积自然也必小于连续数列的最大边界数,又可以知道,由最小素数的幂次方肯定是最小值(也就是a<b<c, abc均为自然数, a*a*a<a*b*c),所以也就有了三楼列出的算法了。
简单表述下,就是:
1. 找出一段连续自然数列中的所有素数。
2. 循环这个有序的素数数组,计算每个素数不大于自然数列中最大值的幂,然后累积相乘(这里有个优化,当某个下标的素数的平方已经开始大于最大值时,改下标及其后续素数均不需要在进行重复检查计算)
顺便回到这个题目的最初原因,去构造这样一个表格,如果准确的话,其实这个N是必须小于9的,也就是最多是8,如果N为9,其最小公倍数将超过1000(9和10,均为2520),这样的colspan大部分浏览器不识别(包括IE, FIREFOX, google chrome)。当然了,可以近似地完成后续(至少从界面上看不出太多差别)
分享到:
相关推荐
编写一个方法,求两个自然数的最大公约数和最小公倍数 c#
用C#编程求两个自然数的最大公约数和最小公倍数
//该代码描述了怎样求1到20的最小公倍数 #include using namespace std; int main() { int a[21]; for (int i = 0; i ; i++) { a[i] = i; } for (int i = 4; i ; i++) { for (int j = 2; j ; j++) { ...
1. Java不同数据类型变量的使用 ①定义不同的字符变量,依次给这些变量赋值:’A’,’2’,’猫’,’b’并输出结果;...2. 计算最小公倍数和最大公约数 ①定义两个整型变量m,n; ②计算最大公约数; ③最小公倍数;
[终稿]任何一个自然数都是他与1的最小公倍数.pdf
我想找到一组超过两个数字的最小公倍数。 Matlab 内置的 lcm 函数没有这个功能。 它接受两个整数输入,但不能处理更多。 所以我写了lcms。 lcms 使用质因数分解方法来确定一组数字的最小公倍数。 这很简单。 z = ...
输入两个正整数m和n,求其最大公约数和最小公倍 数。
写一个程序,对于给定的一个自然数N(1),和M个互不相同的十进制数字X1, X2,…,XM (M>=1), 找出N的一个最小的正倍数,使得该倍数中仅包含数字X1,X2,…,XM。 【输入形式】 输入文件为当前目录下的...
matlab求1-N自然数累加和。子函数形式,直接调用可在命令窗口输出结果。 文档里面也有注释,方便学习。有不懂的同仁可联系.
主要介绍了使用Java代码进行因数分解和求最小公倍数的示例,都是基于最基础的算法原理实现,需要的朋友可以参考下
C语言程序设计-求一个n位自然数的各位数字的积;(n 是小于10的自然数).c
最大公约数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
最小公倍数:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个。 代码如下:/// <summary>/// 最大公约数/// </summary>/// ”a”></param>/// ”b...
2120 - 连续自然数和
递归求前25个自然数的和.cpp
有4个连续的自然数,他们的乘积是3024,请用scratch编写程序,找到这4个数字。这是个简单的实例,可以很好的把四个自然数计算出来,可以用于学习参考。
求100之内自然数中最大的能被17整除的数.doc
给定一个整数n,求出所有连续的且和为n正整数。比如对于整数27,结果为2~7、8~10、13和14,因为这些数之间的整数的和都是27。注意:并不是所有的整数都有结果,例如不存在连续的整数和为16。为了提高计算的效率,...
求和
输入一个自然数n,求1~n之间的所有自然数之和。