用一个有理数表示三个有理数

时间:2022-06-24 10:18:30
如何将三个有理数变成一个有理数,并且可以从这个有理数还原成原来的那三个有理数。

用算法来描述,就是求两个算法:T1、T2,

算法T1:输入:有理数 A、B、C
    输出:有理数 Q

算法T2:输入:有理数 Q
    输出:有理数 A、B、C

要求T1的输出经过T2的计算后还原为T1的输入。

我已经解决了这个问题,现在写出来考考大家。:)

78 个解决方案

#1


很有意思的问题!

#2


在精度不变的情况下没有误差,没有可能。否则.rar文件还能再压缩成原来的1/3

#3


在精度不变的情况下没有误差,我就做到了。和“.rar文件还能再压缩成原来的1/3”没有关系。

#4


这个问题其实就是说 在 Q^3 和 Q之间找一个一一的映射
由于 Q^3 和Q 都是可数集,所以这个映射必定存在

#5


其实也不要说是 Q^3 ,就是Q^n 也对的
也就是说 楼主即使把 A、B、C改成 A1,A2,....,An
这两个变化还是能够被找到的

#6


好题

#7


在精度限制(比如double是16位有效数)的情况下:
假设为每个数最多是1位
3个数则有3位,要使3位的数通过某种关系与另一个1位的数对应,
3位的数有8种可能性,1位的数有两种可能性,则至少有6个数不1位的数确定

讲了那么多话,简言之就是 容斥原理。

如果允许有误差的话可以用Hopfield联想记忆网络,从Q联想到A,B,C就可以了。

#8


- - 刚发现进错房间了,以为是在c++版块,既然是学术讨论自然是无精度限制了 @_@

#9


这个问题其实就是说 在 Q^3 和 Q之间找一个一一的映射
由于 Q^3 和Q 都是可数集,所以这个映射必定存在

其实也不要说是 Q^3 ,就是Q^n 也对的
也就是说 楼主即使把 A、B、C改成 A1,A2,....,An
这两个变化还是能够被找到的

--------------------------------------------------------------------
galois_godel() 分析得相当透彻,原命题对有限个有理数也是成立的。
不过根据我的原题,不要求是一一映射,只要是 Q^n 到 Q 之间的可逆映射就够了。

#10


不过这里的学术讨论也是建立在计算机的基础上的,如果不考虑精度问题的话,任意数字都可以表示n个数字,只要你写出n个函数就行了

#11


在精度不变的情况下没有误差,我就做到了。和“.rar文件还能再压缩成原来的1/3”没有关系
=====================================================
如果能够用1个数表示3个数,而且精度不变的话,肯定就可以把rar文件(任何一种文件都可以)用你说的这种算法压缩到原来的1/3,因为把rar文件里面的每三个一定长度的字节当成三个数,就可以用一个数字来表示,而这个数字和原来数字的精度相同,所以应该是能够用同样长度的数据来表示,所以就压缩到了原来的1/3了

#12


我理解的精度不变的意思是不损失有理数精度,比如说1/3就是1/3,而不是用0.33333333333333333333...来表示,小数点后面有多少位都不行。

我说的有理数是数学上的有理数,而不是计算机中的浮点数。

诚如galois_godel()分析的那样可以把n个有理数用一个有理数来表示,这与文件的压缩没有关系。否则的话,要是取n=1000000,岂不是可以把文件压缩到原来的百万分之一了?

#13


不过这里的学术讨论也是建立在计算机的基础上的,如果不考虑精度问题的话,任意数字都可以表示n个数字,只要你写出n个函数就行了

-----------------------------------------------------------------------
To: arrowcy(长弓手),请理解原命题的意思。我的意思是我已经写出了符合要求的算法T1、T2,你如果也得出了T1、T2,请贴出来。

#14


很有意思
一时还没思路

#15


不知对效率的要求高不高?还是仅要求可行?
还有 A,B,C 是否有序?

#16


算法T2输出的 A,B,C 要求是和算法T1输入的 A,B,C 是相同顺序的。

把算法在纸上写出来就行,不要求用计算机程序实现,因为实际的计算机所能存储的数的大小和精度是有限的,而我们在这里研究的是理论上的有理数。

我实现的算法T1、T2的效率很好,把算法写在纸上,用手算就可以算得出来。

