高精度+-*/板子

来源:互联网 发布:家里网络dns被劫持 编辑:程序博客网 时间:2024/05/21 08:56

六、高精度加法

#include

#include

using namespace std;

int main()

{

  string str1,str2;

  int a[250],b[250],len;   //数组的大小决定了计算的高精度最大位数

  int i;

  memset(a,0,sizeof(a));

  memset(b,0,sizeof(b));

  cin>>str1>>str2;   //输入两个字符串

  a[0]=str1.length();  //取得第一个字符串的长度

  for(i=1;i<=a[0];i++)  //把第一个字符串转换为整数,存放在数组a中

    a[i]=str1[a[0]-i]-'0';

  b[0]=str2.length();   //取得第二个字符串长度

  for(i=1;i<=b[0];i++)   //把第二个字符串中的每一位转换为整数,存放在数组B中

    b[i]=str2[b[0]-i]-'0';

  len=(a[0]>b[0]?a[0]:b[0]);   //取两个字符串最大的长度

  for(i=1;i<=len;i++)   //做按位加法,同时处理进位

  {

    a[i]+=b[i];

    a[i+1]+=a[i]/10;

    a[i]%=10;   

  }

  len++;    //下面是去掉最高位的0,然后输出。

  while((a[len]==0)&&(len>1)) len--;

  for(i=len;i>=1;i--)

    cout<<a[i];

  return 0; 

}

 

注意:两个数相加,结果的位数,应该比两个数中大的那个数多一位。

 

七、高精度减法

#include

using namespace std;

int compare(string s1,string s2);

int main()

{

  string str1,str2;

  int a[250],b[250],len;

  int i;

  memset(a,0,sizeof(a));

  memset(b,0,sizeof(b));

  cin>>str1>>str2;

  a[0]=str1.length();

  for(i=1;i<=a[0];i++)

    a[i]=str1[a[0]-i]-'0';

  b[0]=str2.length();

  for(i=1;i<=b[0];i++)

    b[i]=str2[b[0]-i]-'0';

  if((compare(str1,str2))==0)  //大于等于,做按位减,并处理借位。

  {

    for(i=1;i<=a[0];i++)

      {a[i]-=b[i];

       if (a[i]<0) {a[i+1]--;a[i]+=10;}

      }

    a[0]++;

    while((a[a[0]]==0)&&(a[0]>1)) a[0]--;

    for(i=a[0];i>=1;i--)

      cout<<a[i];

    cout<<endl; 

  }                          

  else

  {

    cout<<'-';  //小于就输出负号

    for(i=1;i<=b[0];i++)  //做按位减,大的减小的

      {b[i]-=a[i];

       if (b[i]<0) {b[i+1]--;b[i]+=10;}

      }

    b[0]++;

    while((b[b[0]]==0)&&(b[0]>1)) b[0]--;

    for(i=b[0];i>=1;i--)

      cout<<b[i];

    cout<<endl;        

  }

  return 0; 

}

int compare(string s1,string s2)  //比较字符串(两个数)数字的大小,大于等于返回0,小于返回1。

{

  if(s1.length()>s2.length()) return 0;  //先比较长度,哪个字符串长,对应的那个数就大

  if(s1.length()

  for(int i=0;i<=s1.length();i++)  //长度相同时,就一位一位比较。

  {

    if(s1[i]>s2[i]) return 0;

    if(s1[i]

  }

  return 0;   //如果长度相同,每一位也一样,就返回0,说明相等

}

 

做减法时,首先要判断两个字符串的大小,决定是否输出负号,然后就是按位减法,注意处理借位。

 

八、高精度乘法

#include

#include

using namespace std;

int main()

{

  string str1,str2;

  int a[250],b[250],c[500],len;    //250位以内的两个数相乘

  int i,j;

  memset(a,0,sizeof(a));

  memset(b,0,sizeof(b));

  cin>>str1>>str2;

  a[0]=str1.length();

  for(i=1;i<=a[0];i++)

    a[i]=str1[a[0]-i]-'0';

  b[0]=str2.length();

  for(i=1;i<=b[0];i++)

    b[i]=str2[b[0]-i]-'0';

  memset(c,0,sizeof(c));

  for(i=1;i<=a[0];i++)   //做按位乘法同时处理进位,注意循环内语句的写法。

    for(j=1;j<=b[0];j++)

    {

    c[i+j-1]+=a[i]*b[j];

    c[i+j]+=c[i+j-1]/10;

    c[i+j-1]%=10;   

    }

  len=a[0]+b[0]+1;  //去掉最高位的0,然后输出

  while((c[len]==0)&&(len>1)) len--;   //为什么此处要len>1??

  for(i=len;i>=1;i--)

    cout<<c[i];

  return 0; 

}

 

注意:两个数相乘,结果的位数应该是这两个数的位数和减1。

优化:万进制

#include

#include

using namespace std;

void num1(int s[],string st1);

int a[2501],b[2501],c[5002];//此处可以进行2500位万进制乘法,即10000位十进制乘法。

Int main()

 

    string str1,str2;

    int len;

    cin>>str1>>str2;

    memset(a,0,sizeof(a));

    memset(b,0,sizeof(b));

    memset(c,0,sizeof(c));

    num1(a,str1); //把str1从最低位开始,每4位存放在数组a中

    num1(b,str2); //把str2从最低位开始,每4位存放在数组b中

    for(int i=1;i<=a[0];i++) //作按位乘法并处理进位,此处是万进制进位

      for(int j=1;j<=b[0];j++)

        {

          c[i+j-1]+=a[i]*b[j];


          c[i+j]+=c[i+j-1]/10000;

          c[i+j-1]%=10000;

        }

    len=a[0]+b[0];//a[0]和b[0]存放的是每个数按4位处理的位数

    while ((c[len]==0)&&(len>1)) len--;//去掉高位的0,并输出最高位

      cout<<c[len];

    for(int i=len-1;i>=1;i--)//把剩下来的每一位还原成4位输出

      {

        if (c[i]<1000) cout<<’0’;

        if (c[i]<100) cout<<’0’;

        if (c[i]<10) cout<<’0’;        

        cout<<c[i];

      }

    cout<<endl;

    return 0;

}

void num1(int s[],string st1)//此函数的作用就是把字符串st1,按4位一组存放在数组s中

  int k=1,count=1;

    s[0]=st1.length();//存放st1的长度,省去一长度变量

    for(int i=s[0]-1;i>=0;i--) //从最低位开始,处理每一位

    { if (count%4==0) {s[k]+=(st1[i]-‘0’)*1000; if(i!=0) k++;}

      if (count%4==1) s[k]=(st1[i]-‘0’);

      if (count%4==2) s[k]+=(st1[i]-‘0’)*10;

      if (count%4==3) s[k]+=(st1[i]-‘0’)*100;

      count++;

    }

    s[0]=k; //存放数组的位数,就是按4位处理后的万进制数的位数。  

    Return;

}

PS:除法参考乘法

原创粉丝点击