2 / 2
Jul 2018

I keep getting SIGABRT in the JULKA problem, and I have no idea why. Can anyone be so kind as to provide a hint? Thank you in advance!

// The JULKA problem from SPOJ
// Error: SIGABRT
#include <vector>
#include <string>
#include <iostream>

using namespace std;

char int_to_char(int i)
{
	return i + '0';
}

int char_to_int(char c)
{
	return c - '0';
}

// Divide vector by 2
void div_vec(vector<int> &vec)
{
	int carry_in = 0;
	int carry_out = 0;
	for (int i = 0; i < vec.size(); i++)
	{
		carry_in = carry_out;
		carry_out = 5*(vec[i] % 2);
		vec[i] /= 2;
		vec[i] += carry_in;
	}
	if (vec[0] == 0)
		vec.erase(vec.begin());
}

// Add 2 vectors
void add_vec(vector<int> &out, vector<int> &in)
{
	int carry_in, carry_out = 0;
	int diff = out.size() - in.size();
	for (int i = in.size() - 1; i >= 0; i--)
	{
		out[i + diff] += in[i];
	}
	for (int i = out.size() - 1; i >= 0; i--)
	{
		carry_in = carry_out;
		carry_out = (out[i] + carry_in) / 10;
		out[i] += carry_in;
		out[i] %= 10;
	}
	if (carry_out == 1)
		out.insert(out.begin(), 1);
}

// Subtract 2 vectors
void sub_vec(vector<int> &out, vector<int> &in)
{
	int carry_in, carry_out = 0;
	int diff = out.size() - in.size();
	for (int i = in.size() - 1; i >= 0; i--)
		out[i + diff] -= in[i];
	for (int i = out.size() - 1; i >= 0; i--)
	{
		carry_in = carry_out;
		out[i] -= carry_in;
		if (out[i] < 0)
		{
			out[i] += 10;
			carry_out = 1;
		}
		else
			carry_out = 0;
	}
	if (out.front() == 0 && out.size() > 1)
		out.erase(out.begin());
}

void julka(string ta, string am)
{
	vector<int> am_vec;
	vector<int> klaudia_vec;
	vector<int> natalia_vec;
	// append total_apples to klaudia and natalia vectors
	for (int i = 0; i < ta.size(); i++)
	{
		klaudia_vec.push_back(char_to_int(ta[i]));
		natalia_vec.push_back(char_to_int(ta[i]));
	}
	// append apples more to a vector
	for (int i = am.size() - 1; i >= 0; i--)
		am_vec.push_back(char_to_int(am[i]));
	// Divide klaudia and natalia vectors by 2
	div_vec(klaudia_vec);
	div_vec(natalia_vec);
	// Divide apples_more by 2
	div_vec(am_vec);
	// Add half of apples more to klaudia
	add_vec(klaudia_vec, am_vec);
	// Subtract half of apples more from natalia
	sub_vec(natalia_vec, am_vec);
	for (int i = 0; i < klaudia_vec.size(); i++)
		cout << klaudia_vec[i];
	cout << '\n';
	for (int i = 0; i < natalia_vec.size(); i++)
		cout << natalia_vec[i];
	cout << '\n';
}

int main()
{
	
	string apples_more;
	string total_apples;
	for (int i = 0; i < 10; i++)
	{
		cin >> total_apples;
		cin >> apples_more;
		julka(total_apples, apples_more);
	}
	return 0;
}
  • created

    Jul '18
  • last reply

    Jul '18
  • 1

    reply

  • 816

    views

  • 2

    users

12 days later

I can’t make it sigabrt, but I can find a test case where it gives the wrong answer. If you fix this, perhaps it will also fix the sigabrt problem.

55
43

Suggested Topics

Topic Category Replies Views Activity
C and C++ 0 23 14d

Want to read more? Browse other topics in C and C++ or view latest topics.