#17


我的一点不成熟想法:

自然数:
 1  2  6  7 15 16 28 29
 3  5  8 14 17 27 30
 4  9 13 18 26 31
10 12 19 25 32
11 20 24 33
21 23 34
22 35
36
...

有理数:
1/1 1/2 1/3 1/4 1/5 1/6 1/7
2/1 2/2 2/3 2/4 2/5 2/6
3/1 3/2 3/3 3/4 3/5
4/1 4/2 4/3 4/4
5/1 5/2 5/3
6/1 6/2
7/1
...

建立有理数到自然数的函数:
f(a/b) => n
建立自然数到有理数的函数:
  t(n) => a/b

T1: Q=f(f(f(A)/f(B))/f(C))

T2: C=t(t(Q)的分母)
    x=t(t(Q)的分子)
    B=t(t(x)的分母)
    A=t(t(x)的分子)

一定还有更好的

#18


设 abs(A) = p1/q1, abs(B) = p2/q2, abs(C) = p3/q3, 
令 p4 = (sign(A)+2)*100 + (sign(B)+2)*10 + sign(C)+2
令 D 是不小于 max(p1, q1, p2, q2, p3, q3, p4) + 1 的最小素数。
令 E = p4 + p3 * D + q3 * D^2 + p2 * D^3 + q2 * D^4 + p1 * D^5 + q1 * D^6
令 F = E/D
则 F 为所求的有理数。

#19


To: microblue(microblue)
令 p4 = (sign(A)+1)*9 + (sign(B)+1)*3 + (sign(C)+1) + 1
岂不更好?

补充一下:
sign(x) = -1, 如果 x < 0
        =  0, 如果 x = 0
        =  1, 如果 x > 0

#20


To: mmmcd(超超)
想法很好。把“/”改成“,”似乎更合适,因为在
T1: Q=f(f(f(A)/f(B))/f(C))
中不能进行约分,否则就糟糕了。


建立(a,b)到自然数的函数:
f(a,b) => n
建立自然数到(a,b)的函数:
  t(n) => (a,b)

T1: Q=f(f(f(A),f(B)),f(C))

T2: C=t(t(Q)的b)
    x=t(t(Q)的a)
    B=t(t(x)的b)
    A=t(t(x)的a)

#21


其实我做出的算法是:

“用一个自然数表示有限个有理数”

见:http://blog.skyiv.com/more.asp?name=air&id=50

#22


很简单,参考计算机表示有理数的方法把这N个数转换成固定长度的数据
然后拼到一起,直接转换成最终的结果就OK了

#23


没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!

#24


有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的

#25


to happy__888([顾问团]寻开心):
|-
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
-|

那你怎么逆运算回去阿?

#26


不过 happy__888([顾问团]寻开心) 的想法可以转换为 一个编码过程

设定T1算法就是对3个数进行编码,编码用到的字符集只能是'0'-'9',得到一个大数
T2就是解码过程

...

#27


其实这里面存在的是两类对应关系

在大学数学系的《实变函数与泛函分析》课程当中有提到这两类关系

第1类 有理数和自然数的对应关系
  
第2类 多维自然数和自然数之间的对应关系

其实这两类就是超超表示的关系
他的第一个示例就是 多维和一维之间如何建立一一对应关系,他给的例子实二维和一维之间的关系
第二个例子就是有理数和自然数之间的对应关系

利用第一类关系,每个有理数都有了一个自然数和它对应
按照第二类关系,类似可以建立起三维数组和自然数之间的对应关系,
这样就完整的解决了问题了。

其实完全可以扩展到一个整数和N个自然数的一一对应关系的

#28


在数学上,只是可数集之间的一一对应关系的建立方法而已

#29


在数学上,能够和自然数集合建立一一对应关系的集合都成为可数集合

1 首先自然数是可数集合,这个很显然的,自然数到自然数之间必然是有限的集合
2 整数也是可数集合, 下面就是整数和自然数集合之间的一种对应关系
   ... -5 -4  -3  -2  -1  0  1  2  3  4  5 ....
   ... 10  8   6   4   2  0  1  3  5  7  9 ....
