Проблема с операциями над числами в C#: соединение (конкатенация), обработка, вывод

На C# нужно ввести два трехзначных числа, соединить эти два числа так чтобы, например, для ввода

123
456 

вышло

1245

Я сделал почти все из этого, кроме того что у меня выводит совсем другое число, например: я ввожу 123 и 456 у меня выводит 123456, а должно быть 1245.

Вот что я сделал:

double a, b,a1,b1;
           Console.WriteLine("Введите первое трехзначное число");
            a = Convert.ToDouble(Console.ReadLine());
            if (a < 100)
            {
                Console.WriteLine("ошибка");
                
                
            }
            while (a! < 100) ;

            Console.WriteLine("Введите второе трехзначное число");
            b = Convert.ToDouble(Console.ReadLine());
            if (b < 100)
            {
                Console.WriteLine("ошибка");
                
            }
            while (b! < 100) ;
           
            b1 = b / 100;
            b1 = b / 10 % 10;
            a1 = a / 100;
            a1 = a / 10 % 10;
            a = a + b;
            b = a - b;

            a = a - b;
            
            Console.WriteLine($"{a}{b}");

Ответы (4 шт):

Автор решения: Dmitry D.

Чтобы из 3-значного целого получить 2-значное, достаточно поделить его на 10.

В вашей программе я усматриваю следующие проблемы:

  1. Поскольку речь явно о целых числах, то переменные должны быть типа int, а не double.

  2. Даже если допустить, что эта конструкция компилируется, то это бесконечный цикл:

    while (a! < 100) ;
    
  3. Суть вычислений совершенно не ясна мне, и вряд ли она соответствует заданию:

    b1 = b / 100;
    b1 = b / 10 % 10;
    a1 = a / 100;
    a1 = a / 10 % 10;
    a = a + b;
    b = a - b;
    a = a - b;
    

Вместо этого я предлагаю следующее:

Console.WriteLine("Введите первое трехзначное число");
int a, b;
while (true)
{
    a = Convert.ToInt32(Console.ReadLine());
    if (a >= 100 && a < 1000)
    {
        break;
    }
    Console.WriteLine("ошибка");
}

Console.WriteLine("Введите второе трехзначное число");
while (true)
{
    b = Convert.ToInt32(Console.ReadLine());
    if (b >= 100 && b < 1000)
    {
        break;
    }
    Console.WriteLine("ошибка");
}

int a1 = a / 10;
int b1 = b / 10;

Console.WriteLine($"{a1}{b1}");

Если вам уже знаком процедурный стиль, то код можно упростить:

int NumberInput(string prompt)
{
    Console.WriteLine(prompt);
    while (true) // Итерируем до тех пор, пока введённые данные нас не устроят
    {
        if (int.TryParse(Console.ReadLine(), out var input) && input >= 100 && input < 1000)
        {
            // Введённые данные нас устраивают
            return input;
        }

        Console.WriteLine("ошибка");
    }
}

int a = NumberInput("Введите первое трехзначное число");
int b = NumberInput("Введите второе трехзначное число");

// Обрежем младшие разряды введённых чисел
int a1 = a / 10;
int b1 = b / 10;
Console.WriteLine($"{a1}{b1}");

Заодно и избавимся от исключений при вводе данных, не являющихся целым числом.

→ Ссылка
Автор решения: Yaroslav

А не проще работать с string?

int ValueA, ValueB;
int RequiredLenght = 3;
Console.WriteLine("Введите первое трехзначное число: ");
while (true) {
    ValueA = Convert.ToInt32(Console.ReadLine());
    if (ValueA.ToString().Length == RequiredLenght)
        break;
    Console.WriteLine("Ошибка. Число знаков: "+ValueA.ToString().Length);
}
Console.WriteLine("Введите второе трехзначное число: ");
while (true) {
    ValueB = Convert.ToInt32(Console.ReadLine());
    if (ValueB.ToString().Length == RequiredLenght)
        break;
    Console.WriteLine("Ошибка. Число знаков: "+ValueB.ToString().Length);
}
string Result = ValueA.ToString().Substring(0, 2)+ValueB.ToString().Substring(0, 2);
Console.WriteLine(int.Parse(Result));
→ Ссылка
Автор решения: Andrew

Господи, как у вас все сложно.... Задача решается в 1 строку кода

// input/output : string
var strRez = str1.SubString(0,2) + str2.SubString(0,2);
//Лично я бы выбрал этот путь за счет читабельности
//Увидев его -- сразу понятен результат, даже, 
//если не виден контекст кода.
//Но преподавателю такой подход не понравится.


//input/output : int
var intRez = (number1 / 10) * 100 + number2 / 10;

// input: int, output: string
var strRez = $"{num1/10}{num2/10}"; 

А если полностью все писать, то нужно что-то вроде:

public static void Main(string[] args)
{
   var num1 = GiveMeNum("Введите ПЕРВОЕ трехзначное число");
   var num2 = GiveMeNum("Введите ВТОРОЕ трехзначное число");

   Console.WriteLine($"{num1/10}{num2/10}"); 
}

private static int GiveMeNum( string msg = ""){
    string str ="";
    int num = 0;
    
    while (str.length != 3) {
        Console.WriteLine(msg);
        str = Console.ReadLine();
        
        if (!Int32.TryParse(str, out num)) { str = ""; }
    }
    return num;
}

UPD: Решил, все же, выпилить из ответа дискард и удалиться от решения через подстроки. Чисто что бы не пугать препода.

→ Ссылка
Автор решения: aepot

Задача же простая, настолько, насколько это возможно. Здесь ее можно разделить на 2 части - огранизовать безотказный ввод трехзначного числа и провести вычисления.

Я уже написал метод безотказного ввода числа на StackOverflow ранее, просто сделаю перепост.

Безотказный ввод числа

public static int ReadNumber(string prompt, Predicate<int> condition, string errorMessage)
{
    int result;
    while (true)
    {
        Console.Write(prompt);
        if (int.TryParse(Console.ReadLine(), out result) && condition(result))
            break;
        Console.WriteLine(errorMessage);
    }
    return result;
}

Собственно, сам код

public static void Main(string[] args)
{
    string errorText = "Введите число от 100 до 999.";
    int number1 = ReadNumber("Введите первое трехзначное число: ", x => x >= 100 && x <= 999, errorText);
    int number2 = ReadNumber("Введите второе трехзначное число: ", x => x >= 100 && x <= 999, errorText);

    int result = number1 / 10 * 100 + number2 / 10;

    Console.WriteLine("Результат: {0}", result);
    Console.ReadKey();
}

Вывод в консоль

Введите первое трехзначное число: 123
Введите второе трехзначное число: 456
Результат: 1245

Тот же самый код, только для новичка, без предикатов

public static void Main(string[] args)
{
    string errorText = "Введите число от 100 до 999.";
    int number1;
    while (true)
    {
        Console.Write("Введите первое трехзначное число: ");
        if (int.TryParse(Console.ReadLine(), out number1) && number1 >= 100 && number1 <= 999)
            break;
        Console.WriteLine(errorText);
    }

    int number2;
    while (true)
    {
        Console.Write("Введите второе трехзначное число: ");
        if (int.TryParse(Console.ReadLine(), out number2) && number2 >= 100 && number2 <= 999)
            break;
        Console.WriteLine(errorText);
    }

    int result = number1 / 10 * 100 + number2 / 10;

    Console.WriteLine("Результат: {0}", result);
    Console.ReadKey();
}
→ Ссылка