2016-12-22 4 views
-3

Итак, мне нужно написать программу, которая читает два целых числа и определяет, будет ли после удаления любого числа из первого int новый равен второму числу чтения (например, если входной код 123 и 12 он должен распечатать «Да», потому что после пересечения 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

Правильный инструмент для решения таких проблем является ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (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

Это, как я понял проблему:
Учитывая: два числа: и б где a> b.
Вопрос: можно удалить exacely один разряд числа а (в десятичном представлении), так что новое значение а = б

Примеры:

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) 

справедлив только в тех случаях, когда переменная a или b установлена ​​в . Другими способами это неверно, потому что 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"); 
//.. 
Смежные вопросы