当前位置: 代码迷 >> C语言 >> [求助]小数的八进制转换十进制问题
  详细解决方案

[求助]小数的八进制转换十进制问题

热度:236   发布时间:2006-07-21 13:31:59.0

我回去编了下,晕了,昨天编到12点多,哎.
下面您看看,我分了三个模块,两块是函数。
主程序:
#include "stdio.h"
#include "conio.h"
#include "ceshi2.c"
#include "string.h"
int main()
{
short result[300]={0},end[300]={0},sum[300]={0},num[20]={0},i,j,len,q=0,k,m;
char str_num[21],ch;
gets(str_num);
k=strlen(str_num)-2;
for(i=2;i<k+2;num[i-2]=str_num[i++]-48);
for(j=k-1;j>=0;j--)
{
multi(result,j+1,num[j]);
len=3*(j+1)-1;
while(len>=0)
{
sprintf(&ch,"%d",result[len--]);
end[q++]=ch-48;
}
for(i=3*j+2;i>=0;i--)
{
sum[i]+=end[i];
if(sum[i]>9)
{
if(i>0)
{
sum[i-1]+=sum[i]/10;
if(i>1)
sum[i-2]+=sum[i+1]/10;
sum[i-1]%=10;
}
sum[i]%=10;
}

}
for(i=0;i<300;end[i]=0,result[i++]=0);
q=0;
}

for(i=299;!sum[i];i--);
printf("0.");
for(m=0;m<=i;m++)
printf("%d",sum[m]);

getch();
}
函数1:(保存成ceshi2.c)
#include "stdio.h"
#include "conio.h"
#include "ceshi.c"
#include "string.h"
void multi(short *result,short j,short num)
{
short sum[300]={0},i,m;
cal(j,sum);
for(i=299;!sum[i];i--);
for(m=0;m<=i;m++)
{
result[m]+=sum[m]*num;
result[m+1]+=result[m]/10;
result[m+2]+=result[m+1]/10;
result[m+1]%=10;
result[m]%=10;
}
}
函数2:(保存成ceshi.c)
#include "stdio.h"
#include "conio.h"
void pow125(short *a,short *result);
void cal(short time,short *result)
{
short a1[300]={5,2,1},i=0,k,a2[300]={0};
while(++i!=time)
{
if(i%2)
pow125(a1,a2);
else pow125(a2,a1);
}
if(time%2)
{
for(i=0;i<300;i++)
result[i]=a1[i];
}
else
{
for(i=0;i<300;i++)
result[i]=a2[i];
}
}
void pow125(short *a,short *result)
{
short i,j,k,num[3]={5,2,1};
for(k=299;!a[k];k--);
for(i=0;i<300;result[i++]=0);
for(i=0;i<3;i++)
for(j=0;j<=k;j++)
{
result[i+j]+=a[j]*num[i];
result[i+j+1]+=result[i+j]/10;
result[i+j]%=10;
}
}

以上三个程序要求保存在同一目录下.算法相当繁杂,我下个帖再写,先帖这三个上去,以免帖子太长.


----------------解决方案--------------------------------------------------------
我说个算法大概吧,
八进制的每一位其实就相当于把每一位都放大1.25的n次幂(n为位,如十分位,则n=1,百分位n=2)倍,所以上面程序的算法就是把每个纯小数(base 8),分解为各个位,逐位计算得的十进制结果再相加即得.
为此,
step1:先计算125的n次幂(就是ceshi.c);
step2:再计算八进制小数各个位与相应125的N次幂的乘积;
step3:最后调整数量级,相加即得结果。
我就说这样吧,很繁的一道题,具体里面还有不少细节,楼主耐点心看看就知道了。


----------------解决方案--------------------------------------------------------

我说一下我的看法吧~
八进制小数转十进制小数的话,其实小数位也可以可非小数位一样计算,小数点后第1位*8^-1,小数点后第2位*8^-2,后面的类推
所以先定义一个字符串数组接受输入的小数,然后判断'.'的位数,然后把小数点前的那些(字符)数字复制个一个字符数组p1(从个位数开始),把小数点后的数字复制给另一个字符数组p2,再然后设计一个函数实现上面的计算的算法(其实很简单的),最后就算出来了,另外要注意字符数字要转为实型数字,
具体程序的话楼主可以思考一下

