高精度

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstdlib>
#define N 2333
#define zxy(i , a , b) for(int i = a ; i <= b ; i ++)
#define yxz(i , a , b) for(int i = a ; i >= b ; i --)
#define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++)
#define yxzyxz(i , a , b) for(int i = a ; i > b ; i --)
using namespace std;
int read()
{
    int ans = 0;
    char ch = getchar(),last = ' ';
    while(ch < '0' || ch > '9')
        last = ch , ch = getchar();
    while(ch >= '0' && ch <= '9')
        ans = ans * 10 +ch - '0' , ch = getchar();
    if(last == '-')
        ans = -ans;
    return ans; 
} 
void put(int x) {
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    if(x == 0) {
        putchar('0');
        return;
    }
    int q[100] , nn = 0;
    while(x)
        q[++ nn] = x % 10 , x /= 10;
    while(nn)
        putchar('0' + q[nn]), --nn;
}
int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j;
char s[N],s1[N],s2[N];
int main()
{
    freopen("bigadd.in","r",stdin);
    freopen("bigadd.out","w",stdout);
    scanf("%s",s1);
    scanf("%s",s2);
    n1 = strlen(s1);
    n2 = strlen(s2);
    for(i = 0 ; i < n1 ; i ++)
        a[i] = (int)s1[n1 - i - 1] - (int)'0';
    for(i = 0 ; i < n2 ; i ++)
        b[i] = (int)s2[n2 - i - 1] - (int)'0';
    for(i = 0 ; i < n1 ; i ++)
    {
        x = 0;
        c[i] += a[i] + b[i] + x;
        x = c[i] / 10;
        c[i] = c[i] % 10;
        c[i + 1] = x;
    }
    n3 = n1 + n2;
    while(c[n3] == 0 && n3 > 0) 
        n3--;
    yxz(i , n3 , 0)
        put(c[i]);
    return 0;
}

emmm……在循环加法的时候只循环了第一位数,所以只要有第二个数的位数大于第一个就j了。23333

 另一种高精度加法:

#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct node//定义一个结构体,用来储存一个数的位数和每一位上的数
{
    int len,a[1000];
    node()//初始化结构体
    {
        len=0;
        memset(a,0,sizeof(a));
    }
};
node jiafa(node n1,node n2)//定义新的函数“jiafa”,用来进行高精度计算
{
//初始化    
  node n0;
    n0.len=max(n1.len,n2.len);//n0的长度一定是大于等于最长的那个位数,所以要初始为这个值
//模拟加法,但先不进位
    for(int i=1;i<=n0.len;i++)
        n0.a[i]=n1.a[i]+n2.a[i];
//加完了,统一进位
    for(int i=1;i<=n0.len;i++)
    {
        n0.a[i+1]+=n0.a[i]/10;
        n0.a[i]%=10;
    }
//研究最高位是哪位
    int i=n0.len;
    while(n0.a[i+1]>0)
    {
        i++;
        n0.a[i+1]+=n0.a[i]/10;
        n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1))
        i--;
    n0.len=i;
    return n0;
}
int main()
{
    char st[1010];
    node n1,n2,n0;
    scanf("%s",st+1);//输入字符串,从第一个位置开始存
    n1.len=strlen(st+1);//
    for(int i=1;i<=n1.len;i++)//降序排列放入数组,便于进位
        n1.a[n1.len-i+1]=st[i]-'0';    
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
        n2.a[n2.len-i+1]=st[i]-'0';    
    n0=jiafa(n1,n2);
    for(int i=n0.len;i>=1;i--)//反着输出,因为是降序存入
        printf("%d",n0.a[i]);
    return 0;
}

 

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstdlib>
#define N 2333
#define zxy(i , a , b) for(int i = a ; i <= b ; i ++)
#define yxz(i , a , b) for(int i = a ; i >= b ; i --)
#define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++)
#define yxzyxz(i , a , b) for(int i = a ; i > b ; i --)
using namespace std;
int read()
{
    int ans = 0;
    char ch = getchar(),last = ' ';
    while(ch < '0' || ch > '9')
        last = ch , ch = getchar();
    while(ch >= '0' && ch <= '9')
        ans = ans * 10 +ch - '0' , ch = getchar();
    if(last == '-')
        ans = -ans;
    return ans; 
} 
void put(int x) {
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    if(x == 0) {
        putchar('0');
        return;
    }
    int q[100] , nn = 0;
    while(x)
        q[++ nn] = x % 10 , x /= 10;
    while(nn)
        putchar('0' + q[nn]), --nn;
}
int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j;
char s[N],s1[N],s2[N];
int main()
{
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    scanf("%s",s1);
    scanf("%s",s2);
    n1 = strlen(s1);
    n2 = strlen(s2);
    for(i = 0 ; i < n1 ; i ++)
        a[i] = (int)s1[n1 - i - 1] - (int)'0';
    for(i = 0 ; i < n2 ; i ++)
        b[i] = (int)s2[n2 - i - 1] - (int)'0';
    for(i = 0 ; i < n1 ; i ++)
    {
        if(a[i] < b[i])
            a[i] += 10,a[i + 1] = a[i + 1] - 1;
        c[i] = a[i] - b[i];
    }
    n3 = n1 + n2;
    while(c[n3] == 0 && n3 > 0) 
        n3--;
    yxz(i , n3 , 0)
        put(c[i]);
    return 0;
}

