高分求助整数去尾可逆算法

海盗医生 2011-07-08 02:08:55
有X位整数,比如6位整数“235697”
1、去掉个位数字“7”,变为5位整数:“23569”
2、尾数9乘以去掉的个位数7, 结果为:23560+7*9=23623
3、去尾后,数字的变化:数位少了 原先是6位,变成了5位

下边介绍可逆过程:
首先说明一点,0~9中任意选择一个数字作为基数,分别乘以0~9, 结果跟10取余,那么可定还是0~9
例如选择9作为基数
0*9=0 %10 = 0
1*9=9 %10 = 9
2*9=18 %10 = 8
3*9=27 %10 = 7
4*9=36 %10 = 6
5*9=45 %10 = 5
6*9=54 %10 = 4
7*9=63 %10 = 3
8*9=72 %10 = 2
9*9=81 %10 = 1

可逆过程
1、23623 尾数为3,那么可以肯定为63 = 7*9
2、23623-63+9=23569
3、加上尾数23569*10+7 = 235697


上边有啰嗦了,呵呵,主要是为了介绍整数去尾可逆是怎么回事
现在求助:
“235697” 十位数不一定为9,可以是0~9任意一个数字,因此上边的算法就无法可逆了!急求算法!
...全文
250 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
linxren 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 wangyutao0232000 的回复:]
现在求助:
“235697” 十位数不一定为9,可以是0~9任意一个数字,因此上边的算法就无法可逆了!急求算法![/Quote]楼主自己也说了,这是不可逆的。
可逆的情况下是,假定了十位数是某一个数值才行。
楼主放弃吧,这是不可能的。楼上有人提到的信息论的信息量的说法是对的。
cfvmario 2011-07-08
  • 打赏
  • 举报
回复
如果想具有通用性,可以用CABAC编码,就是自适应更新0和1的频率。
这个算法在H264的文档里可以查到,就是要预先定义一个概率更新表
cfvmario 2011-07-08
  • 打赏
  • 举报
回复
我认为唯一的办法就是利用这个数不同数字间的冗余度,但前提是这个数要足够大并且各个数字之间的分布明显不平均。。
例如n=(1000000000100010)2,我举个栗子而已,1和0的频率差别很大
然后怎么编码,算术编码法。n的第一位永远是1,可以忽略。后面的部分,比如这个例子里有13个0和2个1,那么将0~1的范围分割,用0~13/15表示0,13/15~1表示1
读出第一个数字0,就把0~1的范围缩小到0~13/15
独处第二个数字0,就把0~13/15的范围缩小到0~169/225
等等直到读完,最后用范围内的一个数表示

但是这样不具有通用性啊。。所以我才说要有很多这样的数才有意义
lxyppc 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wangyutao0232000 的回复:]

不可能中存在可能

还有上边只是举的一个例子,是有问题的例子
所以才发出来让大侠们帮忙呀,呵呵
[/Quote]
那麻烦你先用数学的方式证明其可能性,再找高手用代码来实现
总不能让大家陪着你一起浪费时间吧
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
不可能中存在可能

还有上边只是举的一个例子,是有问题的例子
所以才发出来让大侠们帮忙呀,呵呵
cfvmario 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lxyppc 的回复:]
不知道楼主有没有用数学的方法推导过,你的这个算法的理论依据是任意两个个位数相乘,其乘积尾数唯一。

对于任意两个数m,n,m,n取{0,1,2,3,4,5,6,7,8,9}
有 m*n = a*10 + b, a,b取{0,1,2,3,4,5,6,7,8,9}
已知b,可以求出m和n
而且即使是a和b都知道,要求出m和n也是不可能的.
这显然是不行的,不要在这个上面浪费时间,你……
[/Quote]
但问题是根本不可能有这样的方法,这不是在追求永动机么。
信息论啊,一个数n就有logn bit的信息量,要无损永远没法减少的
除非是很很多多的数,比如其中每个数字的频率还不一样啥的,这可以压缩^^
lxyppc 2011-07-08
  • 打赏
  • 举报
