高精度计算

// 高精度加法
#include<iostream>
#include<cstring>
using namespace std;
int* strtoint(char *str)
{
    int i,len=strlen(str);
    int* a=new int[(len+1)*sizeof(int)];
    for(i=0;i<len;i++)
        a[i]=(int)str[len-i-1]-48;
    return a;
}
char* inttostr(int* a,int n)
{
    int i;
    char* str=new char[(n+1)*sizeof(char)];
    for(i=0;i<n;i++)
        str[i]=(char)a[n-i-1]+48;
    str[n]='\0';
    return str;
}
int check(int* a,int n)
{
    int k=0,len=n;
    while(a[len-1]==0&&len>1)
        len--;
    for(k=0;k<len;k++)
    if(a[k]>=10)
    {
       a[k+1]=a[k+1]+a[k]/10;
       a[k]=a[k]%10;
    }
    if(a[k]!=0)
        len=k+1;
    return len;
}
char* addition(char* m1,char* m2)
{
  int i,len1,len2,len,c=0;
  int* t1,*t2;
  len1=strlen(m1);
  len2=strlen(m2);
  len=(len1>=len2)?len1:len2;
  t1=new int[(len+2)*sizeof(int)];
  t2=new int[(len+2)*sizeof(int)];
  t1=strtoint(m1);
  t2=strtoint(m2);
  for(i=len1;i<len+1;i++)
    t1[i]=0;
  for(i=len2;i<len+1;i++)
    t2[i]=0;
  for(i=0;i<len;i++)
    t1[i]+=t2[i];
    len=check(t1,len);
    return inttostr(t1,len);
}
int main()
{
    char m1[1000],m2[1000];
    while(cin>>m1>>m2)
    cout<<addition(m1,m2)<<endl;
    return 0;
}
//高精度乘法
#include<iostream>
#include<cstring>
using namespace std;
int* strtoint(char* str)
{
    int i,len;
    len=strlen(str);
    int* a=new int[(len+1)*sizeof(int)];
    for(i=0;i<len;i++)
    a[i]=(int)str[len-i-1]-48;
    return a;
}
char* inttostr(int* a,int n)
{
    char* str=new char[(n+1)*sizeof(char)];
    for(int i=0;i<n;i++)
    str[i]=(char)a[n-i-1]+48;
    str[n]='\0';
    return str;
}
int check(int* a,int n)
{
    int k,len=n;
    while(a[len-1]==0&&len>1)
          len--;
    for(k=0;k<len;k++)
    {
        a[k+1]+=a[k]/10;
        a[k]%=10;
    }
    if(a[k]!=0)
        len=k+1;
    return len;
}

char* multiply(char* m1,char* m2)
{
    int i,j,len1,len2,len,c=0,*t1,*t2,*prod;
    len1=strlen(m1);
    len2=strlen(m2);
    len=len1+len2;
    t1=new int[(len1+1)*sizeof(int)];
    t2=new int[(len2+1)*sizeof(int)];
    prod=new int[(len+1)*sizeof(int)];
    t1=strtoint(m1);
    t2=strtoint(m2);
    for(i=0;i<len+1;i++)
        prod[i]=0;
    for(i=0;i<len1;i++)
        for(j=0;j<len2;j++)
        prod[i+j]+=t1[i]*t2[j];
    len=check(prod,len);
    return inttostr(prod,len);
}
int main()
{
    char m1[1000],m2[1000];
    while(cin>>m1>>m2)
      cout<<multiply(m1,m2)<<endl;
    return 0;
}
// 高精度减法
#include<iostream>
#include<cstring>
using namespace std;
int* strtoint(char* str)
{
    int len,i;
    len=strlen(str);
    int* a=new int[(len+1)*sizeof(int)];
    for(i=0;i<len;i++)
        a[i]=(int)str[len-i-1]-48;
    return a;
}
char* inttostr(int* a,int n)
{
    char* str=new char[(n+1)*sizeof(int)];
    for(int i=0;i<n;i++)
        str[i]=(char)a[n-i-1]+48;
        str[n]='\0';
    return str;
}
int check(int* a,int n)
{
    int i,len=n;
     while(len>1&&a[len-1]==0)
        len--;
     for(i=0;i<len;i++)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        if(a[i]!=0)
            len=i+1;
        return len;
}
char* subtract(char *m1,char *m2)
{
    int i,len1,len2,len,c=0,*t1,*t2,cf=0;
    char* temp,* csub;
    len1=strlen(m1);
    len2=strlen(m2);
    len=(len1>=len2)?len1:len2;
    t1=new int[(len+2)*sizeof(int)];
    t2=new int[(len+3)*sizeof(int)];
    temp=new char[(len+2)*sizeof(char)];
    csub=new char[(len+2)*sizeof(char)];
    if((len>len1)||(len2==len1)&&strcmp(m1,m2)<0)
    {// 当被减数小于减数时
        strcpy(temp,m1);
        strcpy(m1,m2);
        strcpy(m2,temp);
        cf=1;
        len1=strlen(m1);  //注意此时m1与m2已交换
        len2=strlen(m2);
    }
    t1=strtoint(m1);
    t2=strtoint(m2);
    for(i=len1;i<len;i++)
        t1[i]=0;  //缺位前导补0
    for(i=len2;i<len;i++)
        t2[i]=0;   //缺位前导补0
    for(i=0;i<len;i++)
    {   //减法过程
        if(t1[i]>=t2[i])
            t1[i]-=t2[i];
        else {
            t1[i]-=t2[i];
            c=(t1[i]*(-1)/10+1);
            t1[i]+=10*c;
            t1[i+1]-=c;
        }
    }
    int n=i,begin=0;
    while(t1[n-1]==0&&n>1)
        n--;
    if(cf==1)    //若差为负数
    {
        csub[0]='-';
        n++;
        begin=1;
    }
    for(i=begin;i<n;i++)
        csub[i]=(char)t1[n-i-1]+48;
       csub[n]='\0';
       return csub;
}
int main()
{
    char m1[1000],m2[1000];
      while(cin>>m1>>m2)
        cout<<subtract(m1,m2)<<endl;
    return 0;
}



				
时间: 2024-11-13 09:10:37

