Member 14007425 Ответов: 2

Почему мой код отправляется с 90, а не с 100?


я не могу найти жучка
один тестовый случай идет не так
речь идет о сумме больших чисел через строки

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

#include <iostream>
#include <string>
using namespace std;

//Char To Num Function
int chartonum(char character)
{
	return character - '0';
}
//Num To Char Function
char numtochar(int n)
{
	return n + '0';
}

//Sum Of Two String
string sumofstrings(string s1, string s2)
{
	string difzero="",sum="";
	int big, small, dif,plus=0;
	if (s2.length() > s1.length())
		swap(s1, s2);
	big = s1.length();
	small = s2.length();
	dif = big - small;
	for (int i = 0; i < dif; i++)
		difzero += '0';
	for (int i = 0; i <= big ; i++)
		sum += "0";

	s1 = '0' + s1;
	s2 = '0' + difzero + s2;
	for (int i = big; i >= 0; i--)
	{
		sum[i] = numtochar((chartonum(s1[i]) + chartonum(s2[i]) + plus) % 10);
		plus = (chartonum(s1[i]) + chartonum(s2[i]) + plus) / 10;
		 
	}
	while (sum[0] == '0')
	{
		sum.erase(0, 1);
	}
	return sum;
}

int main()
{
	int n;
	string nums[20], sum="0";
	cin >> n;
	//Taking Numbers As Strings
	for (int i = 0; i < n; i++)
	{
		cin >> nums[i];
	}
	//Sum
	for (int i = 0; i < n; i++)
	{
		sum = sumofstrings(sum, nums[i]);
	}
	//Print Sum
	cout << sum << endl;
}

2 Ответов

Рейтинг:
1

CPallini

Попробуй

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

int c2d(char c)
{
  assert( c>='0' && c<='9');
  return (c-'0');
}

char d2c(int d)
{
  assert(d>=0 && d<=9);
  return ('0' + d);
}

string sumofstrings( string s1, string s2)
{
  if ( s1.length() < s2.length() )
    swap(s1,s2);

  int len = s1.length();

  s2.insert(0, len - s2.length(), '0');

  string sum(len, '0');

  int carry = 0;


  for (int i = len-1; i>=0; --i)
  {
    int x = c2d(s1[i]) + c2d(s2[i]) + carry;
    if ( x < 10)
    {
      sum[i] = d2c(x);
      carry = 0;
    }
    else
    {
      sum[i] = d2c(x-10);
      carry = 1;
    }
  }
  if (carry)
    sum.insert(0,1,'1');
  return sum;
}

int main()
{
  int n; 
  string s, sum = "0";

  cin >> n;
  for (int i = 0; i<n; ++i)
  {
    cin >> s;
    sum = sumofstrings(sum, s);
  }
  cout << sum << endl;
}


Maciej Los

5ed!

CPallini

Спасибо тебе, Мацей!

Рейтинг:
0

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" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!