How to ignore/remove leading zeros?

喜你入骨 提交于 2019-12-11 00:07:39

问题


I am writing a program to add two large numbers in C. My integer array result holds the sum of the two numbers (which were also stored in arrays).

For example, if the result array is [0,0,3,2] (actual array size is 20)

If 32 is my actual result, how can I display the contents of the result array without the leading zeros ?

#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;
    } 
}

`


回答1:


To get the actual digits (I assume that each digit is stored as a byte in an array of 20 bytes, lowest digit at highest index), you do something like this:

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");



回答2:


You can do this by below code:-

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

This will remove all leading zeros.




回答3:


I propose a solution by using the pointer. The situation where only zero is stored in the array is also handled. I'm more comfortable with the pointer.

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");



回答4:


Thats for integer array you can modify it accordingly.

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
    }
}


来源:https://stackoverflow.com/questions/24839107/how-to-ignore-remove-leading-zeros

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!