【问题标题】:How can I align two integer arrays by index in C?如何在 C 中按索引对齐两个整数数组?
【发布时间】:2012-11-16 23:40:25
【问题描述】:

我知道这个问题可能看起来不太清楚。

基本上,我正在尝试编写一个程序来显示基本算术计算(当然是通过控制台),就像孩子们会做的那样。

例如:

   5,294
+ 0,706

= 等等

所以我将两个数字放在单独的数组中,按数字分开(所以一个 int 数组,如:{5,2,9,4})。

我要学习/弄清楚的是,如果两组数字的位数不同,我将如何将它们对齐。例如,如果我只有 706 而不是 0,706?目前我有两个数组,一个像 {5,2,9,4} 和另一个像这样:{7,0,6} - 我需要 4 超过 6。

希望这对大家有意义!

提前致谢!

【问题讨论】:

  • 你尝试了什么?提示:使用最大长度,从左到右,如果你的 index>=len 输出 '0'。
  • 你有没有尝试过什么?你对这件事有什么想法吗?
  • 为什么不将它们从左到右存储并打印在对面。它会更容易计算并始终对齐。前任。 124 将是 {4,2,1}
  • 我尝试了几种不同的方法来使用每个数组的长度,然后在较小数字的一侧放置零以对齐它们。不确定是否有更好的方法。

标签: c arrays math


【解决方案1】:

我认为这段代码 sn-p 可能会生成您正在寻找的那种输出,它适用于普通整数,因此您不需要弄乱数组:

char tmpstr[1];
int total = first + second;
int width = snprintf(tmpstr, 1, "%d", total);
printf("  %*d\n", width, first);
printf("+ %*d\n", width, second);
printf("  %.*s\n", width, "-----------");
printf("= %*d\n", width, total);

【讨论】:

  • 是的,这将是更明显的方法。不幸的是,我计划对非常大的数字进行减法/乘法/除法,所以我需要我的代码能够具有高精度,因此我使用数组而不是单独封装每个数字。
  • @Josh 改用字符串会有多难?您可以使用 %*s 格式轻松地对它们进行右对齐。
  • 最初我正在考虑使用 char 数组,但我仍然需要为每个操作将所有内容转换为 int。除非你有不同的想法?
  • @Josh 我想您可以使用存储在 char 数组中的整数进行计算,然后在打印之前将它们转换为 ASCII,但您必须记住允许尾随 '\0'。跨度>
【解决方案2】:

您需要有关数组中小数点的信息。否则你可以只使用整数。我会将指数以 10 为底,并使其成为我的第一个或最后一个条目。一旦你有了这个,你就可以用它来相应地改变你的格式。

“0,706”将变成“{-3, 7, 0, 6}”,第一个数字是指数。然后你像这样对齐你的逗号

//0 -1 -2 -3
   ,  
   ,

然后输入你的号码

//0 -1 -2 -3
  0, 7  0  6
   ,

冲洗并重复。

【讨论】:

    【解决方案3】:

    只需查找每个数组的长度并找到最长的长度。然后为每个没有该长度的数组创建新数组,并首先用旧短数组的数字填充这些数组,然后为其余的值填充零,直到达到索引 0。我希望我做到了正确理解你的问题,用我的建议回答你的问题。

    这当然只有在不涉及小数点的情况下才有效。如果涉及小数点,则必须找到其左侧和右侧的最大位数,然后为每个不符合此条件的旧数组创建新数组,并执行与上述相同的操作。

    编辑: 一种更简单的方法是,只需颠倒每个数组的顺序,然后进行计算,但将数字放在右边(而不是左边)和最后将结果的顺序颠倒。

    【讨论】:

    • 如果我们暂时忽略存在小数点的可能性(想想非常基本的算术),我将如何将数字向下移动以提供零空间?只需向后遍历数组并将每个索引重新初始化为 i+1?
    • 假设您有一个长度为 5 和长度为 3 的数组。您检查长度并发现最长为 5。您看到有一个长度不是 5 (3) 的数组并创建一个新的长度为 5 的数组。然后开始用长度为 3 的数组的值(也从后面)向后填充新数组,并用零填充前面的其余空格。
    • 嗯,是的,这是有道理的。我最初有这个想法,但不确定如何最好地实现它。如果我尝试使用您刚刚编辑的方法,那么其余索引不会是随机信息而不是0吗?我的意思是反转后的尾随数字。假设一个长度是5,另一个是3,即使我颠倒顺序,我仍然需要初始化那些零来平衡它,对吧?
    • 那么您可以简单地从 0 循环到“最大索引”并将每个数组添加到该循环中,但检查每个数组,如果当前循环编号高于其最大索引以避免 OutOfRange 问题.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2021-12-28
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多