#29414: 除法 C++


yp11051231@yphs.tp.edu.tw (910-36 楊宸)

學校 : 臺北市私立延平高級中學
編號 : 165190
來源 : [203.72.178.1]
最後登入時間 :
2024-04-13 11:45:10
a021. 大數運算 | From: [36.225.49.84] | 發表日期 : 2022-02-26 23:09

這個是我寫大數除法的程式碼,但不知道為什麼 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,可以幫我看哪裡寫得太繁瑣了嗎?   非常感謝!!!

 
#29415: Re:除法 C++


yp11051231@yphs.tp.edu.tw (910-36 楊宸)

學校 : 臺北市私立延平高級中學
編號 : 165190
來源 : [203.72.178.1]
最後登入時間 :
2024-04-13 11:45:10
a021. 大數運算 | From: [36.225.49.84] | 發表日期 : 2022-02-26 23:18

這個是我寫大數除法的程式碼,但不知道為什麼 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';

}

 

原本的最後一行不要理,謝謝!!



 
#29424: Re:除法 C++


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
a021. 大數運算 | From: [27.52.76.229] | 發表日期 : 2022-02-28 09:16

這個是我寫大數除法的程式碼,但不知道為什麼 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是什麼?能給完整程式碼嗎?

 
#29440: Re:除法 C++


yp11051231@yphs.tp.edu.tw (910-36 楊宸)

學校 : 臺北市私立延平高級中學
編號 : 165190
來源 : [203.72.178.1]
最後登入時間 :
2024-04-13 11:45:10
a021. 大數運算 | From: [36.225.55.113] | 發表日期 : 2022-03-01 22:10

這個是我寫大數除法的程式碼,但不知道為什麼 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的長度

 

 
#29447: Re:除法 C++


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
a021. 大數運算 | From: [27.247.9.93] | 發表日期 : 2022-03-02 19:51

這個是我寫大數除法的程式碼,但不知道為什麼 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的情況

大概就先這樣,這些改好還有錯的話我再幫你看

 
#29448: Re:除法 C++


yp11051231@yphs.tp.edu.tw (910-36 楊宸)

學校 : 臺北市私立延平高級中學
編號 : 165190
來源 : [203.72.178.1]
最後登入時間 :
2024-04-13 11:45:10
a021. 大數運算 | From: [36.225.55.113] | 發表日期 : 2022-03-02 21:30

這個是我寫大數除法的程式碼,但不知道為什麼 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啦......

 
#29454: Re:除法 C++


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
a021. 大數運算 | From: [27.247.9.93] | 發表日期 : 2022-03-04 08:34

這個是我寫大數除法的程式碼,但不知道為什麼 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第一位數,還是會往後面的位數繼續檢查

 
ZeroJudge Forum