回复
不知道楼主有没有用数学的方法推导过,你的这个算法的理论依据是任意两个个位数相乘,其乘积尾数唯一。

对于任意两个数m,n,m,n取{0,1,2,3,4,5,6,7,8,9}
有 m*n = a*10 + b, a,b取{0,1,2,3,4,5,6,7,8,9}
已知b,可以求出m和n
而且即使是a和b都知道,要求出m和n也是不可能的.

这显然是不行的,不要在这个上面浪费时间,你得另想办法
lxyppc 2011-07-08
  • 打赏
  • 举报
回复
去尾可逆,是楼主自己想出来的吧
235697和235679用你这个算法算同来是一样的结果,都是23623。
楼主如何知道23623代表的是235697还是235679呢
cfvmario 2011-07-08
  • 打赏
  • 举报
回复
变小了怎么可能可逆呢。。你是在把1-N范围的数映射到一个比它小的范围1-n,必然不可逆
dzymjk 2011-07-08
  • 打赏
  • 举报
回复
数学,是一门深奥的学问
ThinkingMind1988 2011-07-08
  • 打赏
  • 举报
回复
假设有一个十进制数ABCD,经过你的算法后,为EFG,EFG = ABC + C * D; 这样看来如果只给使用你的算法瘦身完后的数就有三个未知量:ABC、C、D,我认为求逆的算法不是很可行,可能耗费大量时间。尝试换种思路吧。
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
如果整数为一个偶数,那问题就简单了,直接除2就可以
但如果是奇数,那就出现了非整数,问题就在这
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
谢谢的你代码
主要是_ltoa

但还是没有解决我的问题,形式上字符少了
但我存储的格式是一个INT,在32系统中为4个字节,与字符无关
瘦身是让数字本身变小,相当于除以2,还必须可逆
赵4老师 2011-07-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
void main() {
long n;
int radix;
char b[33];

while (1) {
printf("Input a integer(>=0):");//要转换的十进制数
fflush(stdout);
rewind(stdin);
if (1==scanf("%ld",&n)) {
if (n>=0) break;
}
}
while (1) {
printf("Input radix(2..36):");//进制,可以为2..36
fflush(stdout);
rewind(stdin);
if (1==scanf("%d",&radix)) {
if (2<=radix && radix<=36) break;
}
}
printf("%d(10)==%s(%d)\n",n,_ltoa(n,b,radix),radix);
}

Input a integer(>=0):235697
Input radix(2..36):36
235697(10)==51v5(36)
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 c_losed 的回复:]

引用 6 楼 wangyutao0232000 的回复:

c_losed大侠:
如果不减少数位
原数字与固定数字XOR后,结果会变小吗?是原先的1/2,甚至更小

ms不会
不知道你主要是要瘦身存储还是一定要去掉最后一位数字
如果是瘦身存储的话 参考赵老师的 用10转16也可以
[/Quote]

10转16 可以使数字变小? 有相关的文章吗?

求助 赵老师、c_losed
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

给十进制数瘦身请使用大于十的进制
[/Quote]

瘦身:数字本身大小变小
16进制只是表现方式不一样,位数是短了,但实际大小没有变化
c_losed 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wangyutao0232000 的回复:]

c_losed大侠:
如果不减少数位
原数字与固定数字XOR后,结果会变小吗?是原先的1/2,甚至更小
[/Quote]
ms不会
不知道你主要是要瘦身存储还是一定要去掉最后一位数字
如果是瘦身存储的话 参考赵老师的 用10转16也可以
赵4老师 2011-07-08
  • 打赏
  • 举报
回复
给十进制数瘦身请使用大于十的进制
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
c_losed大侠:
如果不减少数位
原数字与固定数字XOR后,结果会变小吗?是原先的1/2,甚至更小
海盗医生 2011-07-08
  • 打赏
  • 举报
回复
集思广益,大家帮帮忙呀!

我已经半个月没睡好觉了,给数字瘦身,去掉尾数有这么难呀,心病!

求助
加载更多回复(4)

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