Technology Fundamentals with C# - януари 2019 - 02. From Left to The Right
Здравейте, не виждам как може да се направи числата да се четат на един ред, ако някой знае моля да помага...
Здравейте, не виждам как може да се направи числата да се четат на един ред, ако някой знае моля да помага...
Можеш да използваш този вариант:
string input = Console.ReadLine();
long[] numbers = input.Split().Select(long.Parse).ToArray();
или този, който е без масиви и LINQ
string numbers = Console.ReadLine();
string firstNumAsString = string.Empty;
string secondNumAsString = string.Empty;
bool isFirstNum = true;
for (int i = 0; i < numbers.Length; i++)
{
if (isFirstNum && numbers[i] != ' ')
{
firstNumAsString += numbers[i];
}
else if (!isFirstNum && numbers[i] != ' ')
{
secondNumAsString += numbers[i];
}
else if (numbers[i] == ' ')
{
isFirstNum = false;
}
}
int firstNumber = int.Parse(firstNumAsString);
int secondNumber = int.Parse(secondNumAsString);
Взимаш ги като масив от стрингове и ги parse-ваш.
using System.Linq;
int[] numbers = Console.ReadLine()
.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => int.Parse(x))
.ToArray();
Благодаря!
Здравейте
За същата задача моля за помощ.
От примерите в doc - а всички ми дават верни отговори, но Съдията ми пише 25/100.
https://pastebin.com/bSVzP29x
Предварително благодаря за помоща!
Ако стринга съдържа отрицателно число -2222 -1111 , няма да влезе в този код while (firstNumber > 0). В темата се разисква да се ползва Math.Abs(). Въпреки това аз съм го докарала до 50/100 . Ще ми е любопитно да разбера решение със 100 /100.
Можеш да четеш string и да вземеш substring преди и след " "
string input = Console.ReadLine();
string stringBeforeSpace = input.Substring(0, input.IndexOf(" "));
string stringAfterSpace = input.Substring(input.IndexOf(" ") +1);
след това парсваш левия и десния substring
long numLeft = long.Parse(stringBeforeSpace);
long numRight = long.Parse(stringAfterSpace);
И не забравяй вътре в проверките си, да обърнеш числата Left и Right към положителни с Math.Abs(), или рискуваш да не вземеш максимален брой точки в Judge.
Не трябва ли само получените суми на числата да се отпечатат по абсолютни стойности?
Няма да има разлика в крайния резултата при двата подхода.
При сравнение на 2000 и -3000 по-голямото число е 2000.
При сравнение по абсолютни стойности ще даде, че 3000 (бившето -3000) е по-голямото число.
Така че няма как да е едно и също дали проверяваш по абсолютни стойности или по реалните стойности на числата.
Предлагам решение със StringBuilder 100/100:
Здравейте, искам да попитам дали е възможно тази задача да се реши с материала до тук, т.е без масиви, списъци, стрингове, речници, обекти или класове. Или евентуално след известно време отново да се върна на нея. Задачата е поместена в темата "Data types and variables", т.е почти веднага след бейсик нивото .
Ето общата ми логика, но нищо- дава, че входните данни не са в правилния формат.
using System;
namespace TrainingWithData2
{
class MainClass
{
public static void Main()
{
int lineNumbers = int.Parse(Console.ReadLine());
for (int i = 0; i < lineNumbers; i++)
{
int num1 = int.Parse(Console.ReadLine()); // осъзнавам, че така няма как да стане четенето на две числа на един ред, но друг начин не сме учили.
int num2 = Console.ReadLine();
int digit1 = 0;
int sum1 = 0;
while (num1 > 0)
{
digit1 = num1 % 10;
num1 = num1 / 10;
sum1 = sum1 + digit1;
}
int digit2 = 0;
int sum2 = 0;
while (num2 > 0)
{
digit2 = num2 % 10;
num2 = num2 / 10;
sum2 = sum2 + digit2;
}
if (sum1 > sum2)
{
Console.WriteLine($"{sum1}");
}
else if (sum2 > sum1)
{
Console.WriteLine($"{sum2}");
}
else
{
Console.WriteLine($"{sum1}");
}
}
}
}
}
Четеш входа като стринг "10 20", итерираш през този стринг и на всяка итерация записваш резултата в една променлива и гледаш дали си стигнала до чарът празен спейс...ако да започваш да пълниш резултата в друга променлива, накрая парсваш двете променливи към две числови променливи и ги обработваш както си искаш.
using System;
namespace TrainingWithData2
{
class MainClass
{
public static void Main()
{
int lineNumbers = int.Parse(Console.ReadLine());
for (int i = 0; i < lineNumbers; i++)
{
string numbers = Console.ReadLine(); // осъзнавам, че така няма как да стане четенето на две числа на един ред, но друг начин не сме учили.
string fistNumberAssString = string.Empty;
string secondNumberAssString = string.Empty;
bool isFirstNumberFound = false;
for (int j = 0; j < numbers.Length; j++)
{
char currentDigit = numbers[j];
if (isFirstNumberFound == false)
{
if (currentDigit == ' ')
{
isFirstNumberFound = true;
}
else
{
fistNumberAssString += numbers[j];
}
}
else
{
secondNumberAssString += currentDigit;
}
}
int num1 = int.Parse(fistNumberAssString);
int num2 = int.Parse(secondNumberAssString);
int digit1 = 0;
int sum1 = 0;
while (num1 > 0)
{
digit1 = num1 % 10;
num1 = num1 / 10;
sum1 = sum1 + digit1;
}
int digit2 = 0;
int sum2 = 0;
while (num2 > 0)
{
digit2 = num2 % 10;
num2 = num2 / 10;
sum2 = sum2 + digit2;
}
if (sum1 > sum2)
{
Console.WriteLine($"{sum1}");
}
else if (sum2 > sum1)
{
Console.WriteLine($"{sum2}");
}
else
{
Console.WriteLine($"{sum1}");
}
}
}
}
}
Благодаря за разясненията! :)
Ето ти едно кратко решение:
play store app for pc apps which are developed by the developers will be available in the Google Play Store Download for PC. You can get access to a lot of apps for free. Play Store for PC also has a collection of paid applications.
Колеги, моля някой да ми каже какво греша. Правя уговорката и аз, че решавам задачата със знанията от материала взет до тук.
Нулевите тестове са ок, но Judge ми дава на три от тестовете "Runtime error". Опитах със всички възможни варианти, int, long и т.н. но резултата е един и същ. Интересното е, че разрешеното време е 0.100ms и паметта е 16.00 MB. на мен всички тестове са ми под тези граници!?! Ето и решението:
https://pastebin.com/Hxqf7BPR
Ето едно решение 100/100 и от мене, сравнително кратко е, отне ми към 6 часа, енджой :D - https://pastebin.com/YtLw6ZmU
https://www.pastebin.com/CCLVRvsU
100/100
Ето и моето решение с помоща на StringBuilder (не е задължително с този клас - може и със string) и без преобразуване в числа (освен при търсенето на по-голямото от двете числа). Съдията ми даде 100/100 https://pastebin.com/CpE2rtkX
Ето едно решение 100/100, което е доста кратко и ясно - https://paste2.org/mZ4ZODK1.
using System;
namespace _02.FromLeftToTheRight
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries);
long left = long.Parse(input[0]);
long right = long.Parse(input[1]);
long sum = 0;
if (left > right)
{
left = Math.Abs(left);
while (left > 0)
{
sum += left % 10;
left /= 10;
}
}
else
{
right = Math.Abs(right);
while (right > 0)
{
sum += right % 10;
right /= 10;
}
}
Console.WriteLine(sum);
}
}
}
}
Интересни и полезни решения и макар, че темата е стара, ще се включа с моите примери. Основно съм разделила условието на 2 възможности: Едната е двете числа да са цели, втората, която е по-трудна, дава възможност за плаваща запетая. Когато се събират цифрите на число тип double, това става чрез конвертиране в стринг. Още в началото съм закоментирала по няколко различни начина входът от конзолата input да се разцепи на 2 отделни числа чрез разделител. Всички закоментирани начини работят и точките са 100/100.
...
Първи начин за целочислен тип:
int lines = int.Parse(Console.ReadLine());
long sumDigits = 0;
while (lines > 0)
{
string[] input = Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries);
long firstN = long.Parse(input[0]);
long secondN = long.Parse(input[1]);
//string firstNumber = input[0];
//string secondNumber = input[1];
//long.TryParse(firstNumber, out long firstN);
//long.TryParse(secondNumber, out long secondN);
if (firstN > secondN)
{
firstN = Math.Abs(firstN);
while (firstN > 0)
{
sumDigits += firstN % 10;
firstN /= 10;
}
}
else
{
secondN = Math.Abs(secondN);
while (secondN > 0)
{
sumDigits += secondN % 10;
secondN /= 10;
}
}
Console.WriteLine(sumDigits);
sumDigits = 0;
lines--;
}
...
Втори начин за числа с плаваща запетая:
int lines = int.Parse(Console.ReadLine());
double sumDigits = 0;
while (lines > 0)
{
string input = Console.ReadLine();
//several other disolvings:
//string[] input = Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries);
//char[] separator = {' '};
//string[] numbers = input.Split(separator);
//string firstNumber = string.Split(input[0], ' ');
string[] numbers = input.Split(' ');
string firstNumber = numbers[0];
string secondNumber = numbers[1];
double.TryParse(firstNumber, out double firstN);
double.TryParse(secondNumber, out double secondN);
if(firstN > secondN)
{
string firstNumer = firstN.ToString();
for (int i = 0; i < firstNumber.Length; i++)
{
int.TryParse(Convert.ToString(firstNumber[i]), out int digit);
sumDigits += digit;
}
}
else
{
string secondNumer = secondN.ToString();
for (int i = 0; i < secondNumber.Length; i++)
{
int.TryParse(Convert.ToString(secondNumber[i]), out int digit);
sumDigits += digit;
}
}
Console.WriteLine(sumDigits);
sumDigits = 0;
lines--;
}