[此贴子已经被作者于2006-7-21 16:30:42编辑过]


----------------解决方案--------------------------------------------------------

11楼的写法是精度比较高,不过程序上好象有点问题!如果不考虑高精度的话,这样写法倒比较简单!
#include <stdio.h>
#include <string.h>

double a10(i)
int i;
{
double j,k;

k=10.0;
if(i == 0) return k;
for(j=0; j<i; j++)
{
k *= 10.0;
}
return k;
}

double a125(i)
int i;
{
double j,k;

k=1.25;
if(i == 0) return k;
for(j=0; j<i; j++)
{
k *= 1.25;
}
return k;
}

main()
{
double a, b, c, d, e;
long i;
a=0.01234567;

c = 0;
d = 0;
for(i=0; i<100; i++)
{
b = a*a10(i);
e = (((long)(b+0.000001))/a10(i));
e = e - d;
d = (long)(b+0.000001)/a10(i);
if(e < 0) break;
c += e * a125(i);

if((a - d) <= 0) break;
}
printf("c=[%.30f]\n", c);
return 0;
}

好象几次冥有函数的吧?

[此贴子已经被作者于2006-7-21 16:40:08编辑过]


----------------解决方案--------------------------------------------------------

楼上您的看法不可能实现,*8^-n这理论上可以作到,用计算机就必须转化为乘法才能实现。另外小数点的各个位上小数点的对齐也是个难题。
我就编了一晚上外加2个小时才编出来,就是在小数点对齐上被卡了挺久,后来才想到法子。
工藤♀新一您有空帮忙测试下我的程序,ok?
一次只输入一个八进制的小数,回车输出结果。谢了!


----------------解决方案--------------------------------------------------------
以下是引用lhyanlh在2006-7-21 16:37:48的发言:

11楼的写法是精度比较高,不过程序上好象有点问题!如果不考虑高精度的话,这样写法倒比较简单!

where?欢迎大家帮忙查查我的程序,因为数组的长度不好确定,所以不好申请,于是我就用了300位的数组,谢谢.
----------------解决方案--------------------------------------------------------
以下是引用soft_wind在2006-7-21 16:41:58的发言:

楼上您的看法不可能实现,*8^-n这理论上可以作到,用计算机就必须转化为乘法才能实现。另外小数点的各个位上小数点的对齐也是个难题。
我就编了一晚上外加2个小时才编出来,就是在小数点对齐上被卡了挺久,后来才想到法子。
工藤♀新一您有空帮忙测试下我的程序,ok?
一次只输入一个八进制的小数,回车输出结果。谢了!

恩~可以的,
不过为什么没看到头文件math.h啊,计算8^-n的话不直接用函数吗?
----------------解决方案--------------------------------------------------------

要实现高精度,用系统自带的函数是远远不够的,系统最多的精度就是double型.
math.h里面的函数我没用到,125的N次幂(其实也就是8^-n,只是小数点位置不同而已),当N太大时,math.h的函数pow是实现不了的。所以只好自己编了。   


----------------解决方案--------------------------------------------------------
哦~看来我没想全啊~呵呵~
----------------解决方案--------------------------------------------------------
以下是引用工藤♀新一在2006-7-21 16:29:13的发言:

我说一下我的看法吧~
八进制小数转十进制小数的话,其实小数位也可以可非小数位一样计算,小数点后第1位*8^-1,小数点后第2位*8^-2,后面的类推
所以先定义一个字符串数组接受输入的小数,然后判断'.'的位数,然后把小数点前的那些(字符)数字复制个一个字符数组p1(从个位数开始),把小数点后的数字复制给另一个字符数组p2,再然后设计一个函数实现上面的计算的算法(其实很简单的),最后就算出来了,另外要注意字符数字要转为实型数字,
具体程序的话楼主可以思考一下




怎么个简单法?


----------------解决方案--------------------------------------------------------
  相关解决方案