整數大數模擬 高精度加法 高精度減法 高精度乘法 高精度除法 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++版:
java 版:#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; }
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
高精度加法(進制)
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 樣例輸出