Eniiyinola Okulate Ответов: 4

Как вычесть два больших числа, представленных в виде строк в языке Си#


мне нужна помощь с этой программой

вычитание 2 больших чисел с помощью строки





использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование System.Text;
использование системы.Нарезание резьбы.Задачи;

программа вычитания пространства имен
{
классная арифметика
{
static void Main(string[] args)
{
const int длина = 1000;
Строка В1;
Строки Дюйм2;
растянуться;
int[] Top = new int[длина];
int[] Bottom = new int[длина];
int[] Dif = новый int[длина - 1];
StringBuilder temp;
int заимствование = 0;
int TopLen = 0;
int BottomLen = 0;
int LenDif = 0;
int SumLen = 0;
int TopIn = 0;
int BottomIn = 0;



Приставка.WriteLine("выполнение вычитания\n");
Приставка.Напишите("введите первое число: ");
In1 = Консоль.Линия чтения();
Приставка.Напишите("введите второе число: ");
In2 = Консоль.Линия чтения();


//ПОЛУЧЕНИЕ БОЛЬШЕГО ЧИСЛА СВЕРХУ

// если(In1 < In2) //первый короче второго
{

for (int i = 0; i < TopLen; i++)
{
если (In1[i] < In2[i]) ;
Top[i] = In2[i] - '0';
}
LenDif = TopLen - BottomLen;

for (int i = 0; i < LenDif; i++)
{
Bottom[i] = 0; // pad bottom с нулями слева
}
for (int i = 0; i < BottomLen; i++)
{
Bottom[i + LenDif] = In1[i] - '0';
}
}
еще

// if (In2 < In1 )
{
TopLen = In1.Length;
BottomLen = In2.Length;
for (int i = 0; i < TopLen; i++)
{
Top[i] = In1[i] - '0';
}
LenDif = TopLen - BottomLen;
for (int i = 0; i < LenDif; i++)
{
Дно[i] = 0;
}
for (int i = 0; i < BottomLen; i++)
{
Bottom[i + LenDif] = In2[i] - '0';
}
}

// начните вычитание слева и вернитесь вправо

//---------------ЗАНИМАЮСЬ АРИФМЕТИКОЙ---------------------------
for (int i = TopLen -1; i >= 0; i--)
{
//два входа одинаковы
если (In1[i] == In2[i])
{
Out = 0; // выяснить.....
}


//одно из чисел равно нулю
еще
{
если (BottomIn == 0)
{
Out = Top[i];
}
}
еще
{
если (TopIn == 0)
{
Bottom[i] = Out;
}
}

}

for (int i = TopLen -1 -BottomLen)
{
//две цифры плюс заимствование
if(i > TopLen -1 -BottomLen)
{
Dif[i] = Top[i] - Bottom[i];
if (Top[i] == 0)
{
заимствование = 1;
Top[i] = 10;
Top[i] -= 9;
}
еще
{
брать = 0;
}
}

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SUBTRACTION PROGRAM 
{
    class Arithmetic
    {
        static void Main(string[] args)
        {
        const int LENGTH = 1000;
        String In1;
        String In2;
        String Out;
        int[] Top = new int[LENGTH];
        int[] Bottom = new int[LENGTH];
        int[] Dif = new int[LENGTH - 1];
        StringBuilder temp;
        int borrow = 0;
        int TopLen = 0;
        int BottomLen = 0;
        int LenDif = 0;
        int SumLen = 0;
        int TopIn = 0;
        int BottomIn = 0;



        Console.WriteLine("Doing Subtraction\n");
        Console.Write("Enter the First Number: ");
        In1 = Console.ReadLine();
        Console.Write("Enter the Second Number: ");
        In2 = Console.ReadLine();


        //GETTING LARGER NUMBER ON TOP 

        // if(In1 < In2)    //first shorter than second
        {
            
            for (int i = 0; i < TopLen; i++)
            {
                if (In1[i] < In2[i]) ;
                Top[i] = In2[i] - '0';
            }
            LenDif = TopLen - BottomLen;

            for (int i = 0; i < LenDif; i++)
            {
                Bottom[i] = 0;               // pad bottom with zeros on left 
            }
            for (int i = 0; i < BottomLen; i++)
            {
                Bottom[i + LenDif] = In1[i] - '0';
            }
        }
        else

         //   if (In2 < In1 )
        {
            TopLen = In1.Length;
            BottomLen = In2.Length;
            for (int i = 0; i < TopLen; i++)
            {
                Top[i] = In1[i] - '0';
            }
            LenDif = TopLen - BottomLen;
            for (int i = 0; i < LenDif; i++)
            {
                Bottom[i] = 0;
            }
            for (int i = 0; i < BottomLen; i++)
            {
                Bottom[i + LenDif] = In2[i] - '0';
            }
        }

        // start subtraction from the left and work back to right

        //---------------DOING ARITHMETIC---------------------------
        for (int i = TopLen -1; i >= 0; i--)
        {
            //two inputs are same 
            if (In1[i] == In2[i])
            {
               Out = 0;       // figure out.....
            }


            //one of the numbers is zero
            else
            {
                if (BottomIn == 0)
                {
                    Out = Top[i];
                }
            }
            else
            {
                if (TopIn == 0)
                {
                    Bottom[i] =  Out;
                }
            }

        }

        for (int i = TopLen -1 -BottomLen)
        {
            //two digits plus borrow
            if(i > TopLen -1 -BottomLen)
            {
                Dif[i] = Top[i] - Bottom[i];
                if (Top[i] == 0)
                {
                    borrow = 1;
                    Top[i] = 10;
                    Top[i] -= 9;
                }
                else
                {
                    borrow = 0;                
                }            
            }

Patrice T

опишите возникшую у вас проблему.
Показать пример ввода и вывода фактических и ожидаемых данных.

Gerry Schmitz

Выглядит почти как ассемблер. Я думаю, что вы будете делать хорошо. (но вы не инициализировали "TopLen")

4 Ответов

Рейтинг:
1

MadMyche

Лучше всего работать с числами как с числами. Существует несколько доступных методов, таких как int.Parse() или int.TryParse() что может помочь.

Я предпочитаю использовать последнее, так как оно вернет a логический указывает, была ли операция успешной.

То, как я переписал кусок вашего кода, использует 2 экземпляра Метод tryparse() метод, позволяющий не только получить значения, но и вернуть сообщение об ошибке, если какое-либо значение не может быть проанализировано.

Console.WriteLine("Doing Subtraction\n");
Console.Write("Enter the First Number: ");
In1 = Console.ReadLine();
Console.Write("Enter the Second Number: ");
In2 = Console.ReadLine();

// new variables to store the actual values entered as numbers
int Input1 = 0;
int Input2 = 0;
int SubtractionValue = 0;
int AdditionValue = 0;

if ((!int.TryParse(In1, out Input1)) || (!int.TryParse(In2, out Input2))) {
	Console.WriteLine("You didn't enter 2 numbers");
} else {
	// do normal math for the rest of program
}
Другие числовые типы (float, double, Int64...) также обладают аналогичной функциональностью.

Ссылка: Типа int32.Метод TryParse (Система) | Microsoft Docs[^]


Christian Graus

Я думаю, что полный пример будет лучше спросить еще раз с циклом while, если они не вводят числа....

MadMyche

Я думал об этом и начал кодировать таким образом, но я думаю, что детские шаги были бы лучшим подходом

Christian Graus

Он просто собирается скопировать и вставить теперь вы дали ему полный код так или иначе :)

MadMyche

Может быть, это и правда. Может быть, они будут исследовать самостоятельно и учиться по старинке. Или, может быть, задать другой вопрос

andres_fprado

Это не соответствует первоначальному вопросу. Ожидается, что представленная программа будет работать с числами длиной до 1000 цифр. Числа такой длины не могут быть представлены ни одним из встроенных числовых типов (даже десятичными).

BillWoodruff

было бы неплохо, если бы вы сказали об этом оператору !

MadMyche

ОП, могут рассчитывать на 1000 знаков, но заставляет ограничиваться 254 символов. А еще есть BigInteger который ограничен только памятью

Рейтинг:
1

Christian Graus

Вы можете сравнить строки. Как строка, 1 меньше 22, потому что самый левый символ является наиболее значимым. То, что вы ищете, - это int.Метод tryparse. Он возвращает bool. Вы можете продолжать запрашивать номер, пока пользователь не введет его.

 In1 = Console.ReadLine();
int n = 0;

if (int.TryParse(In1, out n)
{
// n is now the number version of In1
}


Рейтинг:
1

Patrice T

Цитата:
мне нужна помощь с этой программой

Я подозреваю, что первая проблема заключается в том, что ваша программа не компилируется из-за этой строки:
// if(In1 < In2)    //first shorter than second

потому что "если" необходимо.

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


Рейтинг:
0

andres_fprado

Следующая программа делает то, что вы просили, если я правильно ее понял. Код можно было бы упростить и оптимизировать, но я пошел на удобочитаемость. Надеюсь, это поможет!

using System;
using System.Linq;
using System.Text;

namespace substraction_program
   {
   class Arithmetic
      {
      static void Main(string[] args)
         {
         String In1;
         String In2;
         String Out;

         // Get and validate numbers
         Console.WriteLine("Doing Subtraction\n");
         do
            {
            Console.Write("\nEnter the First Number: ");
            In1 = Console.ReadLine();
            } while(!NumberValid(In1));

         do
            {
            Console.Write("\nEnter the Second Number: ");
            In2 = Console.ReadLine();
            } while(!NumberValid(In2));

         int maxLength = Math.Max(In1.Length, In2.Length);
         int[] Num1 = new int[maxLength];
         int[] Num2 = new int[maxLength];
         int[] Diff = new int[maxLength];

         // Load numbers from last to first char, completing with leading zeroes
         int i = maxLength - 1;

         foreach(var c in In1.Reverse())
            {
            Num1[i--] = c - '0';
            }
         while(i >= 0)
            {
            Num1[i--] = 0;
            }

         i = maxLength - 1;
         foreach(var c in In2.Reverse())
            {
            Num2[i--] = c - '0';
            }
         while(i >= 0)
            {
            Num2[i--] = 0;
            }

         // Determine largest number
         int largest = 0;     // -1 if Num1, 0 if equal, 1 if Num2
         for(i = 0; i < maxLength; ++i)
            {
            if(Num1[i] == Num2[i])
               continue;
            else
               {
               if(Num1[i] < Num2[i])
                  largest = 1;
               else
                  largest = -1;
               break;
               }
            }

         // If numbers are equal, fill result with zeroes
         if(largest == 0)
            {
            for(i = 0; i < maxLength; ++i)
               Diff[i] = 0;
            }
         else
            {
            // Start subtraction from RIGHT to left. 
            int borrow = 0;
            for(i = maxLength - 1; i >= 0; --i)
               {
               int n1 = largest > 0 ? Num2[i] : Num1[i]; // Digit from largest
               int n2 = largest > 0 ? Num1[i] : Num2[i]; // Digit from smallest
               n1 -= borrow;
               borrow = 0;

               while(n1 < n2)
                  {
                  borrow += 1;
                  n1 += 10;
                  }
               Diff[i] = n1 - n2;
               }
            if(borrow != 0)
               throw new InvalidOperationException("This should not happen!");
            // Note: this exception means the numbers were not correctly ordered.
            }

         // Store result in string
         StringBuilder sb = new StringBuilder();
         bool leading = true;
         for(i = 0; i < maxLength; ++i)
            {
            if(leading && Diff[i] == 0)
               continue;   // Skip leading zeroes.
            leading = false;
            sb.Append((char)(Diff[i] + '0'));
            }
         if(sb.Length == 0)   // If difference is zero!
            sb.Append('0');
         Out = sb.ToString();

         // Show result
         Console.WriteLine("\nThe result is:");
         Console.WriteLine(Out);
         }

      private static bool NumberValid(string str)
         {
         foreach(var c in str)
            if(c < '0' || c > '9')
               return false;     // Not a valid number!
         return true;            // All numbers -> valid!
         }
      }
   }