3 自然数组成的二维数组也是可数集合 {x,y | x, y 属于 N }
      0  1  2  3  4  ......
   0  0  1  3  6 10
   1  2  4  7  11
   2  5  8  12
   3  9  13
   4  14
  从这个表当中,任意给出一个点对,比如(2,3), 可以找到一个自然数和他对应,比如12。
4 多维的自然数组成的集合也是可数的集合
  利用二维变一维的方法,每次减少一个维数了。

5 有理数是可数的集合
  因为有理数可以表示成为二维的点对,有理数可以分解成为两个整数的除法,而且是一一对应的

显然,楼主的问题,可以利用,有理数是可数集合的办法,找到每个有理数对应的自然数
多个有理数,三个,对应的是三维的数组,利用多维到一维的办法,自然还可以找到一个唯一的自然数和他对应的

注意前面描述的对应关系都是一一对应的,因此这个答案自然也是存在的。
这个是从数学理论上解决这个问题的办法

10多年没有看,这个《实变函数与泛函分析》的书了,也记忆得不太清楚
详细的定义,还是建议看那本书去吧

和可数集合对应的是不可数集合,比如无理数集合
还有比无理数集合更高等级的集合,比不可数还不可数的集合,好像叫做无穷集合吧,忘记了。

#30


续上面我的发言:

举个例子,设有3个有理数为:

1/2,2/3,-3/4

将此数作为一个字符串,S:

"1/2,2/3,-3/4"

然后进行编码,不妨就用ASCII码:

  /   ,   -   0   1   2   3   4   5   6   7   8   9  

 64  39  45  48  49  50  51  52  53  54  55  56  57

则整个串 S 的代码是:C = “49645039 ...3945516452”

显然,此编码是一个整数,自然也是一个有理数, 这样就说明三个有理数可以变成一个有理数。

反之,从这个有理数很容易分离出每一位ASCII码:

   49  64  50  39  ... 39  45  51  64  52

由此可知每一个符号为:

   1   /   2   ,  ...  ,  -   3   /   4

这样,就可以得到原来的3个有理数了:1/2,...,-3/4                  

#31


本质上就是:任何信息可以用数字来编码!

#32



可以推广为:
 
   任何n个有理数都可以变成一个有理数,并且可以从这个有理数还原成原来的那n个有理数。

#33


zzwu的说法,和我原来的a/b串连成ab的说法都是另类的解决办法

但是,都存在一个没有明确说明的问题: 如何分割这几个数字的问题,必须有特殊的地方来分开
串起来容易,再拆开的依据是什么
当然我们可以定义各种方法,比如仿照字符串的方法,前面用一个数表示每个子串的长度

#34


如果存在这样的方法,可以分割整数到不同的字符串,这个分割符号必然是占位的
这样,对于整个数的长度来说,就有了影响,这个数字除了组成它的各个有理数之外
还包含了’额外‘的分隔符
这样的效果,看起来是没有用一一映射关系建立起来的结果完美。

#35



分开数的地方就是逗点啊!

它的代码绝对不会和0-9十个数字的代码还起来的.

#36


将此数作为一个字符串,S:
"1/2,2/3,-3/4"
然后进行编码,不妨就用ASCII码:
  /   ,   -   0   1   2   3   4   5   6   7   8   9  
 64  39  45  48  49  50  51  52  53  54  55  56  57
则整个串 S 的代码是:C = “49645039 ...3945516452”
显然,此编码是一个整数,自然也是一个有理数, 这样就说明三个有理数可以变成一个有理数。
反之,从这个有理数很容易分离出每一位ASCII码:
   49  64  50  39  ... 39  45  51  64  52
---------------------------------------------------------------------------------
zzwu(未名)的方法很好,是我所见过的最简单的方法,适用有限个有理数,还原也非常简单,每两位数一断,然后作为ASCII码解释成字符串就可以了。

佩服!

#37


0   1   2   3   4   5   6   7   8   9   /   ,   - 
   0   1   2   3   4   5   6   7   8   9  10  11  12
当然,也可以如上编码,当作13进制数来看。
只不过编码时要把13进制整数换算成10进制整数,解码时又要把10进制整数换算成13进制整数,比较麻烦,还是zzwu(未名)原来的方法(其实可以看作是100进制)来得快速直观。


#38


没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!
-----------------------------------------------------------------------------
zzwu(未名)这句话问得好,抓住了问题的本质。

