编程实现10进制转27进制

M阳光 2014-03-18 10:56:21
A表示1,B表示2......Z表示26.。也不完全是27进制,。因为没有0.

数据是高精度的。
看到网上给的方法:

sum是十进制数,int型的。

num[k++] = (sum - 1) % 26 + 'A'; //每次除的时候先减掉1.这样就可以避免单独讨论Z的时候了 
sum = (sum - 1) / 26; //不然会出现输入27输出 AZ这种情况。


我在编程中也发现用别的办法的话,在输入的数能被26整除的话,结果会不正确。。

我想知道 sum-1是什么原理。,这个方法的数学依据是什么?

多谢各位。:
...全文
416 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
M阳光 2014-03-19
  • 打赏
  • 举报
回复
引用 1 楼 tuzhutuzhu 的回复:
没明白你所谓的27进制到底是什么意思,27位分别是什么?
引用 3 楼 xiaohuh421 的回复:
这都是因为你没有表示0的数
引用 4 楼 majia2011 的回复:
没有0?怎么表示27? 这设计本身就错了
引用 6 楼 PDD123 的回复:
没有表示0的数的话,你不可能算对的。
。可能是我表达不清楚吧。看8楼:
引用 8 楼 dbzhang800 的回复:
比如Excel的列,就是用 A~Z 这样的26进制表示的(只要不和其他进制不转换,就和其他其他进制的符号没任何关系,和0也没有任何关系,它本身最小的数就是 A)。 A B C D .... 你可以想象,如何把它转成10进制数呢?这就需要有个对应关系了: 0 1 2 3 ... 1000 ... 还是 1 2 3 4 ... 1001 ... 两种方式都有人在用。
就是表格里的列~
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
_ltoa, _ltow Convert a long integer to a string. char *_ltoa( long value, char *string, int radix ); wchar_t *_ltow( long value, wchar_t *string, int radix ); Routine Required Header Compatibility _ltoa <stdlib.h> Win 95, Win NT _ltow <stdlib.h> Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value Each of these functions returns a pointer to string. There is no error return. Parameters value Number to be converted string String result radix Base of value Remarks The _ltoa function converts the digits of value to a null-terminated character string and stores the result (up to 33 bytes) in string. The radix argument specifies the base of value, which must be in the range 2 – 36. If radix equals 10 and value is negative, the first character of the stored string is the minus sign (–). _ltow is a wide-character version of _ltoa; the second argument and return value of _ltow are wide-character strings. Each of these functions is Microsoft-specific. Generic-Text Routine Mappings TCHAR.H Routine _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined _ltot _ltoa _ltoa _ltow Example /* ITOA.C: This program converts integers of various * sizes to strings in various radixes. */ #include <stdlib.h> #include <stdio.h> void main( void ) { char buffer[20]; int i = 3445; long l = -344115L; unsigned long ul = 1234567890UL; _itoa( i, buffer, 10 ); printf( "String of integer %d (radix 10): %s\n", i, buffer ); _itoa( i, buffer, 16 ); printf( "String of integer %d (radix 16): 0x%s\n", i, buffer ); _itoa( i, buffer, 2 ); printf( "String of integer %d (radix 2): %s\n", i, buffer ); _ltoa( l, buffer, 16 ); printf( "String of long int %ld (radix 16): 0x%s\n", l, buffer ); _ultoa( ul, buffer, 16 ); printf( "String of unsigned long %lu (radix 16): 0x%s\n", ul, buffer ); } Output String of integer 3445 (radix 10): 3445 String of integer 3445 (radix 16): 0xd75 String of integer 3445 (radix 2): 110101110101 String of long int -344115 (radix 16): 0xfffabfcd String of unsigned long 1234567890 (radix 16): 0x499602d2 Data Conversion Routines See Also _itoa, _ultoa
dbzhang800 2014-03-19
  • 打赏
  • 举报
回复
比如Excel的列,就是用 A~Z 这样的26进制表示的(只要不和其他进制不转换,就和其他其他进制的符号没任何关系,和0也没有任何关系,它本身最小的数就是 A)。 A B C D .... 你可以想象,如何把它转成10进制数呢?这就需要有个对应关系了: 0 1 2 3 ... 1000 ... 还是 1 2 3 4 ... 1001 ... 两种方式都有人在用。
dbzhang800 2014-03-19
  • 打赏
  • 举报
回复
”常规整数“ ==> "楼主26进制" : 先减 1, 而后常规变换。 ”楼主26进制“ ==> "常规整数": 先常规变换,而后加 1
PDD123 2014-03-19
  • 打赏
  • 举报
回复
没有表示0的数的话,你不可能算对的。
dbzhang800 2014-03-19
  • 打赏
  • 举报
回复
楼主自己想复杂了,这就是一个"标准的" 26 进制数: A~Z 无非是,”和其他数制转换时“,习惯上我们以0开始,他这儿以 1开始罢了。
majia2011 2014-03-19
  • 打赏
  • 举报
回复
没有0?怎么表示27? 这设计本身就错了
xiaohuh421 2014-03-19
  • 打赏
  • 举报
回复
这都是因为你没有表示0的数
赤色彗星 2014-03-19
  • 打赏
  • 举报
回复
因为你后面还加了一个'A',‘A'代表1,后面加1了,前面当然要减1,换种思路,把10进制转换成10进制(A表示1,B表示2...I表示9),就比较好理解了
num[k++] = (sum - 1) % 10 + 'A';
sum = (sum - 1) / 10;
tuzhutuzhu 2014-03-19
  • 打赏
  • 举报
回复
没明白你所谓的27进制到底是什么意思,27位分别是什么?
xiaohuh421 2014-03-19
  • 打赏
  • 举报
回复
(sum - 1) % 26 + 'A' 如果不减1 公式就是这样的 sum%26 + 'A' 这时你想表达'Z' 即26. 这时你输入 26 那么就有 26%26 +'A' = 'A' 这就不符合你的要求了. 减1就变成: (26-1)%26+'A' = 25%26+'A' = 'Z' 刚好是你所想要的结果. 其它数据也是一样, 你自己算一下就知道了. 归根结底都是因为你的进制中没有表示0的数. A-Z 26个字母表示26进制, 取值范围也应该是 0-25, 而不应该是 1-26, 所以8楼说的是错的, 楼主你的进制也是错误的. 就像10进制也样, 你看到10进制中有10表示一位吗? 没有吧. 只能是0-9. 0是一个伟大的发明, 不能舍弃它.
xiaohuh421 2014-03-19
  • 打赏
  • 举报
回复
所以你问的(sum - 1)为什么减1, 答案就已经有了撒, 本来正常的26进制应该是0对应A的. 因为你"26"进制中没有可以表示0的字符, 从1开始的, 所以只好减1, 让其能从0开始. 即 让1对应A.

69,371

社区成员

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

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