以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  一个这样简单的程序还是老通不过,晕哪  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=72762)


--  作者:kaogejj
--  发布时间:3/8/2009 10:33:00 PM

--  一个这样简单的程序还是老通不过,晕哪
问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1001
Description

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.
Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.
Output

The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.
Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
Hint

If you don't know how to determine wheather encounted the end of input:
s is a string and n is an integer

My Java Code:

import java.util.Scanner;
import java.math.BigDecimal;

public class Main {
 public static void main(String[] args) throws Exception {
  BigDecimal r;
  int n;
  String result;

  Scanner console = new Scanner(System.in);
  while (console.hasNext()) {
   r = console.nextBigDecimal();
   n = console.nextInt();
   result = r.pow(n).toPlainString();
   if(result.length() > 1){
    result = result.replaceAll("^0", "");
   }
   if (result.indexOf('.') > 0) {
    result = result.replaceAll("0+$", "");
   }
   System.out.println(result);
  }
  console.close();
 }
}

用我的程序运行Sample 输入的输出:
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

可是提交上去报 Wrong Answer.
不知道错在哪。。。


--  作者:alis1017
--  发布时间:3/9/2009 10:31:00 AM

--  
我也遇到了,求解
--  作者:dq85
--  发布时间:3/9/2009 11:53:00 AM

--  
不懂java
不过我看上面写的Java is J2SE 1.5,会不会不兼容。。。呵呵
--  作者:whasic
--  发布时间:3/9/2009 12:16:00 PM

--  
这个题的问题多了
少小看1001了
出了名的无限WA
不看你程序光看你结果是WA就知道你至少犯了其中一个
首部0处理没?
尾部0处理没?
小数点处理没?
整数输出小数点没?
10的整数倍的若干次幂的尾部0是不是被当成小数处理了?
……

略微看了一下你的程序
用math.BigDecimal 你也太偷懒了吧……


--  作者:mychangle1234
--  发布时间:3/9/2009 1:40:00 PM

--  
看法同楼上,这种大数乘法可以用数组解决,在《程序设计导引及在线实践》里面有例子。
--  作者:greatseven
--  发布时间:3/9/2009 5:19:00 PM

--  
如果你一定要用java的话,那么还应该用BigDecimal的stripTrailingZeros,如果是0开头的话用startsWith("0.")判断一下再用substring输出就行了
--  作者:dark_matter
--  发布时间:3/9/2009 10:31:00 PM

--  
很久以前写的,OJ上的Archive下载不下来,刚在电脑上找出来一份,不知道是不是最后AC的版本:
import java.util.*;
import java.lang.*;
import java.math.*;

public class Main {

    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
        
        while (cin.hasNext())
        {
            BigDecimal  num;
            int         exp;
            String      res;

            num = BigDecimal.valueOf(Double.parseDouble(cin.next()));
            exp = cin.nextInt();            
            res = num.pow(exp).toPlainString();
            
            if (res.startsWith("0"))
            {
                res = res.substring(1, res.length());
            }
            
            while (res.endsWith("0"))
            {
                res = res.substring(0, res.length() - 1);
            }
                 
            if (res.endsWith("."))
            {
                res = res.substring(0, res.length() - 1);
            }    

            System.out.println(res);
        }
    }
}


--  作者:kaogejj
--  发布时间:3/9/2009 10:38:00 PM