#39


还以为楼主纯粹是从计算上玩把戏~~

#40


只要不嫌位数太长,只要3个有理数的最大位数是预知的,就容易办。
如:知道A、B、C的分数表示时,分子分明都最多50位,用100位可以表示A、B、C的每一个。
把三个机械的拼起来,就是一个300位的Q。拆也很好拆啊。

换句话说,把3个数都化为分数形式,对分子分母的前面补0,使得所有分子分母的位数等于其中3个分子和3个分母之中最长的一个,然后机械的拼起来。

不一定高效,但简单。

例子:   A=1/3       B=2/17       C=44/7897
补0后:  A=00010003  B=00020017   C=0044/7897
得到Q:   Q=000100030002001700447897

要从Q得到A、B、C也容易,等拆6等分,分别是每个的分子分母。

我只是举例说明,实际中可以化为二进制后的位数。最前面的0可以去掉,那么还原的时候就要将位数补为6的整数倍,然后就得到该怎么拆了。

#41


只要不嫌位数太长,只要3个有理数的最大位数是预知的,就容易办。
如:知道A、B、C的分数表示时,分子分明都最多50位,用100位可以表示A、B、C的每一个。
把三个机械的拼起来,就是一个300位的Q。拆也很好拆啊。

换句话说,把3个数都化为分数形式,对分子分母的前面补0,使得所有分子分母的位数等于其中3个分子和3个分母之中最长的一个,然后机械的拼起来。

不一定高效,但简单。

例子:   A=1/3       B=2/17       C=44/7897
补0后:  A=00010003  B=00020017   C=0044/7897
得到Q:   Q=000100030002001700447897

要从Q得到A、B、C也容易,等拆6等分,分别是每个的分子分母。

我只是举例说明,实际中可以化为二进制后的位数。最前面的0可以去掉,那么还原的时候就要将位数补为6的整数倍,然后就得到该怎么拆了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
其实也可以变成一个分式,请看这个例子,
例如:25,-4/7,-55/56
变为:025104155/001007056
就是原数的各个分子或分母合并到新数的分子或分母中,其中
用0表示正数,1表示负数,就是每个原数的分子或分母都增加一位符号位。
并且使各个原数的分子或分母个数相同,不同的用零补全。
恢复时只要注意一下符号位就行拉

#42


忘了符合位了,那就多补一位吧,0表示正,1表示负,如下:

例子:   A=-1/3       B=2/17        C= 44/7897
补0后:  A=1000100003  B=0000200017   C=0004407897
得到Q:   Q=1000100003000002000170004407897

#43


我觉得大家没有从问题的本意上去考虑它

这个问题的核心就是不引入分隔符号

否则,这样的问题的答案多如牛毛了

比如:
把表达3个有理数的6个整数串连起来,中间加入分割符号,组成字符串,当成二进制来理解就可以了

可是这样的做法,你得到的是什么,你还可以认为它是原来的问题域当中的整数吗

#44


楼上的,你没看清楚吧?

#45


三个有理数,不用分隔号,是不可能区分出它们来的.例如: 1/234/455/666

是 1/2 34/456 7/666 呢?

还是 1/23 4/45 67/666 呢?

或者还是 1/2 34/45 5/666 呢? 等等

#46


3.14000000000000000000...
0.06150000000000000000...
5.00000000000000000000...

==>

305.1004600100500000000000000000000000000...

这里,只考虑非负有理数(亦可包括非负实数),如果把负有理数(实数)也考虑进去,在首位加一个8bits信息量的符号位即可。

#47


用无穷位来表示吗?这样一来无理数也可以3合1了!

#48


你这样还不行,因为怎样来表示大整数呢?比如
X=11111111111111...
Y=0.0000000000001...
Z=3333333333.333333333...


#49


to  zzwu(未名) :
  你是误会楼主的意思了。
--------------------------------------------------------
    3个有理数               转化为一个有理数之后是
--------------------------------------------------------
 X      Y      Z              F
--------------------------------------------------------
1/2   34/456  7/666         000100020034045600070666
1/23  4/45    67/666        000100230004004500670666
1/2   34/45   5/666         000100020034004500050666
--------------------------------------------------------

怎么可能分不出来呢?
没用分隔号啊。

