首页
社区
课程
招聘
[求助]可以在这里问一个acm的题吗?
发表于: 2010-1-20 09:54 4302

[求助]可以在这里问一个acm的题吗?

2010-1-20 09:54
4302
看了版主置顶的一个文章,我开始做北大的acm题做到1001这个十分简单的题,就是通不过请问这是为什么呢?
题目是这样的,
给定一个R 和一个n求 R^n的结果,其中  0.0 <R<29.0   0 < n <= 25. 且R以字符串形式给出点有六列,并包括一个小数点。
给出的列数为
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

这个应该不难的呀。我用字符串模仿乘法操作,在本地测试成功,但是提交上为什么就wrong answeer 呢
代码:

#include <iostream>
using namespace std;
int main()
{
        char s[6];
        int n;
        int i,dotSite,j,nNum,k;
        while(cin>>s>>n)
        {
                if(n==0){
                        cout<<"1"<<endl;
                        continue;
                }
                if(n<0){
                        continue;
                }
                for(i=0;i<6;i++){
                       
                        if(s[i]=='.') break;
                }//rescord the . site
                dotSite=i;
                char *v=new char[5*n];
                char *t=NULL;
                char *ttemp=new char[5];
                char *u=new char[5];
                for(i=0,j=0;i<5;i++,j++){
                        if(s[j]=='.') j++;
                        ttemp[i]=u[i]=s[j];
                }
                t=ttemp;       
                for(nNum=1;nNum<n;nNum++){
                        char *vTemp=new char[5*nNum+5];
                        int tt=0;
                        for(tt=0;tt<5*nNum+5;tt++){
                                vTemp[tt]='0';
                        }
                        for(j=0;j<5;j++){
                                int uValue=u[5-j-1]-'0';
                                for(k=0;k<5*nNum;k++){
                                        int tValue=t[5*nNum-k-1]-'0';
                                       
                                        int ms=(uValue*tValue)/10;
                                        int mg=(uValue*tValue)%10;                                                                       
                                        int addItem=(5*(nNum+1)-j-k-1);
                                        if(mg+(vTemp[addItem]-'0')>9){
                                                vTemp[addItem]=(vTemp[addItem]-'0'+mg)%10+'0';
                                                ms++;
                                        }
                                        else{
                                                vTemp[addItem]=(vTemp[addItem]-'0')+mg+'0';
                                        }
                                        tt=-1;
                                        while(ms!=0){
                                                if((vTemp[addItem+tt]-'0')+ms>9){
                                                        vTemp[addItem+tt]=(vTemp[addItem+tt]-'0'+ms) %10+'0';
                                                        ms=1;
                                                }
                                                else{
                                                        vTemp[addItem+tt]=(vTemp[addItem+tt]-'0'+ms)+'0';
                                                        ms=0;
                                                }
                                                tt--;
                                                if(addItem+tt<0) break;                                               
                                        }//while ms!=0                                       
                                }//for k<5*nNum                       
                        }//for j<5
                        delete []t;
                        t=NULL;
                        t=vTemp;
                }// for nNum
               
               
                int starti,endi;
                for(starti=0;starti<dotSite*n-1;starti++){
                        if(t[starti]!='0'){
                                break;
                        }
                }// for stari
                for(endi=5*n-1;endi>dotSite*n;endi--){
                        if(t[endi]!='0'){
                                break;
                        }
                }// for endi                               
                for(i=starti;i<dotSite*n;i++)
                        cout<<t[i];
                if(endi>dotSite*n){
                        cout<<".";
                        for(i=dotSite*n;i<=endi;i++)
                                cout<<t[i];
                }               
                cout<<endl;                                       
        }
        return 0;
}

[课程]Linux pwn 探索篇!

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
思路是先扩大一定倍数,然后做整数乘法,最后给出结果。输入样式限定为
xxxxxx xx
前六位是R,后两位是n
2010-1-20 09:56
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
你的思路是对的
发个我n年前写的:
#include <iostream>
#include <string>
#define MAXN 300
using namespace std;

short a[MAXN], b[MAXN];

void mut(short a[],short b[]){
     short c[MAXN];
     memset(c, 0, MAXN*2);
     for (int i = 1; i <= a[0]; i++)
         for (int j = 1; j <= b[0]; j++)
             c[i+j-1] += a[i]*b[j];
     for (int i = 1; i < a[0] + b[0] + 3; i++){
         c[i+1] += c[i] / 10;
         c[i] %= 10;
     }
     for (c[0] = a[0] + b[0] + 3; c[c[0]] == 0; c[0]--);
     memcpy(b, c, MAXN*2);
}

int main(){
   string s;
   int n;
   while(cin>>s>>n){
       int p = s.find(".");
       memset(a, 0, MAXN * 2);
       memset(b, 0, MAXN * 2);
       int u = 0;
       if (p>=0)
           u = s.length() - p - 1;

       for (int i = s.length() - 1; i >= 0; i--)
           if (i != p) a[++a[0]] = s[i] - '0';
       memcpy(b, a, MAXN*2);
       for (int i = 1; i < n; i++) mut(a, b);
       p = u;
       if (p == 0)
             for (int i = b[0]; i > 0; i--) cout << b[i];
       else {
            p *= n;
            int c = 1;
            while (b[c] == 0) c++;
            for (int i = b[0]; i >p; i--) cout <<b[i];
            if  (c < p){
                cout << '.';
                for (int i = p; i >= c; i--) cout <<b[i];
         }
       }
       cout << endl;    
   }
   return 0;
}
2010-1-20 10:04
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果答案是0.xxxx 这样就不正确,要是 .xxxx这样的结果
2010-1-20 11:29
0
雪    币: 466
活跃值: (165)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
感觉楼主的办法不太行吧? 29^25次,整数能放得下吗?还要放大一定的倍数。。。。。。
2010-1-21 14:16
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不是直接用的整数,用的字串来模仿整数的乘法的
不过resty的速度要比我写的哪个快
2010-1-22 08:49
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这道题思路比较简单,但是细节很多,尤其是要去掉前后多余的0,记得当初我是用了N多控制变量才过的,LZ的代码写的太纠结了,实在看不下去,不过感觉一般WA就是对前后的0处理不当的原因吧。
2010-1-23 13:08
0
游客
登录 | 注册 方可回帖
返回
//