【问题标题】:How to ignore/remove leading zeros?如何忽略/删除前导零?
【发布时间】:2014-07-19 10:02:20
【问题描述】:

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

`

【问题讨论】:

  • 没有得到..你能详细说明一下吗?
  • 为了让这里的人真正了解你在做什么,如果你能发布你的代码会有所帮助。对于大数字,我假设您的意思是大整数。
  • 只是迭代数字并在您看到第一个非零之后才开始打印它们? (在它们都为零的特殊情况下,打印一个 0。)
  • 抱歉,刚刚添加了代码。
  • 是的,鲁迪。我正在尝试添加两个大整数(20 位)。

标签: c arrays sorting leading-zero


【解决方案1】:

要获取实际数字(我假设每个数字都存储为 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。请注意,在size-1 处终止第一个循环将允许您避免后面的if else。此外,可能值得注意的是,如果您有权访问数组定义,而不仅仅是指向数组的指针,您只能以显示的方式计算 size。
  • @simonc:你是对的,最低位总是可以显示的。我会相应地更改代码。
  • 实际上,对于 C 和十进制数字,“假设 ASCII”的免责声明已过时。 C 要求 '0' 到 '9' 数字的编码是连续的。
  • 在 C 中,字符和字节都可以表示为数字或字符。将 '0'(即 0x30)加到 0 会将数字 0 变成字符 '0'(ASCII 0x30),将其加到 1 会返回字符 '1'(ASCII 0x31)等等。 printf 格式 "%c" 期望字符,不是数字。或者,我可以使用:printf("%d", thearray[i]);.
  • @RudyVelthuis 谢谢!
【解决方案2】:

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

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

这将删除所有前导零。

【讨论】:

  • 这不会跳过第一个非零数字吗?
  • 如果是 100,它将打印 10
  • @simonc 不是第一个非零,而是第一个零,如果零不领先,不是吗?
【解决方案3】:

我提出了一个使用指针的解决方案。还处理数组中仅存储零的情况。我对指针更满意。

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】:

    这是整数数组,你可以相应地修改它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多