F的数字串平均分成六段,分别是分子分母了嘛,真是。

--------------------------------------------------------

#50


TO cuixiping(无心):

我不是对你的问题,而是针对 Kusk(Kusk) 的方法提问,

没有讲清,抱歉!





#1


很有意思的问题!

#2


在精度不变的情况下没有误差,没有可能。否则.rar文件还能再压缩成原来的1/3

#3


在精度不变的情况下没有误差,我就做到了。和“.rar文件还能再压缩成原来的1/3”没有关系。

#4


这个问题其实就是说 在 Q^3 和 Q之间找一个一一的映射
由于 Q^3 和Q 都是可数集,所以这个映射必定存在

#5


其实也不要说是 Q^3 ,就是Q^n 也对的
也就是说 楼主即使把 A、B、C改成 A1,A2,....,An
这两个变化还是能够被找到的

#6


好题

#7


在精度限制(比如double是16位有效数)的情况下:
假设为每个数最多是1位
3个数则有3位,要使3位的数通过某种关系与另一个1位的数对应,
3位的数有8种可能性,1位的数有两种可能性,则至少有6个数不1位的数确定

讲了那么多话,简言之就是 容斥原理。

如果允许有误差的话可以用Hopfield联想记忆网络,从Q联想到A,B,C就可以了。

#8


- - 刚发现进错房间了,以为是在c++版块,既然是学术讨论自然是无精度限制了 @_@

#9


这个问题其实就是说 在 Q^3 和 Q之间找一个一一的映射
由于 Q^3 和Q 都是可数集,所以这个映射必定存在

其实也不要说是 Q^3 ,就是Q^n 也对的
也就是说 楼主即使把 A、B、C改成 A1,A2,....,An
这两个变化还是能够被找到的

--------------------------------------------------------------------
galois_godel() 分析得相当透彻,原命题对有限个有理数也是成立的。
不过根据我的原题,不要求是一一映射,只要是 Q^n 到 Q 之间的可逆映射就够了。

#10


不过这里的学术讨论也是建立在计算机的基础上的,如果不考虑精度问题的话,任意数字都可以表示n个数字,只要你写出n个函数就行了

#11


在精度不变的情况下没有误差,我就做到了。和“.rar文件还能再压缩成原来的1/3”没有关系
=====================================================
如果能够用1个数表示3个数,而且精度不变的话,肯定就可以把rar文件(任何一种文件都可以)用你说的这种算法压缩到原来的1/3,因为把rar文件里面的每三个一定长度的字节当成三个数,就可以用一个数字来表示,而这个数字和原来数字的精度相同,所以应该是能够用同样长度的数据来表示,所以就压缩到了原来的1/3了

#12


我理解的精度不变的意思是不损失有理数精度,比如说1/3就是1/3,而不是用0.33333333333333333333...来表示,小数点后面有多少位都不行。

我说的有理数是数学上的有理数,而不是计算机中的浮点数。

诚如galois_godel()分析的那样可以把n个有理数用一个有理数来表示,这与文件的压缩没有关系。否则的话,要是取n=1000000,岂不是可以把文件压缩到原来的百万分之一了?

#13


不过这里的学术讨论也是建立在计算机的基础上的,如果不考虑精度问题的话,任意数字都可以表示n个数字,只要你写出n个函数就行了

-----------------------------------------------------------------------
To: arrowcy(长弓手),请理解原命题的意思。我的意思是我已经写出了符合要求的算法T1、T2,你如果也得出了T1、T2,请贴出来。

#14


很有意思
一时还没思路

#15


不知对效率的要求高不高?还是仅要求可行?
还有 A,B,C 是否有序?

#16


算法T2输出的 A,B,C 要求是和算法T1输入的 A,B,C 是相同顺序的。

把算法在纸上写出来就行,不要求用计算机程序实现,因为实际的计算机所能存储的数的大小和精度是有限的,而我们在这里研究的是理论上的有理数。

我实现的算法T1、T2的效率很好,把算法写在纸上,用手算就可以算得出来。

#17


我的一点不成熟想法:

自然数:
 1  2  6  7 15 16 28 29
 3  5  8 14 17 27 30
 4  9 13 18 26 31
10 12 19 25 32
11 20 24 33
21 23 34
22 35
36
...

