Как игнорировать/удалять ведущие нули?

Я пишу программу для добавления двух больших чисел в C. Результат моего целочисленного массива содержит сумму двух чисел (которые также хранились в массивах).

Например, если результирующий массив равен [0,0,3,2] (фактический размер массива равен 20)

Если мой фактический результат равен 32, как я могу отобразить содержимое массива результатов без начальных нулей?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BASE 10
void align(int A[],int n);
void add(int A[],int B[], int C[]);
void Invert(int* a, int n);

int main(int argc, char** argv){
    char input1[20];
    char input2[20];
    int size = 20;
    int a;
    int b;
    int num1[20];
    int num2[20];
    int result[20];
    int length1 = strlen(argv[1]);
    int length2 = strlen(argv[2]);
    int i = 0;
    for (i=0;i<length1;i++){
       input1[i] = argv[1][i];
    }
    for (i=0;i<length2;i++){
        input2[i] = argv[2][i];
    }

    a=atoi(input1);
    b=atoi(input2);
    align(num1,a);
    align(num2,b);
    add(num1,num2,result);
    Invert(result,size);
    for (i=0;i<20;i++){
        printf("%d",result[i]);
    }

    return 0;
}

void align (int A[], int n){
    int i = 0;

    while (n) {
        A[i++] = n % BASE;

        n /= BASE;
    }

    while (i < 20) A[i++] = 0;
}

void add (int A[], int B[], int C[]) {
    int i, carry, sum;
    carry = 0;
    for (i=0; i<20; i++) {
        sum = A[i] + B[i] + carry;
        if (sum >= BASE) {
            carry = 1;
            sum -= BASE;
        } else
            carry = 0;
        C[i] = sum;
    }

    if (carry) printf ("overflow in addition!\n");
}

void Invert(int* a, int n)
{
    int i;
    int b;
    for(i=0; i<n/2; i++){
        b = a[i];
        a[i] = a[n-i-1];
        a[n-i-1] = b;
    } 
}

`


person Rohan    schedule 19.07.2014    source источник
comment
Не получается.. можно подробнее?   -  person Jayesh Bhoi    schedule 19.07.2014
comment
Чтобы люди здесь действительно понимали, что вы делаете, было бы полезно, если бы вы могли опубликовать свой код. Я предполагаю, что под большими числами вы имеете в виду что-то вроде больших целых чисел.   -  person Rudy Velthuis    schedule 19.07.2014
comment
Просто перебрать числа и начать печатать их только после того, как вы увидели первое ненулевое значение? (В особом случае, когда все они равны нулю, выведите один 0.)   -  person Arkku    schedule 19.07.2014
comment
Извините за путаницу, просто добавил код.   -  person Rohan    schedule 19.07.2014
comment
Да, Руди. Я пытаюсь добавить два больших целых числа (20 цифр).   -  person Rohan    schedule 19.07.2014
comment
Обратите внимание, что эффективные bignum операции требуют сложных< /i> сложные алгоритмы. Поэтому лучше использовать существующие библиотеки bignum, такие как GMPlib, чем изобретать собственную, которая будет работать плохо.   -  person Basile Starynkevitch    schedule 19.07.2014


Ответы (4)


Чтобы получить фактические цифры (я предполагаю, что каждая цифра хранится в виде байта в массиве из 20 байтов, самая низкая цифра имеет самый высокий индекс), вы делаете что-то вроде этого:

int i;
int size = sizeof(thearray) / sizeof(thearray[0]);

/* find first non-0 byte, starting at the highest "digit" */
for (i = 0; i < size - 1; ++i)
    if (thearray[i] != 0)
        break;

/* output every byte as character */
for (; i < size; i++)
    printf("%c", thearray[i] + '0'); /* 0 --> '0', 1 --> '1', etc. */
printf("\n");
person Rudy Velthuis    schedule 19.07.2014
comment
+1. Обратите внимание, что завершение первого цикла в size-1 позволит вам избежать более позднего if else. Кроме того, возможно, стоит отметить, что вы можете вычислить size только так, как вы показываете, если у вас есть доступ к определению массива, а не только к указателю на массив. - person simonc; 19.07.2014
comment
@simonc: вы правы, всегда можно отобразить самую низкую цифру. Я изменю код соответственно. - person Rudy Velthuis; 19.07.2014
comment
Фактически, для C и десятичных цифр заявление об отказе от ответственности, предполагающее, что ASCII устарело. C требует, чтобы кодирование от '0' до '9' цифр было последовательным. - person Jongware; 19.07.2014
comment
В C символы и байты могут быть выражены как числа или как символы. Добавление «0» (т.е. 0x30) к 0 превращает число 0 в символ «0» (ASCII 0x30), добавление его к 1 возвращает символ «1» (ASCII 0x31) и т. д. Формат printf "%c" ожидает char, не число. В качестве альтернативы я мог бы использовать: printf("%d", thearray[i]);. - person Rudy Velthuis; 19.07.2014
comment
@RudyVelthuis Спасибо! - person Rohan; 19.07.2014

Вы можете сделать это с помощью кода ниже:-

int flag=1;
for(i=0;i<20;i++)
{
   if(flag==1&&array[i]!=0)
      flag=0;
   if(flag!=1)
   {
      printf("%d",array[i]);
   }
}

Это удалит все ведущие нули.

person Devavrata    schedule 19.07.2014
comment
Не пропустит ли это первую ненулевую цифру? - person simonc; 19.07.2014
comment
В случае 100 он напечатает 10 - person A.s. Bhullar; 19.07.2014
comment
@simonc не первый не ноль, а первый ноль, если ноль не является ведущим, не так ли? - person A.s. Bhullar; 19.07.2014

Я предлагаю решение с помощью указателя. Также обрабатывается ситуация, когда в массиве хранится только ноль. Мне удобнее с указателем.

int test[20] = {0,0,0,0,1,2,3,4,5,6,7,8,9,0,0,1,2,3,4,5};
int test_bis[20] = {0};
int * ptr_test  = test_bis;

int ii = 0;

while( *(ptr_test)== 0 && ii < 20 ) {
    ptr_test++;
    ii++;
}
if( ii < 20)
    do {
        printf("%d",*(ptr_test));
        ptr_test++;

    } while (++ii < 20);
else
    printf("0");
person Yaxu Wei    schedule 18.05.2018

Это для целочисленного массива, вы можете изменить его соответствующим образом.

for(i=0;i<20;i++){
    if(flag==1&&array[i]==0)
        {
               // just skips until first nonzero
        }
    else if(flag==1&&array[i]!=0){
        flag=0;               // when first nonzero comes set flag to 0 and print it
        printf("%d",array[i]);
    }
    else {
        printf("%d",array[i]);  // after first nonzero simply print it
    }
}
person A.s. Bhullar    schedule 19.07.2014