krpiyush29 Ответов: 4

Моя программа для проверки номера Армстронга показывает 153 как неармстронг номер. Пожалуйста, проверьте это. Я использую блок кода, а компилятор


#include<iostream>
#включить<cmath>
использование пространства имен std;
тап_п()
{
int n1,r,n2,p,i;
n2=i=0;
cout<<"введите номер.\n";
cin>>n1;
p=n1;
в то время как(p!=0)
{
p=p/10;
я++;
}
p=n1;
в то время как(p!=0)
{
r=p%10;
p=p/10;
n2=n2+pow(r,i);
}
если(n1==n2)
cout<<n1<<" - это число Армстронга\n";
еще
cout<<n1<<" - это не число Армстронга\n";
}

Что я уже пробовал:

когда переменная n1=153, то 2-я итерация цикла while показывает неправильное значение переменной n2, оно должно быть 27+125=152, но вместо этого оно показывает 27+124=151. Следовательно, на конечный результат это показывает, 153, а также доступны Армстронг количество. ПОЖАЛУЙСТА, ПРОВЕРЬТЕ ЭТУ ПРОБЛЕМУ И ОТПРАВЬТЕ МНЕ ОТЗЫВ.
СПАСИБО

Mohibur Rashid

Какой компилятор вы используете?

4 Ответов

Рейтинг:
29

Patrice T

Цитата:
Моя программа для проверки номера Армстронга показывает 153 как неармстронг номер.

Ваша проблема заключается в том, что вы смешиваете функции с плавающей запятой и целочисленную арифметику.
Учтите, что значение с плавающей запятой целого числа никогда не бывает точным, поэтому ваша проблема.
pow() - это двойное значение.


CPallini

Хороший улов. Мой 5.

Patrice T

Спасибо

krpiyush29

спасибо. это действительно сработало. я инициализировал n2,r и i как double. теперь в нем нет ошибки. он показывает 153 как число Армстронга.
СПАСИБО СНОВА

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
2

CPallini

Как было предложено ppolymorphe используйте целочисленные операции. Попробуйте, например:

#include<iostream>
#include <vector>
#include <cassert>
using namespace std;


bool is_armstrong( int n )
{
  assert( n>0 && n<1000000000 );
  vector <int> dv;

  int m = n;
  while ( m )
  {
    dv.push_back(m % 10);
    m /= 10;
  }

  int digits = dv.size();
  m = 0;
  for ( auto d: dv )
  {
    int k = d;
    for ( int i = 1; i<digits; ++i)
      k *= d;
    m+=k;
  }

  return (m == n);
}


int main()
{
  for ( int n=1; n<10000; ++n)
    if ( is_armstrong(n) )
      cout << n << '\n';

  cout << endl;
}


Рейтинг:
1

phil.o

Поставьте точку останова в начале основного метода, запустите решение в режиме отладки и начните следить за тем, где ваш алгоритм отличается от того, что вы ожидаете.
Если вам действительно нужна помощь в отладке, для чего она нужна и как это делается, то мы можем предоставить соответствующие источники информации. Отладка не является необязательной для разработчика, она обязательна для всех, кто хочет серьезно относиться к разработке.