有理数:
1/1 1/2 1/3 1/4 1/5 1/6 1/7
2/1 2/2 2/3 2/4 2/5 2/6
3/1 3/2 3/3 3/4 3/5
4/1 4/2 4/3 4/4
5/1 5/2 5/3
6/1 6/2
7/1
...

建立有理数到自然数的函数:
f(a/b) => n
建立自然数到有理数的函数:
  t(n) => a/b

T1: Q=f(f(f(A)/f(B))/f(C))

T2: C=t(t(Q)的分母)
    x=t(t(Q)的分子)
    B=t(t(x)的分母)
    A=t(t(x)的分子)

一定还有更好的

#18


设 abs(A) = p1/q1, abs(B) = p2/q2, abs(C) = p3/q3, 
令 p4 = (sign(A)+2)*100 + (sign(B)+2)*10 + sign(C)+2
令 D 是不小于 max(p1, q1, p2, q2, p3, q3, p4) + 1 的最小素数。
令 E = p4 + p3 * D + q3 * D^2 + p2 * D^3 + q2 * D^4 + p1 * D^5 + q1 * D^6
令 F = E/D
则 F 为所求的有理数。

#19


To: microblue(microblue)
令 p4 = (sign(A)+1)*9 + (sign(B)+1)*3 + (sign(C)+1) + 1
岂不更好?

补充一下:
sign(x) = -1, 如果 x < 0
        =  0, 如果 x = 0
        =  1, 如果 x > 0

#20


To: mmmcd(超超)
想法很好。把“/”改成“,”似乎更合适,因为在
T1: Q=f(f(f(A)/f(B))/f(C))
中不能进行约分,否则就糟糕了。


建立(a,b)到自然数的函数:
f(a,b) => n
建立自然数到(a,b)的函数:
  t(n) => (a,b)

T1: Q=f(f(f(A),f(B)),f(C))

T2: C=t(t(Q)的b)
    x=t(t(Q)的a)
    B=t(t(x)的b)
    A=t(t(x)的a)

#21


其实我做出的算法是:

“用一个自然数表示有限个有理数”

见:http://blog.skyiv.com/more.asp?name=air&id=50

#22


很简单,参考计算机表示有理数的方法把这N个数转换成固定长度的数据
然后拼到一起,直接转换成最终的结果就OK了

#23


没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!

#24


有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的

#25


to happy__888([顾问团]寻开心):
|-
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
-|

那你怎么逆运算回去阿?

#26


不过 happy__888([顾问团]寻开心) 的想法可以转换为 一个编码过程

设定T1算法就是对3个数进行编码,编码用到的字符集只能是'0'-'9',得到一个大数
T2就是解码过程

...

#27


其实这里面存在的是两类对应关系

在大学数学系的《实变函数与泛函分析》课程当中有提到这两类关系

第1类 有理数和自然数的对应关系
  
第2类 多维自然数和自然数之间的对应关系

其实这两类就是超超表示的关系
他的第一个示例就是 多维和一维之间如何建立一一对应关系,他给的例子实二维和一维之间的关系
第二个例子就是有理数和自然数之间的对应关系

利用第一类关系,每个有理数都有了一个自然数和它对应
按照第二类关系,类似可以建立起三维数组和自然数之间的对应关系,
这样就完整的解决了问题了。

其实完全可以扩展到一个整数和N个自然数的一一对应关系的

#28


在数学上,只是可数集之间的一一对应关系的建立方法而已

#29


在数学上,能够和自然数集合建立一一对应关系的集合都成为可数集合

1 首先自然数是可数集合,这个很显然的,自然数到自然数之间必然是有限的集合
2 整数也是可数集合, 下面就是整数和自然数集合之间的一种对应关系
   ... -5 -4  -3  -2  -1  0  1  2  3  4  5 ....
   ... 10  8   6   4   2  0  1  3  5  7  9 ....
3 自然数组成的二维数组也是可数集合 {x,y | x, y 属于 N }
      0  1  2  3  4  ......
   0  0  1  3  6 10
   1  2  4  7  11
   2  5  8  12
   3  9  13
   4  14
  从这个表当中,任意给出一个点对,比如(2,3), 可以找到一个自然数和他对应,比如12。