--  
自己看出一个问题来
if (result.indexOf('.') > 0) {
应该是
if (result.indexOf('.') > -1) {

否则0.0100^4就通不过

头部0,尾部0,小数点都处理了,我用的是正则表达式,都可以处理的,有谁能给一个NG的case?


--  作者:kaogejj
--  发布时间:3/9/2009 11:00:00 PM

--  
ACM上你可查看自己的代码啊

以下是引用dark_matter在2009-3-9 22:31:00的发言:
很久以前写的,OJ上的Archive下载不下来,刚在电脑上找出来一份,不知道是不是最后AC的版本:
import java.util.*;
import java.lang.*;
import java.math.*;

public class Main {

     public static void main(String[] args)
     {
         Scanner cin = new Scanner(System.in);
         
         while (cin.hasNext())
         {
             BigDecimal  num;
             int         exp;
             String      res;

             num = BigDecimal.valueOf(Double.parseDouble(cin.next()));
             exp = cin.nextInt();            
             res = num.pow(exp).toPlainString();
             
             if (res.startsWith("0"))
             {
                 res = res.substring(1, res.length());
             }
             
             while (res.endsWith("0"))
             {
                 res = res.substring(0, res.length() - 1);
             }
                  
             if (res.endsWith("."))
             {
                 res = res.substring(0, res.length() - 1);
             }    

             System.out.println(res);
         }
     }
}



--  作者:ccyndi
--  发布时间:3/9/2009 11:10:00 PM

--  
支持cpp。。。
////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class power
{
 friend istream&operator>>(istream&In, power&r);
public:
 string operator()(int n);
private:
 vector<int> s;
 int dot;
};

istream&operator>>(istream&In, power&r)
{
 string tmp;
 In>>tmp;
 for(int i=0; i!=6; ++i)if(tmp[i]=='.')r.dot=6-i-1;
 r.s.clear();
 for(int i=5; i>=0; --i)if(tmp[i]!='.')r.s.push_back(tmp[i]-'0');
 return(In);
}

string power::operator()(int n)
{
 vector<int>answer(n*5);
 answer[0]=1;
 for(int i=0; i!=n; ++i)
 {
  vector<int>tmp(answer);
  for(int j=0; j!=n*5; ++j)answer[j]=0;
  for(int j=0; j!=n*5; ++j)
   for(int k=0; k!=5; ++k)
    answer[j+k]+=tmp[j]*s[k];
  for(int j=1; j!=n*5; ++j)
  {
   answer[j]+=answer[j-1]/10;
   answer[j-1]%=10;
  }
 }
 string str;
 str.clear();
 for(int i=0; i!=n*5; ++i)str=(char)(answer[i]+'0')+str;
 str.insert(n*5-dot*n, 1, '.');
 while(str[0]=='0')str.erase(str.begin());
 while(str[str.size()-1]=='0')str.erase(str.end()-1);
 if(str[str.size()-1]=='.')str.erase(str.end()-1);
 return(str);
}

int main()
{
 power s;
 int n;
 while(cin>>s>>n)cout<<s(n)<<endl;
}


--  作者:kaogejj
--  发布时间:3/9/2009 11:41:00 PM

--  
下面的代码被Accept了:
import java.util.Scanner;
import java.math.BigDecimal;

public class Pku1001 {
 public static void main(String[] args) throws Exception {
  BigDecimal r;
  int n;
  String result;

  Scanner console = new Scanner(System.in);
  while (console.hasNext()) {
   r = console.nextBigDecimal();
   n = console.nextInt();
   result = r.pow(n).toPlainString();
   if (result.length() > 1) {
    result = result.replaceAll("^0", "");
   }
   if (result.indexOf('.') > -1) {
    result = result.replaceAll("0+$", "");
   }

   result = result.replaceAll("\\.$", "");

   System.out.println(result);
  }
  console.close();
 }
}

除了result.indexOf('.') > -1这个地方改了之外,还加了一句
result = result.replaceAll("\\.$", "");

而加这一句与不加唯一的区别在于 0.0^3这样的输出不同,原来会输出 . ,现在输出空,可是题干明白说了  0.0<r<99.999,。。。,
就这个地方让我琢磨了好久 ,日。。。。
另外,judge对 0^4这样的case没有要求,我试过了,输出0或者输出空都对。。。


--  作者:kaogejj
--  发布时间:3/9/2009 11:44:00 PM

--  
上面的public class Pku1001 我在提交时已改成Main,可无视。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
101.563ms