【问题标题】:How do i subtract equal digit large numbers?我如何减去相等数字的大数?
【发布时间】:2018-02-15 18:17:52
【问题描述】:

我减去了数字长度不相等的大数,但我不能减去长度相等的数字。我从用户那里获取一个 2 字符串作为数字输入,我正在使用 str[ 将其转换为整数数组i]-'0'。到目前为止,我已经交换了较小长度的值 - 较大长度的整数。我必须对 50 位数字进行减法。我可以减去不等长度的字符串。但是,如果数字相等,我是无法做到这一点。我不能使用 atoi 函数。我所做的是将字符串转换为整数数组,然后使用 sub_logic 中的减法逻辑进行减法 这是我减去相等数字的逻辑。

【问题讨论】:

  • 你对那里的 cmets 有点疯狂,要是代码更易读就好了。
  • 您要减去的数字有多“大”?您可以使用 64 位整数变量减去 19 位的数字。我对 c++ 不太熟悉,但在 ansi C 中你可以这样做: long long result = atoll(first_string) - atoll(second_string); printf ("%lli",result);
  • 要么我误解了你的目标,要么你在这里有点过火了。像小学生一样做减法。从最不重要的一端开始,朝着最重要的方向努力,从顶部减去底部数字。
  • 我必须对 50 位数字进行减法。我可以对不等长度的字符串进行减法。但是,如果数字相等,我无法这样做。我不能使用 atoi 函数。我已完成将字符串转换为整数数组,然后我正在使用 sub_logic 中的减法逻辑进行减法

标签: c++ arrays subtraction


【解决方案1】:

半回答,因为当更简单的方法可行时,我想不出调试 Asker 算法的充分理由。

这是你表现得像个孩子的好机会。

  1. 将数字保留为strings1
  2. 通过在最短的前面加上零,使它们的大小相同。
  3. 如果要减去的数字(被减数)是较大的数字,请将这两个数字颠倒过来,这样您总是从较大的数字中减去较小的数字。记下您颠倒了操作数的顺序。
  4. 从右到左,减去数字并根据需要从较大的数字中跟踪任何借用。
  5. 如果您颠倒了操作数顺序,请将结果标记为负数。

1您不必将字符解析为数字,因为没有健全的字符编码会打乱数字的顺序或位置。 The C++ standard [lex.charset] requires this.

但是,跟踪借用可能会迫使您使用更大的存储空间,因为您可能会发现自己的数字高达 18,而 C++ 标准不保证字符可以存储。如果数字位于编码的末尾,则超出您可以存储在数字中的内容并指望另一个字符将不起作用。这不是我所知道的每个字符编码的问题,但不能保证。

你很可能(假设这里是 ASCII)侥幸逃脱

if (a[index] < b[index]) 
{
    a[index - 1]--; // a > b as per step 3 above, so this can't happen with last digit.
    a[index] += 10;
}
result[index] = '0' + a[index] - b[index];

对于第 4 步。我相信这是一个很好的学校作业假设,但我会更加小心生产代码以确保 a[index] += 10; 不会溢出 char

借来的数字最终会坐在“;”的顶部通过'a',没有人会关心数学。虽然是破坏性的。 a 被损坏了

【讨论】:

  • 我已经为减法创建了类似的逻辑。但是问题在于当数字相等并且以相同的数字开头时。当 a[0]== 时我必须交换或不交换值b[0];我无法设置此逻辑 3453-3264 正在交换值并给出错误答案,但 6000-6999 正在通过交换值给出正确答案
  • 不要只看一个字符,如果整个字符串较少,则交换整个字符串。 if (a &lt; b) { swap (a,b);} else if (a==b) {return 0;}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多