高精度除法

2021-07-23 19:46:22 字數 1487 閱讀 1523

codevs 1331 西行寺幽幽子

codevs 3118 高精度練習之除法

學了高精度這麼久到現在才開始搞除法txt,總的來說高精除是四則運算(+、-、*、/)

裡最難的。但是,高精度都是可以利用我們平時做算術時的方法手動模擬的,接下來我

們來學一下高精除。

思路:首先,除法是建立在減法的基礎上的,我們可以考慮每次用被除數減去除數,同時讓

ans+1,直到不能再減的時候,我們就停止減法操作,輸出ans,這很明顯遇到極端情況

會tle(比如100000000000000000000000 / 1)。所以,我們想想平時我們做除法

是怎麼做的呢?

一開始,我們可以將除數提到和被除數一樣的位數,若能減去就減,ans+=10*(你擴大的

倍數),若不能減就讓被除數退一位,繼續判斷,直到不能再減,輸出ans。(當然,如果

答案很大你也可以將商也用高精度存下來)

下面是兩份**,暴力的那個看思想。

暴力(tle,能減就減):

#include

#include

using

namespace

std;

int a[20005],b[20005];

int main()

for(int i=0;i'0';

}if(s1printf("0");

}else

if(s1==s2&&xprintf("0");

}else

}while(a[s1]==0&&s1>1)

}printf("%d",ans);

}return

0;}

高精度模板:

#include

#include

#include

using

namespace

std;

int s1,s2,s3; //s1是被除數的長度,s2是除數長度,s3是擴大後除數的長度

int a[20005],b[20005],c[20005],tmp[20005];//a儲存被除數,b儲存除數,c儲存商,tmp儲存每次擴大後的除數

void change(int w)//將b擴大w倍賦給tmp

s3=s2+w-1;

}bool pd()//判斷被除數是否大於除數

return1;}

void jf()//高精減

}while(s1>1&&a[s1]==0)

}int main()

for(int i=0;i'0';

}for(int i=0;i'0';

}int lenc=s1-s2+1;

for(int i=lenc;i>=1;i--)

}while(lenc>1&&c[lenc]==0)

for(int i=lenc;i>=1;i--)

return

0;}

高精度除法(高精度除以高精度)

先貼乙個簡單的高精度除以單精度的 include include include using namespace std int main else ys ys 10 a i 0 while c i 0 i for int j i j 0 j printf d c j if ys printf d ...

高精度除法

演算法思想 反覆做減法,看看從被除數裡最多能減去多少個除數,商就是多少 所以演算法核心是寫乙個大整數的減法函式 反覆呼叫該函式進行減法操作 演算法步驟 用陣列a表示被除數,陣列b表示除數,陣列res表示商 先用被除數a減去除數b得到差的位數k,同時商 1 再用被除數a減去若干個除數b 10 k 不夠...

高精度除法

思路 求迴圈節需要模擬迴圈小數的求解過程。那麼什麼時候會出現迴圈呢?在除的過程中,除數b是不變的,而被除數a一直在變化,那麼當a變換為之前出現過的某個值時,就出現了迴圈。include include include include using namespace std const int n 3...