用算法来描述,就是求两个算法: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 都是可数集,所以这个映射必定存在
由于 Q^3 和Q 都是可数集,所以这个映射必定存在
#5
其实也不要说是 Q^3 ,就是Q^n 也对的
也就是说 楼主即使把 A、B、C改成 A1,A2,....,An
这两个变化还是能够被找到的
也就是说 楼主即使把 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就可以了。
假设为每个数最多是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 之间的可逆映射就够了。
由于 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了
=====================================================
如果能够用1个数表示3个数,而且精度不变的话,肯定就可以把rar文件(任何一种文件都可以)用你说的这种算法压缩到原来的1/3,因为把rar文件里面的每三个一定长度的字节当成三个数,就可以用一个数字来表示,而这个数字和原来数字的精度相同,所以应该是能够用同样长度的数据来表示,所以就压缩到了原来的1/3了
#12
我理解的精度不变的意思是不损失有理数精度,比如说1/3就是1/3,而不是用0.33333333333333333333...来表示,小数点后面有多少位都不行。
我说的有理数是数学上的有理数,而不是计算机中的浮点数。
诚如galois_godel()分析的那样可以把n个有理数用一个有理数来表示,这与文件的压缩没有关系。否则的话,要是取n=1000000,岂不是可以把文件压缩到原来的百万分之一了?
我说的有理数是数学上的有理数,而不是计算机中的浮点数。
诚如galois_godel()分析的那样可以把n个有理数用一个有理数来表示,这与文件的压缩没有关系。否则的话,要是取n=1000000,岂不是可以把文件压缩到原来的百万分之一了?
#13
不过这里的学术讨论也是建立在计算机的基础上的,如果不考虑精度问题的话,任意数字都可以表示n个数字,只要你写出n个函数就行了
-----------------------------------------------------------------------
To: arrowcy(长弓手),请理解原命题的意思。我的意思是我已经写出了符合要求的算法T1、T2,你如果也得出了T1、T2,请贴出来。
-----------------------------------------------------------------------
To: arrowcy(长弓手),请理解原命题的意思。我的意思是我已经写出了符合要求的算法T1、T2,你如果也得出了T1、T2,请贴出来。
#14
很有意思
一时还没思路
一时还没思路
#15
不知对效率的要求高不高?还是仅要求可行?
还有 A,B,C 是否有序?
还有 A,B,C 是否有序?
#16
算法T2输出的 A,B,C 要求是和算法T1输入的 A,B,C 是相同顺序的。
把算法在纸上写出来就行,不要求用计算机程序实现,因为实际的计算机所能存储的数的大小和精度是有限的,而我们在这里研究的是理论上的有理数。
我实现的算法T1、T2的效率很好,把算法写在纸上,用手算就可以算得出来。
把算法在纸上写出来就行,不要求用计算机程序实现,因为实际的计算机所能存储的数的大小和精度是有限的,而我们在这里研究的是理论上的有理数。
我实现的算法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)的分子)
一定还有更好的
自然数:
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 为所求的有理数。
令 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
令 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)
想法很好。把“/”改成“,”似乎更合适,因为在
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
“用一个自然数表示有限个有理数”
见:http://blog.skyiv.com/more.asp?name=air&id=50
#22
很简单,参考计算机表示有理数的方法把这N个数转换成固定长度的数据
然后拼到一起,直接转换成最终的结果就OK了
然后拼到一起,直接转换成最终的结果就OK了
#23
没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!
#24
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
#25
to happy__888([顾问团]寻开心):
|-
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
-|
那你怎么逆运算回去阿?
|-
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
-|
那你怎么逆运算回去阿?
#26
不过 happy__888([顾问团]寻开心) 的想法可以转换为 一个编码过程
设定T1算法就是对3个数进行编码,编码用到的字符集只能是'0'-'9',得到一个大数
T2就是解码过程
...
设定T1算法就是对3个数进行编码,编码用到的字符集只能是'0'-'9',得到一个大数
T2就是解码过程
...
#27
其实这里面存在的是两类对应关系
在大学数学系的《实变函数与泛函分析》课程当中有提到这两类关系
第1类 有理数和自然数的对应关系
第2类 多维自然数和自然数之间的对应关系
其实这两类就是超超表示的关系
他的第一个示例就是 多维和一维之间如何建立一一对应关系,他给的例子实二维和一维之间的关系
第二个例子就是有理数和自然数之间的对应关系
利用第一类关系,每个有理数都有了一个自然数和它对应
按照第二类关系,类似可以建立起三维数组和自然数之间的对应关系,
这样就完整的解决了问题了。
其实完全可以扩展到一个整数和N个自然数的一一对应关系的
在大学数学系的《实变函数与泛函分析》课程当中有提到这两类关系
第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多年没有看,这个《实变函数与泛函分析》的书了,也记忆得不太清楚
详细的定义,还是建议看那本书去吧
和可数集合对应的是不可数集合,比如无理数集合
还有比无理数集合更高等级的集合,比不可数还不可数的集合,好像叫做无穷集合吧,忘记了。
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
举个例子,设有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码解释成字符串就可以了。
佩服!
"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进制)来得快速直观。
0 1 2 3 4 5 6 7 8 9 10 11 12
当然,也可以如上编码,当作13进制数来看。
只不过编码时要把13进制整数换算成10进制整数,解码时又要把10进制整数换算成13进制整数,比较麻烦,还是zzwu(未名)原来的方法(其实可以看作是100进制)来得快速直观。
#38
没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!
-----------------------------------------------------------------------------
zzwu(未名)这句话问得好,抓住了问题的本质。
-----------------------------------------------------------------------------
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的整数倍,然后就得到该怎么拆了。
如:知道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表示负数,就是每个原数的分子或分母都增加一位符号位。
并且使各个原数的分子或分母个数相同,不同的用零补全。
恢复时只要注意一下符号位就行拉
如:知道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
例子: A=-1/3 B=2/17 C= 44/7897
补0后: A=1000100003 B=0000200017 C=0004407897
得到Q: Q=1000100003000002000170004407897
#43
我觉得大家没有从问题的本意上去考虑它
这个问题的核心就是不引入分隔符号
否则,这样的问题的答案多如牛毛了
比如:
把表达3个有理数的6个整数串连起来,中间加入分割符号,组成字符串,当成二进制来理解就可以了
可是这样的做法,你得到的是什么,你还可以认为它是原来的问题域当中的整数吗
这个问题的核心就是不引入分隔符号
否则,这样的问题的答案多如牛毛了
比如:
把表达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 呢? 等等
是 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信息量的符号位即可。
0.06150000000000000000...
5.00000000000000000000...
==>
305.1004600100500000000000000000000000000...
这里,只考虑非负有理数(亦可包括非负实数),如果把负有理数(实数)也考虑进去,在首位加一个8bits信息量的符号位即可。
#47
用无穷位来表示吗?这样一来无理数也可以3合1了!
#48
你这样还不行,因为怎样来表示大整数呢?比如
X=11111111111111...
Y=0.0000000000001...
Z=3333333333.333333333...
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的数字串平均分成六段,分别是分子分母了嘛,真是。
--------------------------------------------------------
你是误会楼主的意思了。
--------------------------------------------------------
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) 的方法提问,
没有讲清,抱歉!
我不是对你的问题,而是针对 Kusk(Kusk) 的方法提问,
没有讲清,抱歉!
#1
很有意思的问题!
#2
在精度不变的情况下没有误差,没有可能。否则.rar文件还能再压缩成原来的1/3
#3
在精度不变的情况下没有误差,我就做到了。和“.rar文件还能再压缩成原来的1/3”没有关系。
#4
这个问题其实就是说 在 Q^3 和 Q之间找一个一一的映射
由于 Q^3 和Q 都是可数集,所以这个映射必定存在
由于 Q^3 和Q 都是可数集,所以这个映射必定存在
#5
其实也不要说是 Q^3 ,就是Q^n 也对的
也就是说 楼主即使把 A、B、C改成 A1,A2,....,An
这两个变化还是能够被找到的
也就是说 楼主即使把 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就可以了。
假设为每个数最多是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 之间的可逆映射就够了。
由于 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了
=====================================================
如果能够用1个数表示3个数,而且精度不变的话,肯定就可以把rar文件(任何一种文件都可以)用你说的这种算法压缩到原来的1/3,因为把rar文件里面的每三个一定长度的字节当成三个数,就可以用一个数字来表示,而这个数字和原来数字的精度相同,所以应该是能够用同样长度的数据来表示,所以就压缩到了原来的1/3了
#12
我理解的精度不变的意思是不损失有理数精度,比如说1/3就是1/3,而不是用0.33333333333333333333...来表示,小数点后面有多少位都不行。
我说的有理数是数学上的有理数,而不是计算机中的浮点数。
诚如galois_godel()分析的那样可以把n个有理数用一个有理数来表示,这与文件的压缩没有关系。否则的话,要是取n=1000000,岂不是可以把文件压缩到原来的百万分之一了?
我说的有理数是数学上的有理数,而不是计算机中的浮点数。
诚如galois_godel()分析的那样可以把n个有理数用一个有理数来表示,这与文件的压缩没有关系。否则的话,要是取n=1000000,岂不是可以把文件压缩到原来的百万分之一了?
#13
不过这里的学术讨论也是建立在计算机的基础上的,如果不考虑精度问题的话,任意数字都可以表示n个数字,只要你写出n个函数就行了
-----------------------------------------------------------------------
To: arrowcy(长弓手),请理解原命题的意思。我的意思是我已经写出了符合要求的算法T1、T2,你如果也得出了T1、T2,请贴出来。
-----------------------------------------------------------------------
To: arrowcy(长弓手),请理解原命题的意思。我的意思是我已经写出了符合要求的算法T1、T2,你如果也得出了T1、T2,请贴出来。
#14
很有意思
一时还没思路
一时还没思路
#15
不知对效率的要求高不高?还是仅要求可行?
还有 A,B,C 是否有序?
还有 A,B,C 是否有序?
#16
算法T2输出的 A,B,C 要求是和算法T1输入的 A,B,C 是相同顺序的。
把算法在纸上写出来就行,不要求用计算机程序实现,因为实际的计算机所能存储的数的大小和精度是有限的,而我们在这里研究的是理论上的有理数。
我实现的算法T1、T2的效率很好,把算法写在纸上,用手算就可以算得出来。
把算法在纸上写出来就行,不要求用计算机程序实现,因为实际的计算机所能存储的数的大小和精度是有限的,而我们在这里研究的是理论上的有理数。
我实现的算法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)的分子)
一定还有更好的
自然数:
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 为所求的有理数。
令 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
令 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)
想法很好。把“/”改成“,”似乎更合适,因为在
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
“用一个自然数表示有限个有理数”
见:http://blog.skyiv.com/more.asp?name=air&id=50
#22
很简单,参考计算机表示有理数的方法把这N个数转换成固定长度的数据
然后拼到一起,直接转换成最终的结果就OK了
然后拼到一起,直接转换成最终的结果就OK了
#23
没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!
#24
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
#25
to happy__888([顾问团]寻开心):
|-
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
-|
那你怎么逆运算回去阿?
|-
有理数都可以表示成为分数的形式a/b其中a和b都是整数
最简单的方法把整数串起来就是了ab,这个是一个长的整数。
再多也是可以串连的
-|
那你怎么逆运算回去阿?
#26
不过 happy__888([顾问团]寻开心) 的想法可以转换为 一个编码过程
设定T1算法就是对3个数进行编码,编码用到的字符集只能是'0'-'9',得到一个大数
T2就是解码过程
...
设定T1算法就是对3个数进行编码,编码用到的字符集只能是'0'-'9',得到一个大数
T2就是解码过程
...
#27
其实这里面存在的是两类对应关系
在大学数学系的《实变函数与泛函分析》课程当中有提到这两类关系
第1类 有理数和自然数的对应关系
第2类 多维自然数和自然数之间的对应关系
其实这两类就是超超表示的关系
他的第一个示例就是 多维和一维之间如何建立一一对应关系,他给的例子实二维和一维之间的关系
第二个例子就是有理数和自然数之间的对应关系
利用第一类关系,每个有理数都有了一个自然数和它对应
按照第二类关系,类似可以建立起三维数组和自然数之间的对应关系,
这样就完整的解决了问题了。
其实完全可以扩展到一个整数和N个自然数的一一对应关系的
在大学数学系的《实变函数与泛函分析》课程当中有提到这两类关系
第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多年没有看,这个《实变函数与泛函分析》的书了,也记忆得不太清楚
详细的定义,还是建议看那本书去吧
和可数集合对应的是不可数集合,比如无理数集合
还有比无理数集合更高等级的集合,比不可数还不可数的集合,好像叫做无穷集合吧,忘记了。
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
举个例子,设有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码解释成字符串就可以了。
佩服!
"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进制)来得快速直观。
0 1 2 3 4 5 6 7 8 9 10 11 12
当然,也可以如上编码,当作13进制数来看。
只不过编码时要把13进制整数换算成10进制整数,解码时又要把10进制整数换算成13进制整数,比较麻烦,还是zzwu(未名)原来的方法(其实可以看作是100进制)来得快速直观。
#38
没有要求从任何一个有理数分解为3个有理数吗?如果这样,情况就完全两样了!
-----------------------------------------------------------------------------
zzwu(未名)这句话问得好,抓住了问题的本质。
-----------------------------------------------------------------------------
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的整数倍,然后就得到该怎么拆了。
如:知道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表示负数,就是每个原数的分子或分母都增加一位符号位。
并且使各个原数的分子或分母个数相同,不同的用零补全。
恢复时只要注意一下符号位就行拉
如:知道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
例子: A=-1/3 B=2/17 C= 44/7897
补0后: A=1000100003 B=0000200017 C=0004407897
得到Q: Q=1000100003000002000170004407897
#43
我觉得大家没有从问题的本意上去考虑它
这个问题的核心就是不引入分隔符号
否则,这样的问题的答案多如牛毛了
比如:
把表达3个有理数的6个整数串连起来,中间加入分割符号,组成字符串,当成二进制来理解就可以了
可是这样的做法,你得到的是什么,你还可以认为它是原来的问题域当中的整数吗
这个问题的核心就是不引入分隔符号
否则,这样的问题的答案多如牛毛了
比如:
把表达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 呢? 等等
是 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信息量的符号位即可。
0.06150000000000000000...
5.00000000000000000000...
==>
305.1004600100500000000000000000000000000...
这里,只考虑非负有理数(亦可包括非负实数),如果把负有理数(实数)也考虑进去,在首位加一个8bits信息量的符号位即可。
#47
用无穷位来表示吗?这样一来无理数也可以3合1了!
#48
你这样还不行,因为怎样来表示大整数呢?比如
X=11111111111111...
Y=0.0000000000001...
Z=3333333333.333333333...
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的数字串平均分成六段,分别是分子分母了嘛,真是。
--------------------------------------------------------
你是误会楼主的意思了。
--------------------------------------------------------
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) 的方法提问,
没有讲清,抱歉!
我不是对你的问题,而是针对 Kusk(Kusk) 的方法提问,
没有讲清,抱歉!