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