这个高精度减法是删减版,有负数的情况还没判断,所以只要判断一下就行:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <string> 
#define N 2333
#define zxy(i , a , b) for(int i = a ; i <= b ; i ++)
#define yxz(i , a , b) for(int i = a ; i >= b ; i --)
#define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++)
#define yxzyxz(i , a , b) for(int i = a ; i > b ; i --)
using namespace std;
int read()
{
    int ans = 0;
    char ch = getchar(),last = ' ';
    while(ch < '0' || ch > '9')
        last = ch , ch = getchar();
    while(ch >= '0' && ch <= '9')
        ans = ans * 10 +ch - '0' , ch = getchar();
    if(last == '-')
        ans = -ans;
    return ans; 
} 
void put(int x) {
    if(x < 0) {
        putchar('-');
        x = -x;
    }
    if(x == 0) {
        putchar('0');
        return;
    }
    int q[100] , nn = 0;
    while(x)
        q[++ nn] = x % 10 , x /= 10;
    while(nn)
        putchar('0' + q[nn]), --nn;
}
char sa[N],sb[N]; 
int a[N],b[N],c[N]; 
int alen,blen,clen,i,j; 
int cmp(string a,string b)
{
    if(strlen(sa)>strlen(sb))return 1;
    else if(strlen(sa)<strlen(sb))return -1;
    else
    {
        int i,l=strlen(sa);
        for(i=0;i<l;i++)
        {
            if(sa[i]>sb[i])return 1;
            else if(sa[i]<sb[i])return -1;
        }
    }
    return 0;
}
int main() 
{ 
    cin>>sa>>sb; 
    if(cmp(sa,sb)==0)
    {
        put(0);
        return 0;
    }
    else if(cmp(sa,sb)==-1)
    {
        cout<<'-';
        char t[N];
        strcpy(t,sa);
        strcpy(sa,sb);
        strcpy(sb,t);
    }
    alen=strlen(sa); 
    blen=strlen(sb); 
    clen=max(alen,blen); 
    for(i=0;i<alen;i++) 
        a[alen-i]=sa[i]-'0'; 
    for(i=0;i<blen;i++)
        b[blen-i]=sb[i]-'0'; 
    for(i=1;i<=clen;i++)
        c[i]=a[i]-b[i];
    for(i=1;i<=clen;i++)
        if(c[i]<0)
            c[i]+=10,c[i+1]--;
    while(c[clen]==0&&clen>1)clen--;
    for(i=clen;i>=1;i--) 
        put(c[i]); 
    cout<<endl; 
}

 

