码迷,mamicode.com
首页 > 其他好文 > 详细

高精度

时间:2018-03-08 00:06:12      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:fine   else   ios   stdout   cin   stdin   vector   i++   减法   

#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 <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; 
}

 

高精度乘法,很简单。

高精度

标签:fine   else   ios   stdout   cin   stdin   vector   i++   减法   

原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8525177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!