我正在解决以下问题:
5.2递增任意精度整数
编写一个程序,该程序将编码非负十进制整数D的数字数组作为输入,并更新该数组以表示整数D + 1。例如,如果输入为<1,2,9>,则应将数组更新为<1,3,0>。即使您的算法是使用具有有限精度算法的语言实现的,它也应该可以工作。
我的策略是:
首先反转数组输入,以便更轻松地增加数组并考虑进位数字。
使用malloc将结果数字存储在动态分配的数组中。因此,如果结果中的位数超出输入数组的容量,则动态分配的数组可以使用realloc扩展内存以包括最后一个进位数字。
反转动态分配的数组,使其顺序正确。
将指针返回到动态分配的数组的第一个元素。
我只是想使链接列表存储一个int值:
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include "Node.h"
void reverse (int * a, int len)
{
for ( int i = 0, j = len - 1; i < j; i++, j--)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int * inc_arr(int *a, int len)
{
int result_len = 0;
reverse(a,len); int * a_end = (a + len - 1);
*a = *a + 1; int carry = *a/10; *a = *a%10;
Node * result = (Node *)malloc(sizeof(Node));
Node * result_zero = result;
result->value = *a; result = result->link; result_len++;
while (a <= a_end)
{
if ( carry != 0)
{
result->value = (carry + *a)%10;
carry = (carry + *a)/10;
}
else
{ result->value = *a; carry = 0;}
result = result->link; result_len++;
a++;
}
if ( carry != 0)
{
result->value = carry; result_len++;
result->link = NULL;
}
else
{ result = NULL; }
int a_final[result_len]; int *a_f = a_final;
while (result_zero != NULL)
{
*a_f++ = (result_zero->value);
result_zero = result_zero->link;
}
reverse(a_final,result_len);
return a_final;
}
int main()
{
int a[3] = {1,2,9};
int * b = inc_arr(a,3);
}
但是,在以下代码行:
result->value = (carry + *a)%10;
调试器演示计算机拒绝超出此代码范围 线,无论我尝试使用 调试器。这是什么原因呢?我最终得到一个:
fish:'./exercise_5-2.o'被信号SIGSEGV(地址边界错误)终止