4 多维的自然数组成的集合也是可数的集合
  利用二维变一维的方法,每次减少一个维数了。

5 有理数是可数的集合
  因为有理数可以表示成为二维的点对,有理数可以分解成为两个整数的除法,而且是一一对应的

显然,楼主的问题,可以利用,有理数是可数集合的办法,找到每个有理数对应的自然数
多个有理数,三个,对应的是三维的数组,利用多维到一维的办法,自然还可以找到一个唯一的自然数和他对应的

注意前面描述的对应关系都是一一对应的,因此这个答案自然也是存在的。
这个是从数学理论上解决这个问题的办法

10多年没有看,这个《实变函数与泛函分析》的书了,也记忆得不太清楚
详细的定义,还是建议看那本书去吧

和可数集合对应的是不可数集合,比如无理数集合
还有比无理数集合更高等级的集合,比不可数还不可数的集合,好像叫做无穷集合吧,忘记了。

#30


续上面我的发言:

举个例子,设有3个有理数为:

1/2,2/3,-3/4

将此数作为一个字符串,S:

"1/2,2/3,-3/4"

然后进行编码,不妨就用ASCII码:

  /   ,   -   0   1   2   3   4   5   6   7   8   9  

 64  39  45  48  49  50  51  52  53  54  55  56  57

则整个串 S 的代码是:C = “49645039 ...3945516452”

显然,此编码是一个整数,自然也是一个有理数, 这样就说明三个有理数可以变成一个有理数。

反之,从这个有理数很容易分离出每一位ASCII码:

   49  64  50  39  ... 39  45  51  64  52

由此可知每一个符号为:

   1   /   2   ,  ...  ,  -   3   /   4

这样,就可以得到原来的3个有理数了:1/2,...,-3/4                  

#31


本质上就是:任何信息可以用数字来编码!

#32



可以推广为:
 
   任何n个有理数都可以变成一个有理数,并且可以从这个有理数还原成原来的那n个有理数。

#33


zzwu的说法,和我原来的a/b串连成ab的说法都是另类的解决办法

但是,都存在一个没有明确说明的问题: 如何分割这几个数字的问题,必须有特殊的地方来分开
串起来容易,再拆开的依据是什么
当然我们可以定义各种方法,比如仿照字符串的方法,前面用一个数表示每个子串的长度

#34


如果存在这样的方法,可以分割整数到不同的字符串,这个分割符号必然是占位的
这样,对于整个数的长度来说,就有了影响,这个数字除了组成它的各个有理数之外
还包含了’额外‘的分隔符
这样的效果,看起来是没有用一一映射关系建立起来的结果完美。

#35



分开数的地方就是逗点啊!

它的代码绝对不会和0-9十个数字的代码还起来的.

#36


将此数作为一个字符串,S:
"1/2,2/3,-3/4"
然后进行编码,不妨就用ASCII码:
  /   ,   -   0   1   2   3   4   5   6   7   8   9  
 64  39  45  48  49  50  51  52  53  54  55  56  57
则整个串 S 的代码是:C = “49645039 ...3945516452”
显然,此编码是一个整数,自然也是一个有理数, 这样就说明三个有理数可以变成一个有理数。
反之,从这个有理数很容易分离出每一位ASCII码:
   49  64  50  39  ... 39  45  51  64  52
---------------------------------------------------------------------------------
zzwu(未名)的方法很好,是我所见过的最简单的方法,适用有限个有理数,还原也非常简单,每两位数一断,然后作为ASCII码解释成字符串就可以了。

佩服!

#37


0   1   2   3   4   5   6   7   8   9   /   ,   - 
   0   1   2   3   4   5   6   7   8   9  10  11  12
当然,也可以如上编码,当作13进制数来看。
只不过编码时要把13进制整数换算成10进制整数,解码时又要把10进制整数换算成13进制整数,比较麻烦,还是zzwu(未名)原来的方法(其实可以看作是100进制)来得快速直观。


#38


没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!
-----------------------------------------------------------------------------
zzwu(未名)这句话问得好,抓住了问题的本质。

#39


还以为楼主纯粹是从计算上玩把戏~~

#40


只要不嫌位数太长,只要3个有理数的最大位数是预知的,就容易办。
如:知道A、B、C的分数表示时,分子分明都最多50位,用100位可以表示A、B、C的每一个。
把三个机械的拼起来,就是一个300位的Q。拆也很好拆啊。

