Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:我有一段AC的代码,但是不知道代码的解题思路是什么,有劳牛人解释一下,谢了

Posted by hldyxh at 2008-08-19 09:27:14 on Problem 1131
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator