2016-12-22 70 views
-3

因此,我必須編寫一個程序來讀取兩個整數,並確定從第一個int刪除任何數字後,新的數是否等於第二個讀取整數(例如,如果輸入是123而且它應該打印出「是」,因爲在交叉出3之後,兩個整數相等)。我認爲我寫的代碼是正確的,但程序不打印任何東西。這裏是代碼:C++從整數中刪除一個數

#include <iostream> 
using namespace std; 

int main() 
{ 
    unsigned int a, b, temp, len = 0; 
    cin >> a >> b; 
    temp = a; 
    while(temp!=0) 
    { 
     temp = temp/10; 
     len++; 
    } 

    int k = 1, m = 0, p = 1; 

    while (k>len || m == b) 
    { 
     for (int i = 1; i<=len-k; i++) 
      p = p*10; 
     m = a/(p*10)*p + a%p; 
     if (m == b) 
      cout << "Yes" << endl; 
     if (k == len && m!=b) 
      cout << "No" << endl; 
     k++; 
    } 

    system ("pause"); 
    return 0; 
} 
+0

使用正確的工具來解決這些問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

「是否在從第一個int中刪除任何數字後,新的數字等於第二個讀取整數」, 只要有'first_number> second_number',這不會總是成立的嗎? –

+0

不,第一個總是應該更大 - 例如,如果你有123和12作爲輸入,它應該打印「是」 - 我們劃掉了3並且新的整數相等 – unfi

回答

0

我認爲在字符串級別切割數字比在整數值級別更容易。因此,一個基於字符串的解決方案,在循環中刪除數字並比較字符串。 如果不是性能而是可讀的代碼,我寧願這樣的解決方案:

string a, b; 
cin >> a; 
cin >> b; 

bool isContained = false; 
size_t aLen = a.length(); 
for (int i=0; i < aLen; i++) { 

    // cuttedOut is a derivation of string a, where the i'th position is cut out 
    string cuttedOut = a.substr(0,i) + a.substr (i+1,aLen-1); 
    if (cuttedOut == b) 
    { 
     isContained = true; 
     break; 
    } 
} 
+0

不,因爲「132」和「12」也應該匹配,除非我誤解了這個問題。 – UKMonkey

+0

是的,132和12也匹配 – unfi

0

這是我的理解這個問題:
鑑於:兩個數字:一個b其中a> b
問題:是否有可能刪除在數exacely一個數字一(在其十進制表示),這樣的新值的 = b

實例

a=12345 
b=1245 
//lets delete first digit from a. We will get: 2345 != 1245 
//lets delete second digit from a. We will get: 1345 != 1245 
//lets delete third digit from a. We will get: 1245 == 1245 OK 

條件:

while (k>len || m == b) 

僅當變量爲ab設置爲。其他方式是錯誤的,因爲k = 1並且它不是變量的數字位數a(最小值len值爲1)。 可能應該有:
k < len

接下來的問題是,您打印「否」很多次,直到檢查所有數字或您找到答案。嘗試使用一些bool變量。

這裏有我的例子:

bool almoustEuqal(int a, int b) 
{ 
    if(a<0 && b<0) //this is for negative number 
    {    //so a=-123 b=-23 =>OK 
     a = -a;  //but a=-123 b=-14 =>No 
     b = -b; 
    } 
    if(a < b || a < 10) return false; 
    int p = 1, t; 
    while(p < a) 
    { 
     t = a/p/10; 
     t *= p; 
     t += a % p; 
     if(t == b) return true; //if it's OK then interup loop 
     p *= 10; 
    } 
    return false; //otherwise return false 
} 

比地方在你的代碼只需使用:

//... 
std::cin >> a; 
std::cin >> b; 
if(almoustEuqal(a, b)) 
{ 
    std::cout << "Ok"; 
} 
else 
{ 
    std::cout << "No"; 
} 
//or in other way: 
std::cout << ((almoustEuqal(a, b)) ? "OK" : "No"); 
//..