高精度乘法,很简单。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
#define zxy(i , a , b)    for(int i = a ; i <= b ; i ++)
#define zxyzxy(i , a , b)    for(int i = a ; i < b ; i ++)
#define yxz(i , a , b)    for(int i = a ; i >= b ; i --)
#define yxzyxz(i , a , b)    for(int i = a ; i > b ; i --)
#define N 2333
int read()
{
    int ans = 0;
    char ch = getchar(),last = ' ';
    while(ch < '0' || ch > '9')
        last = ch , ch = getchar();
    while(ch >= '0' && ch <= '9')
        ans = ans * 10 +ch - '0' , ch = getchar();
    if(last == '-')
        ans = -ans;
    return ans;
}
void put(int x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if(x == 0)
    {
        putchar('0');
        return;
    }
    int q[100] , nn = 0;
    while(x)
        q[++ nn] = x % 10 , x /= 10;
    while(nn)
        putchar('0' + q[nn]), --nn;
}
int a[N],b[N],c[N];
char s1[N],s2[N];
int main ()
{
    int n1 , n2 , n3 , x , i , j;
    scanf("%s",s1);
    scanf("%s",s2);
    n1 = strlen(s1);
    n2 = strlen(s2);
    for(i = 0 ; i < n1 ; i ++)
        a[i] = (int)s1[n1 - i - 1] - (int)'0';
    for(i = 0 ; i < n2 ; i ++)
        b[i] = (int)s2[n2 - i - 1] - (int)'0';
    for(i = 0 ; i < n1 ; i ++)
    {
        x = 0;
        for(j = 0 ; j < n2 ; j ++)
        {
            c[i + j] += a[i] * b[j] + x;
            x = c[i + j] / 10;
            c[i + j] = c[i + j] % 10;
        }
        c[i + j] = x;
    }
    n3 = n2 + n1;
    while(c[n3] == 0 && n3 > 0) 
        n3--;
    yxz(i , n3 , 0)
        put(c[i]);
    return 0;
}

 

高精度阶乘,也很简单。‘

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
#define zxy(i , a , b)    for(int i = a ; i <= b ; i ++)
#define zxyzxy(i , a , b)    for(int i = a ; i < b ; i ++)
#define yxz(i , a , b)    for(int i = a ; i >= b ; i --)
#define yxzyxz(i , a , b)    for(int i = a ; i > b ; i --)
#define N 2333
int read()
{
    int ans = 0;
    char ch = getchar(),last = ' ';
    while(ch < '0' || ch > '9')
        last = ch , ch = getchar();
    while(ch >= '0' && ch <= '9')
        ans = ans * 10 +ch - '0' , ch = getchar();
    if(last == '-')
        ans = -ans;
    return ans;
}
void put(int x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if(x == 0)
    {
        putchar('0');
        return;
    }
    int q[100] , nn = 0;
    while(x)
        q[++ nn] = x % 10 , x /= 10;
    while(nn)
        putchar('0' + q[nn]), --nn;
}
int a[N],b[N];
int main ()
{
    int n,t,i,j,k;
    n = read();
    a[1] = 1;
    for (i = 1 ; i <= n ; i ++)
    {
            for (j = 1 ; j <= 1001 ; j ++)
                a[j] *= i;
            for (k = 1 ; k <= 1001 ; k ++)
            {
                a[k + 1] += a[k] / 10;
                a[k] %= 10;
            }
    }
    i = 1001;
    while (a[i] == 0) 
        i--;
    for (j = i ; j >= 1 ; j--)
        put(a[j]);
    return 0;
}

 