高精度计算的相关文章

编程c语言-用反三角函数高精度计算Pai值

问题描述 用反三角函数高精度计算Pai值 用反三角函数高精度计算Pai值,用C语言编程实现,有木有源程序啊 解决方案 http://www.zhishizhan.net/doc-894aXe84b78572c4fd79f.html 解决方案二: 不过我想知道的是用反三角函数高精度求Pai的值,需要用C语言编程实现的

GNU MP 5.0.5发布 高精度计算库

GMP 是一款高精度计算.符号整数.有理数和浮点数操作的数学计算库.该库没有精度的限制,除了隐式的可用内存.它拥有一套普通界面的丰富函数,其目的是为小型或巨大的运算对象提供更快速的运算,速度可达到fullwords使用的基本算术类型,通过使用大量CPU最常见的内循环优化的汇编代码的快速算法. GNU MP 5.0.5该版本变更了有限的各种安全漏洞修复和可移植性改善. 软件信息:http://gmplib.org/gmp5.0.html 下载地址:ftp://ftp.gnu.org/gnu/gmp

android微信支付问题总结

首先我们先看一个android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1  当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试android微信的组件(微信分享.微信支付等)的时候,一定要用你自己的keystore签名出来测试,如果用debug.keystore肯定是不成功的! 本文部分内容转自:http://blog.csdn.net/baidu_17508977/article/details/44517283 1,在微信开放

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

UVa 748/POJ 1001 Exponentiation:浮点高精度求幂&amp;amp;正则表达式的应用

748 - Exponentiation Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=97&page=show_problem&problem=689 http://poj.org/problem?id=1001 Problems involving the computation of exact values

阶乘相关的算法及其C++实现

       有关阶乘的算法,不外乎两个方面:一是高精度计算:二是与数论相关. 一. 高精度计算阶乘 这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算. 首先看小于等于12的阶乘计算(计算结果不会超出32位范围): int factorial(int n) { if (n == 1 || n == 0) return 1; return factorial(n-1)*n; } 这个递归程序简单明了,非常直观,然而一旦n > 12,则超过32位int型的范围出现错误结

第2章 一切都为对象

这一章介绍Java编程中一些基本的概念,有一些自己以前不知道的细节,加粗标出. 2.1 用引用操纵对象 Java中一切都视为对象,但操纵的标识符实际上是对象的一个"引用"(reference). 2.2 必须由你创建所有对象 1. 创建了一个引用后,需要用new操作符使它与一个新的对象关联. 2. 打脸说一下特例:基本类型boolean,char,byte,short,int,long,float,double,void 对经常使用的一系列类型,Java给予了特殊对待,不用new来创建

for-求问高精度算法内语句的意思?

问题描述 求问高精度算法内语句的意思? 这段程序中 语句 if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */ if(b2[0]==45) { bn--; fb=-1;bi=0;} 是什么意思求大神讲解谢谢 #include #include #include #include int anbnfa=1fb=1; /* 把anbnk设为全局变量an纪录第一个高精度数组的位数bn纪录第二个高精度数组的位数k纪录输出结果的位数*/ char b1[250]

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford