注册 登录
编程论坛 C++教室

[求助]可不可以给个思路?

song_gpqg 发布于 2007-03-18 12:51, 939 次点击

一点思路都没有。。
可不可以说说用什么方法解啊。。谢谢了!我们宿舍都被这个困绕住。。

http://ai.pku.edu.cn/JudgeOnline/problem?id=1001

求R的N次方 0.0<R<99.999, 0<N<=25;


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

11 回复
#2
djp2007-03-18 17:07
连乘,乘N次,精确乘法怎么样?另外记录小数点位数,最后加上小数点在什么地方,怎么样?

随便问一下,搂住也是信科的吧?那个老师?我是余华山的课。
#3
song_gpqg2007-03-18 18:54

天呢!居然这里都能遇见。。我李文新的!

#4
djp2007-03-19 10:55

呵呵……
有缘呗!

#5
zhengci2007-03-25 10:48
信科?
是不是数学
信息与计算科学专业?
#6
cctv2cctv2007-03-25 19:50

信科?
是不是传统
宗教信仰与当代科技联盟专业?

#7
djp2007-03-27 21:31

是信息科学技术专业。。。。

。。。。
#8
jimmy64562007-03-31 13:59
简单那,求R的1/N次幂就可以了,有现成函数
#9
djp2007-04-02 20:45

能说具体点吗??

#10
PcrazyC2007-04-03 10:33
POW函数就是
#11
djp2007-04-04 15:11
但是给的数据特别的大,要求精度也高。。。。

用pow是不行的。。

float型出不了那么高的精度。

这是我们的作业。。。

呵呵。
#12
wfpb2007-04-04 19:17

试一下,看看可不可以.
似乎你给的几个数字input和output有些不符合,最后一个是符合的!

程序代码:
#include <iostream>
#include <string>
using namespace std;


bool IsDigit(string str)
{
    for(int i=0;i<str.length();i++)
        if(!isdigit(str[i])&&str[i]!='.')
            return false;
    return true;
}


string Multi(string a,string b)
{
    if(!IsDigit(a) || !IsDigit(b))
    {
        cerr<<\"输入的格式不合法!\"<<endl;
        return \"\";
    }
    int len=0;    //相乘后小数点几位
    int a_len=a.length();//a的长度
    int a_dot=a.find('.');//a的小数点位置
    if(a_dot!=-1)
    {
        len+=a_len-1-a_dot;
        int i;
        a.erase(a_dot,1);
        a_len--;
    }
    int b_len=b.length();//b的长度
    int b_dot=b.find('.');//b的小数点位置
    if(b_dot!=-1)
    {
        len+=b_len-1-b_dot;
        int i;
        b.erase(b_dot,1);
        b_len--;
    }
    int maxlen=a_len+b_len-1;                //相乘后最长位数-1
    int catorLen=a_len<b_len?a_len:b_len;    //将较短的数作为乘数
    int candLen=a_len+b_len-catorLen;        //将较长的数作为被乘数


    //初始化
    if(a_len<b_len)
        swap(a,b);
    int **ans=new int*[catorLen];
    for(int s=0;s<catorLen;s++)
    {
        ans[s]=new int[maxlen];
        memset(ans[s],0,sizeof(int)*maxlen);
    }
    int carry=0;
    //相乘后存入二维数组
    for(int i=catorLen-1;i>-1;i--)
    {
        for(int j=candLen-1;j>-1;j--)
        {
            ans[i][i+j]=((a[j]-'0')*(b[i]-'0')+carry)%10;
            carry=((a[j]-'0')*(b[i]-'0')+carry)/10;
        }
    }


    int head=carry;
    carry=0;
    string temp;
    //将二维数组相加
    for(int m=maxlen-1;m>-1;m--)
    {
        int result=0;
        for(int n=catorLen-1;n>-1;n--)
        {
            result+=ans[n][m];
        }
        char buf[3]={0};
        itoa((result+carry)%10,buf,10);
        temp.insert(0,buf);
        carry=(result+carry)/10;
    }
    head+=carry;
    char elem[2]={0};
    itoa(head,elem,10);
    if(head!=0)
        temp.insert(0,elem);
    temp.insert(temp.length()-len,\".\");
    return temp;
}
string Pow(string R,int N)
{
    if(N<0)
        return \"failsed\";
    else if(N==0)
        return \"1\";
    else return Multi(Pow(R,N-1),R);
}



int main(int argc, char *argv[])
{
    string str=Pow(\"3\",10);
    if(str==\"\")
        cerr<<\"failed\"<<endl;
    else cout<<str<<endl;
    return 0;
}

[此贴子已经被作者于2007-4-4 19:18:03编辑过]

1