换句话说,把3个数都化为分数形式,对分子分母的前面补0,使得所有分子分母的位数等于其中3个分子和3个分母之中最长的一个,然后机械的拼起来。

不一定高效,但简单。

例子:   A=1/3       B=2/17       C=44/7897
补0后:  A=00010003  B=00020017   C=0044/7897
得到Q:   Q=000100030002001700447897

要从Q得到A、B、C也容易,等拆6等分,分别是每个的分子分母。

我只是举例说明,实际中可以化为二进制后的位数。最前面的0可以去掉,那么还原的时候就要将位数补为6的整数倍,然后就得到该怎么拆了。

#41


只要不嫌位数太长,只要3个有理数的最大位数是预知的,就容易办。
如:知道A、B、C的分数表示时,分子分明都最多50位,用100位可以表示A、B、C的每一个。
把三个机械的拼起来,就是一个300位的Q。拆也很好拆啊。

换句话说,把3个数都化为分数形式,对分子分母的前面补0,使得所有分子分母的位数等于其中3个分子和3个分母之中最长的一个,然后机械的拼起来。

不一定高效,但简单。

例子:   A=1/3       B=2/17       C=44/7897
补0后:  A=00010003  B=00020017   C=0044/7897
得到Q:   Q=000100030002001700447897

要从Q得到A、B、C也容易,等拆6等分,分别是每个的分子分母。

我只是举例说明,实际中可以化为二进制后的位数。最前面的0可以去掉,那么还原的时候就要将位数补为6的整数倍,然后就得到该怎么拆了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
其实也可以变成一个分式,请看这个例子,
例如:25,-4/7,-55/56
变为:025104155/001007056
就是原数的各个分子或分母合并到新数的分子或分母中,其中
用0表示正数,1表示负数,就是每个原数的分子或分母都增加一位符号位。
并且使各个原数的分子或分母个数相同,不同的用零补全。
恢复时只要注意一下符号位就行拉

#42


忘了符合位了,那就多补一位吧,0表示正,1表示负,如下:

例子:   A=-1/3       B=2/17        C= 44/7897
补0后:  A=1000100003  B=0000200017   C=0004407897
得到Q:   Q=1000100003000002000170004407897

#43


我觉得大家没有从问题的本意上去考虑它

这个问题的核心就是不引入分隔符号

否则,这样的问题的答案多如牛毛了

比如:
把表达3个有理数的6个整数串连起来,中间加入分割符号,组成字符串,当成二进制来理解就可以了

可是这样的做法,你得到的是什么,你还可以认为它是原来的问题域当中的整数吗

#44


楼上的,你没看清楚吧?

#45


三个有理数,不用分隔号,是不可能区分出它们来的.例如: 1/234/455/666

是 1/2 34/456 7/666 呢?

还是 1/23 4/45 67/666 呢?

或者还是 1/2 34/45 5/666 呢? 等等

#46


3.14000000000000000000...
0.06150000000000000000...
5.00000000000000000000...

==>

305.1004600100500000000000000000000000000...

这里,只考虑非负有理数(亦可包括非负实数),如果把负有理数(实数)也考虑进去,在首位加一个8bits信息量的符号位即可。

#47


用无穷位来表示吗?这样一来无理数也可以3合1了!

#48


你这样还不行,因为怎样来表示大整数呢?比如
X=11111111111111...
Y=0.0000000000001...
Z=3333333333.333333333...


#49


to  zzwu(未名) :
  你是误会楼主的意思了。
--------------------------------------------------------
    3个有理数               转化为一个有理数之后是
--------------------------------------------------------
 X      Y      Z              F
--------------------------------------------------------
1/2   34/456  7/666         000100020034045600070666
1/23  4/45    67/666        000100230004004500670666
1/2   34/45   5/666         000100020034004500050666
--------------------------------------------------------

怎么可能分不出来呢?
没用分隔号啊。

F的数字串平均分成六段,分别是分子分母了嘛,真是。

--------------------------------------------------------

#50


TO cuixiping(无心):

我不是对你的问题,而是针对 Kusk(Kusk) 的方法提问,

没有讲清,抱歉!