| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:我有一段AC的代码,但是不知道代码的解题思路是什么,有劳牛人解释一下,谢了In Reply To:Re:我有一段AC的代码,但是不知道代码的解题思路是什么,有劳牛人解释一下,谢了 Posted by:hldyxh at 2008-08-18 17:30:30 自己简单的看了一下,写点注释吧。
要是错了,各位可要指出啊
#include "stdio.h"
#include "string.h"
//返回值为当前a[0]...的长度
//每次要转换的值是存储在a[0]中的。
//开始时把最右边的值放入a[0],然后把将a[0]转换为8进制保存在a[1]...之中
// 然后,把右起第二个放到a[0]中,将整个字符串再次转换为8进制
// 例如,假设原始串为0.123,则第一次进入myDivide()后得到a[1]...为0.375[10]
// 第二次得到0.296875[10],实际计算的就是0.23[8]的值
// 第三次输入的a[0]为1,计算的结果是0.162109375[10],就是0.123[8]的值
// 只要将里面的常数8修改为其他的数字x,就可以实现其他进制x到10进制的转换
// (当进制x大于10时,a[]的存储内容要修改)
int myDivide(int *a,int len)
{
int i=0;
int residue=0;
int temp=0;
int next=0; //当前没有转换的十进制值
for(i=0; i<len; i++)
{
temp=a[i]+next;
a[i]=temp/8;
residue=temp%8;
next=residue*10;
}
//此时a[0]必定为0
//将没有转换完全的值继续进行转换
//此时还可以保证a[0]~a[len-1]共len个项是全部有效的
//由于此时(i>=len),所以可以保证a[i]为全部没有使用过的
while (next)
{
a[i++]=next/8;
next%=8;
next*=10;
}
//此时当前的a[]已经计算完毕
return i;
}
int main()
{
int i=0;
char str[1000];
int a[3000];
int iLength=0;
int len_a=0;
while(scanf("%s",str)!=EOF)
{
iLength=strlen(str);
for(i=0; i<iLength; i++) //寻找第一个非0数,避免出现0.0000[8]
{
if (str[i]!='0' && i!=1)
break;
}
if (i==iLength) //原始串为0
printf("%s [8] = 0 [10]\n",str);
else if (str[0]=='1') //原始串为1
printf("%s [8] = 1 [10]\n",str);
else
{
len_a = 1;
a[0] = str[iLength-1]-'0';
for(i = iLength-2; i > 0; i--) //每次从最低位计算结果
{
len_a=myDivide(a,len_a);
a[0]=str[i]-'0';
}
printf("%s [8] = 0.",str);
for(i=1; i<len_a; i++)
printf("%d",a[i]);
printf(" [10]\n");
}
}
return 1;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator