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...