| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1934 人关注过本帖
标题:想了一天的高精度n次方,样例会对,求大神帮忙看看错哪了
只看楼主 加入收藏
xry123
Rank: 1
等 级:新手上路
帖 子:5
专家分:1
注 册:2016-2-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
想了一天的高精度n次方,样例会对,求大神帮忙看看错哪了
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
    char A[100];
    int n,i,j,k,flag,C[128],D[128],l,M[128],o,len,cnt,a,b,flag2,flag3,flag4;
    for (;cin>>A>>n;){
    if (n%2==0)
        cnt=n;
         else
        cnt=n-1;
     j=strlen(A);
     flag=0;
     flag2=0;
     flag4=0;
     memset(C,0,sizeof(C));
    memset(M,0,sizeof(M));
    memset(D,0,sizeof(D));
for (j=j-1;j>=0;j--)
if (A[j]!='0'&&A[j]!='.'){
    flag3=j;

    break;
}

    for (i=0,l=0;i<=flag3;i++)
    {
        if (A[i]!='0'&&A[i]!='.')
            flag2=1;
         if (flag2){
        if (A[i]==48){C[l]=0;l++;}
        if (A[i]==49){C[l]=1;l++;}
        if (A[i]==50){C[l]=2;l++;}
        if (A[i]==51){C[l]=3;l++;}
        if (A[i]==52){C[l]=4;l++;}
        if (A[i]==53){C[l]=5;l++;}
        if (A[i]==54){C[l]=6;l++;}
        if (A[i]==55){C[l]=7;l++;}
        if (A[i]==56){C[l]=8;l++;}
        if (A[i]==57){C[l]=9;l++;}

        }
        if (A[i]=='.'){
        flag=i;
        flag4=1;

        }
      }

b=n*(flag3-flag);

for (k=0;k<l;k++)
    D[k]=C[k];

    len=l-1;
        for (cnt=1;cnt<n;cnt++)
        {

            for (l=i-1,o=127;l>=0;l--,o--)
                for (a=len;a>=0;a--){
            M[o-(len-a)]+=C[l]*D[a];
               if (M[o-(len-a)]>=10)
            {
                M[o-(len-a)-1]+=M[o-(len-a)]/10;
                M[o-(len-a)]=M[o-(len-a)]%10;

            }

                }
            for (o=0,l=0,flag=0;o<=127;o++)
            {
                if (M[o]!=0)
                {
                    flag=1;
                }
                if (flag)
                {
                    C[l]=M[o];
                    l++;
                }
            }
            i=l;
              memset(M,0,sizeof(M));
        }
        for (l;l>=0;l--)
            if (C[l]!=0)
        {
            flag=l;
            break;
        }
   if (flag4){

        if (b<=l)
        {

            a=l-b;
            for (k=0;k<=flag;k++)
            {
                cout<<C[k];
                if (k==a)
                    cout<<'.';
            }
             cout<<endl;
        }

        else
        {

            a=b-l;

            cout<<'.';
            for (k=0;k<a-1;k++)
                cout<<'0';
            for (k=0;k<=flag;k++)
                cout<<C[k];
            cout<<endl;
        }

   }
   else
   {
        for (k=0;k<=flag;k++)
            {
                cout<<C[k];

            }
             cout<<endl;
   }
    }
    return 0;
}
代码很麻烦,在此谢过各位大神了
搜索更多相关主题的帖子: include 
2016-02-10 14:44
xry123
Rank: 1
等 级:新手上路
帖 子:5
专家分:1
注 册:2016-2-10
收藏
得分:0 
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
    char A[100];
    int n,i,j,k,flag,C[128],D[128],l,M[128],o,len,cnt,a,b,flag2,flag3,flag4;
    for (;cin>>A>>n;){    //整体思想是不管小数点看成整数计算,然后在加小数点,即看成n乘以10的负x次方
    j=strlen(A);
     flag=0;
     flag2=0;
     flag4=0;
     memset(C,0,sizeof(C));
    memset(M,0,sizeof(M));
    memset(D,0,sizeof(D));
for (j=j-1;j>=0;j--)
if (A[j]!='0'&&A[j]!='.'){        //为了去掉后面多余的0的影响
    flag3=j;

    break;
}

    for (i=0,l=0;i<=flag3;i++)   //字符转成整形
    {
        if (A[i]!='0'&&A[i]!='.')
            flag2=1;
         if (flag2){
        if (A[i]==48){C[l]=0;l++;}
        if (A[i]==49){C[l]=1;l++;}
        if (A[i]==50){C[l]=2;l++;}
        if (A[i]==51){C[l]=3;l++;}
        if (A[i]==52){C[l]=4;l++;}
        if (A[i]==53){C[l]=5;l++;}
        if (A[i]==54){C[l]=6;l++;}
        if (A[i]==55){C[l]=7;l++;}
        if (A[i]==56){C[l]=8;l++;}
        if (A[i]==57){C[l]=9;l++;}

        }
        if (A[i]=='.'){
        flag=i;
        flag4=1;

        }
      }

b=n*(flag3-flag);   //计算x的值

for (k=0;k<l;k++)
    D[k]=C[k];

    len=l-1;
        for (cnt=1;cnt<n;cnt++)       //计算部分
        {

            for (l=i-1,o=127;l>=0;l--,o--)
                for (a=len;a>=0;a--){
            M[o-(len-a)]+=C[l]*D[a];
               if (M[o-(len-a)]>=10)
            {
                M[o-(len-a)-1]+=M[o-(len-a)]/10;
                M[o-(len-a)]=M[o-(len-a)]%10;

            }

                }
            for (o=0,l=0,flag=0;o<=127;o++)
            {
                if (M[o]!=0)
                {
                    flag=1;
                }
                if (flag)
                {
                    C[l]=M[o];
                    l++;
                }
            }
            i=l;
              memset(M,0,sizeof(M));
        }
        for (l;l>=0;l--)   //删去计算后的后面多余的0
            if (C[l]!=0)
        {
            flag=l;
            break;
        }
   if (flag4){       //有小数点

        if (b<=l)       //结果大于1
        {

            a=l-b;
            for (k=0;k<=flag;k++)
            {
                cout<<C[k];
                if (k==a)
                    cout<<'.';
            }
             cout<<endl;
        }

        else
        {

            a=b-l;

            cout<<'.';
            for (k=0;k<a-1;k++)
                cout<<'0';
            for (k=0;k<=flag;k++)
                cout<<C[k];
            cout<<endl;
        }

   }
   else      //输入是整数
   {
        for (k=0;k<=flag;k++)
            {
                cout<<C[k];

            }
             cout<<endl;
   }
    }
    return 0;
}
带了点注释
2016-02-10 14:56
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:20 
看不懂,你应该把主函数开头定义的那一大堆变量都注释好再贴上来。
2016-02-10 16:38
xry123
Rank: 1
等 级:新手上路
帖 子:5
专家分:1
注 册:2016-2-10
收藏
得分:0 
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int judge (char A[])   //判断是否有小数点
{
    int i,j=strlen(A);
    for (i=0;i<j;i++)
        if (A[i]=='.')
        return i;
}
int judge2(char A[],int t)   //有小数点的情况下判断小数点是否全为0
{
    int i,j=strlen(A);
    for(i=j-1;i>t;i--)
        if (A[i]!='0'){

        return i;
        }
    return 0;
    }