高精度除法:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
#define zxy(i , a , b)    for(int i = a ; i <= b ; i ++)
#define zxyzxy(i , a , b)    for(int i = a ; i < b ; i ++)
#define yxz(i , a , b)    for(int i = a ; i >= b ; i --)
#define yxzyxz(i , a , b)    for(int i = a ; i > b ; i --)
#define N 2333
int read()
{
    int ans = 0;
    char ch = getchar(),last = ' ';
    while(ch < '0' || ch > '9')
        last = ch , ch = getchar();
    while(ch >= '0' && ch <= '9')
        ans = ans * 10 +ch - '0' , ch = getchar();
    if(last == '-')
        ans = -ans;
    return ans;
}
void put(int x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if(x == 0)
    {
        putchar('0');
        return;
    }
    int q[100] , nn = 0;
    while(x)
        q[++ nn] = x % 10 , x /= 10;
    while(nn)
        putchar('0' + q[nn]), --nn;
}
//函数SubStract功能:
//用长度为len1的大整数p1减去长度为len2的大整数p2
// 结果存在p1中,返回值代表结果的长度
//不够减 返回-1 正好够 返回0
int SubStract( int *p1, int *p2, int len1, int len2 )
{
    int i;
    if( len1 < len2 )
        return -1;
    if( len1 == len2 )
    {
        //判断p1 > p2
        for( i = len1 - 1 ; i >= 0 ; i-- )
        {
            if( p1[i] > p2[i] )   //若大,则满足条件,可做减法
                break;
            else if( p1[i] < p2[i] ) //否则返回-1
                return -1;
        }
    }
    for( i = 0 ; i <= len1 - 1 ; i++ )   //从低位开始做减法
    {
        p1[i] -= p2[i];
        if( p1[i] < 0 )          //若p1<0,则需要借位
        {
            p1[i] += 10;         //借1当10
            p1[i+1]--;           //高位减1
        }
    }
    for( i = len1 - 1 ; i >= 0 ; i-- )       //查找结果的最高位
        if( p1[i] )                  //最高位第一个不为0
            return (i+1);       //得到位数并返回
    return 0;                  //两数相等的时候返回0
}
int main()
{
    int n, k, i, j;             //n:测试数据组数
    int len1, len2;             //大数位数
    int nTimes;                 //两大数相差位数
    int nTemp;                  //Subtract函数返回值
    int num_a[N];          //被除数
    int num_b[N];          //除数
    int num_c[N];          //
    char str1[N + 1];      //读入的第一个大数
    char str2[N + 1];      //读入的第二个大数
    n = read();
    while ( n-- > 0 )
    {
        scanf("%s", str1);        //以字符串形式读入大数
        scanf("%s", str2);
        for ( i = 0 ; i < N ; i++ )   //初始化清0
        {
            num_a[i] = 0;
            num_b[i] = 0;
            num_c[i] = 0;
        }
        len1 = strlen(str1);  //获得大数的位数
        len2 = strlen(str2);
        for( j = 0 , i = len1 - 1 ; i >= 0 ; j++ , i-- )
            num_a[j] = str1[i] - '0';  //将字符串转换成对应的整数,颠倒存储
        for( j = 0 , i = len2 - 1 ; i >= 0 ; j++ , i-- )
            num_b[j] = str2[i] - '0';
        if( len1 < len2 )   //如果被除数小于除数,结果为0
        {
            printf("0\n");
            continue;   //利用continue直接跳出本次循环。 进入下一组测试
        }
        nTimes = len1 - len2;    //相差位数
        for ( i = len1 - 1 ; i >= 0 ; i-- )    //将除数扩大,使得除数和被除数位数相等
        {
            if ( i >= nTimes )
                num_b[i] = num_b[i - nTimes];
            else                     //低位置0
                num_b[i] = 0;
        }
        len2 = len1;
        for( j = 0 ; j <= nTimes ; j++ )      //重复调用,同时记录减成功的次数,即为商
        {
            while((nTemp = SubStract(num_a,num_b + j,len1,len2 - j)) >= 0)
            {
                len1 = nTemp;      //结果长度
                num_c[nTimes - j]++;//每成功减一次,将商的相应位加1
            }
        }
        //输出结果
        for( i = N-1 ; num_c[i] == 0 && i >= 0 ; i-- );//跳过高位0
        if( i >= 0 )
            for( ; i >= 0 ; i-- )
                printf("%d", num_c[i]);
        else
            printf("0");
        printf("\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Zhoier-Zxy/p/8525177.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值