YBT整理 高精度害死人

2022-05-05 16:39:24 字數 4096 閱讀 7158

高精度加減乘除板子,整理一下成為函式。

都是字串讀入,倒序儲存。陣列\(a_0\)表示\(a\)的位數。

每一位相加,判斷是否需要進製。迴圈結束後判斷最高位是否需要進製,最終調整一下位數。

每一位相減,不夠減的向前一位借位 (感覺我在學習小學一年級知識??)最後需要調整位數,去掉前導0.

這裡和普通的豎式乘法不同。高精乘高精思路為,答案的第i+j-1位,等於兩乘數分別的第 i 位和第 j 位相乘。最後需要處理進製和位數的問題。

如上圖,是地球人用紙和筆做的除法。但是很顯然,計算機走試商的方法太麻煩,那就只能把除數移到被除數的最高位(空餘的用0補上),再相減,直到剩下的數小於除數(同時記錄商),然後進行下一位的計算。

#include#include"cmath"

#include#includeusing namespace std;

string in;

int a[999],b[999],ans[999];

int strlen(string x)

void _p(int x,int y)

if(ans[ans[0] + 1]) ans[0] ++;

} int main()

cin >> in;

b[0] = strlen(in);

for(int i = 1;i <= b[0]; i++)

_p(a,b);

for(int i = ans[0];i >= 1; i--)

cout 注意正負號的檢驗。

#include#include#include#includeusing namespace std;

string in;

int a[10100],b[10100];

int c[10100];

int strlen(string x)

void jian(int x,int y)

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

}bool cmp(int x,int y)

return 1;

}int main()

cin >> in;

b[0] = strlen(in);

for(int i = 1;i <= b[0]; i++)

if(!cmp(a,b))

cout << '-';

} jian(a,b);

for(int i = c[0];i >= 1; i--)

cout << c[i] ;

cout << endl;

return 0;

}//lcez_cyc

#include #include #include #include using namespace std;

string in;

int a[999],b[999],ans[999];

int strlen(string x)

void _x(int x,int y)

} if(ans[ans[0]+1] != 0) ans[0]++;

while(ans[0] > 1 && ans[ans[0]] == 0) ans[0]--;

} int main()

cin >> in;

b[0] = strlen(in);

for(int i = 1;i <= b[0]; i++)

_x(a,b);

for(int i = ans[0];i >= 1; i--)

cout

string in;

int a[10100],b[10100];

int c[10100];

int d[10100],r[10100];

int strlen(string x)

void jian(int x,int y)

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

}int cmp(int x,int y)

return 2;

}//商d,餘數r

void chu(int x,int y);

for(int i = 0;i <= x[0]; i++)

d[0] = x[0];

for(int i = x[0] - y[0] + 1;i >= 1; i--)

for(int j = i-1; j >= 1; j--) tmp[j] = 0;

tmp[0] = i-1 + y[0];

while(cmp(r,tmp))

} while(d[0] > 1 && d[d[0]] == 0) d[0]--;

while(r[0] > 1 && c[c[0]] == 0) r[0]--;

}int main()

cin >> in;

b[0] = strlen(in);

for(int i = 1;i <= b[0]; i++)

b[i] = in[b[0]-i] - '0';

chu(a,b);

for(int i = d[0];i >= 1; i--) cout << d[i];

cout << endl;

for(int i = r[0];i >= 1; i--) cout << r[i];

cout << endl;

return 0;

}

傳送至洛谷

一本通特殊的一點就是這裡提到的是n進製,所以需要稍微進行一下優化(還好不是乘法除法)

#include#include#include#includeusing namespace std;

int a[10086],b[10086];

int c[10086];

int n;string in;

int ans;

int strlen(string x)

void pluss(int x,int y,int k)

} if(c[c[0] + 1])

c[0]++;

}bool is_hw(int x)

return 1;

}int main()

for(int i = 0;i <= a[0];i++) c[i] = a[i];

while(!is_hw(c))

pluss(a,b,n);

if(ans >= 30)

} cout << ans << endl;

return 0;

}

洛谷

一本通這個真的是我也不知道為什麼有點麻煩,之前是打表做的,今天重新寫了一下。

整體如果出問題還是在高精的核心演算法上。

#include#include#include#includeusing namespace std;

int a[10000],b,anss[10000];

int n;

int ans[10000],now[10000];

void _x(int x,int y)

ans[0] = x0 + y[0] -1;

for(int i = 1;i <= max(y[0],x0); i++)

ans[0] = max(k,ans[0]);

} while(ans[0] > 1 && ans[ans[0]] == 0) ans[0]--;

}void _p(int x,int y)

} if(anss[anss[0]+1])

for(int i = 0;i <= anss[0]; i++)

now[i] = anss[i];

} int main()

_p(ans,now);

} for(int i = now[0];i >= 1; i--)

cout << endl;

return 0;

}

其實高精是個上**都不會考到的東西,但是這個確實有助於提高**能力啥的。所以以後還是多寫寫吧。

程式設計風格害死人

今天遇到乙個非常糾結的問題,mysql 關於區分大小寫的問題,按照原理可以在mysql的配置檔案裡加一句話就可以搞定 在配置文 件的 etc mysql 下的my.cnf 中 mysqld 區段下增加一行 lower case table names 1 可是加過之後發現乙個奇怪的現象,原來顯示的不...

小故事大道理 同情害死人

有一天,乙隻小猴子在森林中,不小心被樹枝戳傷了胸部,於是它捂住傷口搖搖擺擺的回家。一路上遇到其它的猴子就出示傷口,以博取它們的同情,猴子們為了表示關懷,也都撥開它的傷口,仔細的檢視,並且七嘴八舌的建議它如何 於是原來的小傷口逐漸變成了大傷口,並且嚴重感染發炎了。就在小猴子奄奄一息時,其它的猴子為了表...

orcle 11g 密碼延遲驗證害死人

在v session檢視中查詢library cache lock等待相關的會話資訊,發現username為空而且不是oracle後台進行。這就是說這些會話還沒有連線到資料庫,一直在等待驗證狀態。select from gv session wait where event like library...