這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector<int> Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
順帶一提,這個程式碼會TLE,可以幫我看哪裡寫得太繁瑣了嗎? 非常感謝!!!
這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
原本的最後一行不要理,謝謝!!
這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
原本的最後一行不要理,謝謝!!
看不懂,L2和n2是什麼?能給完整程式碼嗎?
這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
原本的最後一行不要理,謝謝!!
看不懂,L2和n2是什麼?能給完整程式碼嗎?
抱歉! n2是除數,而L2是n2的長度
這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
順帶一提,這個程式碼會TLE,可以幫我看哪裡寫得太繁瑣了嗎? 非常感謝!!!
看了幾遍你的程式碼,這是我的想法:
1. TLE的原因是你的while迴圈是無限迴圈(當然你用減法這種方式也不太有效率就是了)
2. 如果n1長度小於n2,n1.length() - L2會是負數,會出錯
3. n1是被除數,可是你後面 string n1 = "" 又宣告了一次n1,所以你有兩個n1,一個在外,一個在while迴圈內,這種情況叫做variable shadowing,所以原本的n1完全沒有變
4. 最後面那個for迴圈完全沒有作用,意義不明
5. 減法你沒有考慮到n1<n2的情況
大概就先這樣,這些改好還有錯的話我再幫你看
這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
順帶一提,這個程式碼會TLE,可以幫我看哪裡寫得太繁瑣了嗎? 非常感謝!!!
看了幾遍你的程式碼,這是我的想法:1. TLE的原因是你的while迴圈是無限迴圈(當然你用減法這種方式也不太有效率就是了)
2. 如果n1長度小於n2,n1.length() - L2會是負數,會出錯
3. n1是被除數,可是你後面 string n1 = "" 又宣告了一次n1,所以你有兩個n1,一個在外,一個在while迴圈內,這種情況叫做variable shadowing,所以原本的n1完全沒有變
4. 最後面那個for迴圈完全沒有作用,意義不明
5. 減法你沒有考慮到n1<n2的情況
大概就先這樣,這些改好還有錯的話我再幫你看
感謝你幫我找出這麼多問題! 雖然我最後的 for 迴圈是要檢查n1是否小於n2啦......
這個是我寫大數除法的程式碼,但不知道為什麼 n1 每過一次while迴圈就會變回初始值,各位大佬們可以幫我看看嗎?
// n1為被除數
else{
// 直式除法
string temp = n2;
int Count = 0;
while (1){
n2 = temp;
n2.insert(0,string(n1.length() - L2,'0'));
vector Num_1 = {}, Num_2 = {}, Ans = {};
for (int i=0; i<n1.length(); i++){
Num_1.push_back(int(n1[i]) - 48);
Num_2.push_back(int(n2[i]) - 48);
}
// 瘋狂直式減法
int borrow = 0;
for (int i=Num_1.size()-1; i>=0; i--){
int Insert = Num_1[i] - Num_2[i] - borrow;
if (Insert < 0){
Insert += 10;
borrow = 1;
}
else
borrow = 0;
Ans.push_back(Insert);
}
reverse(Ans.begin(),Ans.end());
for (int i=0; i<Ans.size()-1; i++){
if (Ans[0] == 0)
Ans.erase(Ans.begin());
else
break;
}
string n1 = "";
for (int i=0; i<Ans.size(); i++){
char C = Ans[i] + 48;
n1 += C;
}
Count += 1;
if (n1.length() < L2)
break;
for (int i=0; i<n1.length(); i++){
if (n1[i] < n2[i])
break;
}
}
cout << Count << '\n';
}
順帶一提,這個程式碼會TLE,可以幫我看哪裡寫得太繁瑣了嗎? 非常感謝!!!
看了幾遍你的程式碼,這是我的想法:1. TLE的原因是你的while迴圈是無限迴圈(當然你用減法這種方式也不太有效率就是了)
2. 如果n1長度小於n2,n1.length() - L2會是負數,會出錯
3. n1是被除數,可是你後面 string n1 = "" 又宣告了一次n1,所以你有兩個n1,一個在外,一個在while迴圈內,這種情況叫做variable shadowing,所以原本的n1完全沒有變
4. 最後面那個for迴圈完全沒有作用,意義不明
5. 減法你沒有考慮到n1<n2的情況
大概就先這樣,這些改好還有錯的話我再幫你看
感謝你幫我找出這麼多問題! 雖然我最後的 for 迴圈是要檢查n1是否小於n2啦......
因為break只會跳出最裡面的迴圈,所以只會跳出for迴圈,所以我才說沒有作用。而且這樣檢查不出n1小於n2吧,如果n1第一位數大於n2第一位數,還是會往後面的位數繼續檢查