高精度加減乘除板子,整理一下成為函式。
都是字串讀入,倒序儲存。陣列\(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...