如何忽略/删除前导零?

时间:2014-07-19 10:02:21

标签: c arrays sorting leading-zero

我正在编写一个程序,在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;
    } 
}

`

4 个答案:

答案 0 :(得分: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");

答案 1 :(得分:1)

您可以通过以下代码执行此操作: -

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

这将删除所有前导零。

答案 2 :(得分:0)

我建议使用指针解决方案。还处理了仅在数组中存储零的情况。我对指针感觉更舒服。

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

答案 3 :(得分:-1)

对于整数数组,您可以相应地修改它。

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