int main()
{
    char A[100];
    int n,i,j,k,flag,C[128],D[128],l,M[128],o,len,cnt,a,b,flag2,flag3,flag4,p,t;
    for (;cin>>A>>n;){    //整体思想是不管小数点看成整数计算,然后在加小数点,即看成n乘以10的负x次方
    j=strlen(A);   //总长度
     flag=0;
     flag2=0;
     flag4=0;
     b=0;
     p=0;    //小数最后一位(非零)
     t=0;  //点的位置
     memset(C,0,sizeof(C));
    memset(M,0,sizeof(M));
    memset(D,0,sizeof(D));
    t=judge(A);
    if (t)
    {
        p=judge2(A,t);
    }
    if (!t){                       //没有小数点,直接转换
            for (i=0,l=0;i<=j;i++)   //字符转成整形
    {
        if (A[i]!=0)
            flag=1;         //排除前置0的干扰,如000002
        if (flag){
        if (A[i]==48){C[l]=0;l++;}
        if (A[i]==49){C[l]=1;l++;}
        if (A[i]==50){C[l]=2;l++;}
        if (A[i]==51){C[l]=3;l++;}
        if (A[i]==52){C[l]=4;l++;}
        if (A[i]==53){C[l]=5;l++;}
        if (A[i]==54){C[l]=6;l++;}
        if (A[i]==55){C[l]=7;l++;}
        if (A[i]==56){C[l]=8;l++;}
        if (A[i]==57){C[l]=9;l++;}
}
    }

      }
      else if (t&&!p)    //有小数点但是小数全为0,如2.000000
      {
          for (i=0,l=0;i<=t;i++)   //字符转成整形,此处小于t而不是j,去掉后面的灵,按照整数算
    {
        if (A[i]!=0)
            flag=1;
        if (flag){
        if (A[i]==48){C[l]=0;l++;}
        if (A[i]==49){C[l]=1;l++;}
        if (A[i]==50){C[l]=2;l++;}
        if (A[i]==51){C[l]=3;l++;}
        if (A[i]==52){C[l]=4;l++;}
        if (A[i]==53){C[l]=5;l++;}
        if (A[i]==54){C[l]=6;l++;}
        if (A[i]==55){C[l]=7;l++;}
        if (A[i]==56){C[l]=8;l++;}
        if (A[i]==57){C[l]=9;l++;}
}
    }
      }
      else     //有小数且小数不为0
      {
          for (i=0,l=0;i<=p;i++)   //字符转成整形
    {
        if (A[i]!=0)
            flag=1;
        if (flag){
        if (A[i]==48){C[l]=0;l++;}
        if (A[i]==49){C[l]=1;l++;}
        if (A[i]==50){C[l]=2;l++;}
        if (A[i]==51){C[l]=3;l++;}
        if (A[i]==52){C[l]=4;l++;}
        if (A[i]==53){C[l]=5;l++;}
        if (A[i]==54){C[l]=6;l++;}
        if (A[i]==55){C[l]=7;l++;}
        if (A[i]==56){C[l]=8;l++;}
        if (A[i]==57){C[l]=9;l++;}
}
    }
    b=n*(p-t);   //带小数的计算方式为把整数与小数部分一起算,然后加点。如1.123当成1123算,p-t为变成这样小数点要移动的位数,把数看成1123*10^-3,其n次方为1123^n*10^-3n,b即为3n
      }



for (k=0;k<l;k++)
    D[k]=C[k];    //存储因子

    len=l-1;
        for (cnt=1;cnt<n;cnt++)       //计算部分,将乘法变成加法,从乘法的竖式得到的灵感
        {

            for (l=l-1,o=127;l>=0;l--,o--)
                for (a=len;a>=0;a--){
            M[o-(len-a)]+=C[l]*D[a];
               if (M[o-(len-a)]>=10)    //大于十时进位
            {
                M[o-(len-a)-1]+=M[o-(len-a)]/10;
                M[o-(len-a)]=M[o-(len-a)]%10;

            }

                }
            for (o=0,l=0,flag=0;o<=127;o++)
            {

                if (M[o]!=0)     //将值付给C
                {

                    flag=1;
                    flag2=o;
                }
                if (flag)
                {
                 // cout<<M[o]<<endl;
                    C[l]=M[o];
                    l++;
                    //cout<<M[o]<<" "<<C[l]<<endl;
                }
            }


              memset(M,0,sizeof(M));    //清零
        }

        if (!t||(t&&!p)){      //小数均为0与没有小数点结果均为整数,不用管小数点

            for (k=0;k<l;k++)
            cout<<C[k];
            cout<<endl;

        }

        else
        {
            if (b<=l)     //代表结果大于1
            {
                a=l-b;    //小数点的位置
                for (k=0;k<l;k++)
                {
                    cout<<C[k];
                    if (k==a-1)
                        cout<<'.';
                }
                cout<<endl;
            }
            else
            {
                a=b-l;     //结果小于1
                cout<<'.';
                for (k=0;k<a;k++)     //补0
                    cout<<'0';
                for (k=0;k<l;k++)
                    cout<<C[k];
                    cout<<endl;
            }

        }

    }
    return 0;
}
AC了,感谢看过这段代码的所有人,自己AC的代码如上,错误的地方与不足之处还请大神们指出
2016-02-10 22:46
快速回复:想了一天的高精度n次方,样例会对,求大神帮忙看看错哪了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018575 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved