1. 程式人生 > >整數大數模擬 高精度加法 高精度減法 高精度乘法 高精度除法 c/c++ java

整數大數模擬 高精度加法 高精度減法 高精度乘法 高精度除法 c/c++ java

描述
請計算a與b加減乘除的結果。a與b的值不超過100位,且為整數。
輸入
第一行,用例數T。
第二行,整數n,(1,2,3,4)分別表示加減乘除。
第三行,整數a與b。
輸出
輸出a與b計算後的值。(除法只需保留整數位)。
樣例輸入
4
1
1 2
2
10 8
3
4 5
4
8 5
樣例輸出
3
2
20
1

分析:模擬題,這裡分java與c兩種寫法。

c/c++版:

#include<iostream>
#include<stdio.h>
#include<string.h>
#define Len 1000//大數的長度
using namespace std;
int fa,fb;//a,b的符號,1為負

char *add(char a[],char b[])
{
    int i,j,za[Len]={0},zb[Len]={0};
    int c[Len]={0};
    int k=0,la=strlen(a),lb=strlen(b);
    int len=la>lb?la:lb;
    for(i=la-1;i>=0;i--)
        za[k++]=a[i]-'0';
    k=0;
    for(i=lb-1;i>=0;i--)
        zb[k++]=b[i]-'0';
    for(i=0;i<len;i++)
        c[i]=za[i]+zb[i];
    for(i=0;i<Len;i++)
    {
        if(c[i]>=10)
        {
            c[i]-=10;
            c[i+1]++;
        }
    }
    //將答案返回成字串
    char ans[Len];
    k=0;
    for(i=Len-1;i>0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}

char *sub(char a[],char b[])
{
    int i,j,za[Len]={0},zb[Len]={0};
    int c[Len]={0};
    int k=0,la=strlen(a),lb=strlen(b);
    int len=la>lb?la:lb;
    for(i=la-1;i>=0;i--)
        za[k++]=a[i]-'0';
    k=0;
    for(i=lb-1;i>=0;i--)
        zb[k++]=b[i]-'0';
    //-------就這一部分不同----------
    for(int i=0;i<Len;i++)
    {
        if(za[i]-zb[i]<0)
        {
            za[i]+=10;
            za[i+1]--;
        }
        c[i]=za[i]-zb[i];
    }
    //--------------------------------

    //將答案返回成字串
    char ans[Len];
    k=0;
    for(i=Len-1;i>0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}

char *mul(char a[],char b[])
{
    int i,j,za[Len]={0},zb[Len]={0};
    int c[Len]={0};
    int k=0,la=strlen(a),lb=strlen(b);
    int len=la>lb?la:lb;
    for(i=la-1;i>=0;i--)
        za[k++]=a[i]-'0';
    k=0;
    for(i=lb-1;i>=0;i--)
        zb[k++]=b[i]-'0';

    for(int i=0;i<la;i++)
    {
        for(int j=0;j<lb;j++)
        {
            c[i+j]+=za[i]*zb[j];
            if(c[i+j]>=10)
            {
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
    }
    //將答案返回成字串
    char ans[Len];
    k=0;
    for(i=Len-1;i>0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}
int pd(char a[],char b[])
{
    int la=strlen(a),lb=strlen(b);
    if(la>lb) return 1;
    if(la==lb&&strcmp(a,b)>0) return 1;
    if(la==lb&&strcmp(a,b)==0) return 0;
    return -1;
}

char *div(char a[],char b[])
{
    //直接減,優化
    char ans[Len]="0";
    //加數,減數
    char jiashu[Len]="1";
    char jianshu[Len];
    strcpy(jianshu,b);
    int k,i,j;

    while(pd(a,jianshu)>0)
    {
        int l=strlen(jianshu);
        jianshu[l]='0';
        jianshu[l+1]=0;
        l=strlen(jiashu);
        jiashu[l]='0';
        jiashu[l+1]=0;
    }


    while(pd(a,b)>=0)
    {
        while(pd(a,jianshu)<0)
        {
            int l=strlen(jianshu);
            jianshu[l-1]=0;
            l=strlen(jiashu);
            jiashu[l-1]=0;
        }
        strcpy(a,sub(a,jianshu));
        strcpy(ans,add(ans,jiashu));


    }
    return ans;
}

int main()
{
    char a[Len],b[Len],c[Len];
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        fa=fb=0;
        scanf("%d",&n);
        scanf("%s %s",a,b);
        if(a[0]=='-')
        {
            fa=1;
            strcpy(a,a+1);
        }
        if(b[0]=='-')
        {
            fb=1;
            strcpy(b,b+1);
        }
        //加法
        if(n==1)
        {
            //如果符號不同
            if(fa!=fb)
            {
                //如果a為正
                if(fa==0)
                {
                    //如果a的絕對值比b大(減法只能處理a>b的情況)
                    if(pd(a,b)>=0)
                    {
                        //處理-0的情況
                        if(strcmp(sub(b,a),"0")==0)
                            printf("0\n");
                        else
                            printf("-%s\n",sub(b,a));
                    }

                    else
                        printf("%s\n",sub(a,b));
                }
                else
                {
                    if(pd(b,a)>=0)
                        printf("%s\n",sub(b,a));
                    else
                    {
                        if(strcmp(sub(a,b),"0")==0) printf("0\n");
                        else printf("-%s\n",sub(a,b));
                    }

                }
            }
            else
            {
                //如果符號都為正
                if(fa==0)
                    printf("%s\n",add(a,b));
                else
                    printf("-%s\n",add(a,b));
            }
        }
        //減法
        else if(n==2)
        {
            //如果符號不同
            if(fa!=fb)
            {
                //如果a為正
                if(fa==0)
                    printf("%s\n",add(a,b));
                else
                    printf("-%s\n",add(a,b));
            }
            else
            {
                //如果都為正
                if(fa==0)
                {
                    if(pd(a,b)<0)
                        printf("-%s\n",sub(b,a));
                    else
                        printf("%s\n",sub(a,b));
                }
                else
                {
                    if(pd(b,a)>=0)
                        printf("%s\n",sub(b,a));
                    else
                        printf("-%s\n",sub(a,b));
                }
            }
        }
        //乘法
        else if(n==3)
        {
            if(strcmp("0",a)==0||strcmp("0",b)==0)
            {
                printf("0\n");
                continue;
            }
            if(fa==fb)
                printf("%s\n",mul(a,b));
            else
                printf("-%s\n",mul(a,b));
        }
        //除法
        else if(n==4)
        {
            if(pd(a,b)<0)
            {
                printf("0\n");
                continue;
            }
            if(fa==fb)
                printf("%s\n",div(a,b));
            else
                printf("-%s\n",div(a,b));
        }
    }
    return 0;
}
java 版:
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        BigInteger a,b;
        int T,n;
        T=in.nextInt();
        for(int i=0;i<T;i++){
            n=in.nextInt();
            a=in.nextBigInteger();
            b=in.nextBigInteger();
            if(n==1) System.out.println(a.add(b));
            if(n==2) System.out.println(a.add(b.negate()));
            if(n==3) System.out.println(a.multiply(b));
            if(n==4) System.out.println(a.divide(b));
        }
        in.close();
    }

}



相關推薦

整數大數模擬 精度加法 精度減法 精度乘法 精度除法 c/c++ java

描述 請計算a與b加減乘除的結果。a與b的值不超過100位,且為整數。 輸入 第一行,用例數T。 第二行,整數n,(1,2,3,4)分別表示加減乘除。 第三行,整數a與b。 輸出 輸出a與b計算後的值。(除法只需保留整數位)。 樣例輸入 4 1 1 2 2 10 8 3 4

精度】簡單精度加法大數加法

問題 B: 【高精度】簡單高精度加法 時間限制: 1 Sec  記憶體限制: 64 MB 題目描述 修羅王解決了計算機的記憶體限制問題,終於可以使用電腦進行大型的魔法運算了,他交給邪狼的第一個任務是計算兩個非負整數A、B的和,其中A和B的位數在50

精度加法(1168:大整數加法

參照了題中的資料可能有多餘的前導0的情況。#include<iostream> #include<cstring> #include<cstdio> using namespace std; int c[205]; char a[205],

c++實現精度加法

strlen 數位 cout col 代碼 code pre 操作數 eof c++實習高精度加法 最近遇到一個c++實現高精度加法的問題,高精度問題往往十復雜但發現其中的規律後發現並沒有那麽復雜,這裏我實現了一個整數的高精度加法,主要需要註意以下幾點: 1:將所需

刷題總結——regular words(hdu1502 dp+精度加法+壓位)

name cab str output desc ets ces word ctype 題目: Problem Description Consider words of length 3n over alphabet {A, B, C} . Denote the num

藍橋杯基礎練習 精度加法

pre 基礎 格式 比較 計算 所有 一個數 bit i++ 問題描述   輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 算法描述   由於a和b都比較大,所以不能直接使用語言中的標準數據類型來存儲。對於這種問題,一般使用數組來處理。  定義一個數組A,

簡單精度加法

efi std enter strlen printf col CA 其中 color 【高精度】簡單高精度加 題目描述 修羅王解決了計算機的內存限制問題,終於可以使用電腦進行大型的魔法運算了,他交給邪狼的第一個任務是計算兩個非負整數A、B的和,其中A和B的位數在500

精度加法

-- 題目 可能 逆序 如果 相加 clu color code 【題目描述】 求兩個不超過200位的非負整數的和。 【輸入】 有兩行,每行是一個不超過200位的非負整數,可能有多余的前導0。 【輸出】 一行,即相加後的結果。結果裏不能有多余的前導0,即如果結果是34

藍橋杯BASIC- 29基礎練習 精度加法

問題描述   輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 演算法描述   由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。   定義一個數組A,A[0]用於儲存a的個位,A[1]用於儲存a的十位,依此類推。同樣可以用

杭電oj--1002(精度加法

 思路分析:這是杭電上的一道典型的高精度加法運算,以現有的整型資料型別不足以計算如此大的數,不然會導致溢位。  此題的核心演算法是加法運算。 1.先將在螢幕上輸入的兩個數分別用字元陣列(字串)儲存起來 2.然後將這兩個數每一位進行對位,長度少的在高位補零,直至相等;為

藍橋杯 精度加法

問題描述   輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 演算法描述   由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。   定義一個數組A,A[0]用於儲存a的個位,A[1]用於儲存a的十位,依此類推。同樣可以用

精度加法--C++

高精度加法–C++ 仿照豎式加法,在第一步計算的時候將進位保留,第一步計算完再處理進位。(見程式碼註釋) 和乘法是類似的。 #include <iostream> #include <

精度加法(A+B問題)

A+B,作為演算法競賽中最難的一題(霧),總是吸引著廣大程式設計師想盡一切演算法想要去AC它: 這裡提供一種高精度的做法: #include <iostream> #define maxn 10000000 + 5 using namespace std;

[Java] 藍橋杯BASIC-29 基礎練習 精度加法

問題描述輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。演算法描述由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義一個數組A,A[0

基礎練習 精度加法

問題描述   輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 演算法描述   由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。

1024 Palindromic Number (25 分)(精度加法

水題一次過,按照題目要求模擬就行。 string又有些不熟練了。 在string某一位置插入一個字元或者字串相關函式複習: iterator insert( iterator i, const cha

hdu2100Lovekey解題報告---26進位制精度加法

                                          L

精度加法(進制)

ace i++ 精度 cin bit lse main nbsp pac 1 /* 2 高精度進制加法 3 n為進制(n<=36) 4 */ 5 #include<bits/stdc++.h> 6 using namesp

精度加法(進位制)

1 /* 2 高精度進位制加法 3 n為進位制(n<=36) 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 const int maxn=10000; 8 int n; 9 stru

jzxx1188精度加法

題目描述 計算a+b的值,a,b 皆不超過240位。 輸入 兩個數 每行一個 輸出 一個數 樣例輸入 111111111111111111111111111111111111 222222222222222222222222222222222222 樣例輸出