用pow是不行的。。
float型出不了那么高的精度。
这是我们的作业。。。
呵呵。
试一下,看看可不可以.
似乎你给的几个数字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编辑过]