PTA 减一运算

185 阅读1分钟

给定一个由正整数组成的非空数组,也就是一个正整数N(1≤N<10100010^{1000})的各位数字,其中最高位数字存放在数组的首位, 且每个数组元素只存储一位数字。

请求出N-1对应的新数组并输出。

假设除了整数 0 之外,数组的首元素不会是零。

输入格式:

输入在一行中给出正整数N的各位数字,用空格隔开

输出格式:

输出N-1的各位数字,用空格隔开

输入样例:

2 8 6 6 
结尾无空行

输出样例:

2 8 6 5 
结尾无空行

代码:

#include <stdio.h>
#include <stdlib.h>

int *GetDigits(int *digitsSize);
int* MinusOne(int *digits, int digitsSize, int *returnSize);

int main()
{
    int *digits, *returnDigits, digitsSize, returnSize,i;

    digits = GetDigits(&digitsSize);
    returnDigits=MinusOne(digits, digitsSize, &returnSize);
    for (i=0;i<returnSize;i++)
        {
        printf("%d ", returnDigits[i]);
    }
        printf("\n");
    free(digits);
    free(returnDigits);

    return 0;
}

int *GetDigits(int *digitsSize)
{
    int *res,i;
    char s[2001];

    if (fgets(s,2001,stdin))
    {
    }
    res=(int *)malloc(1000*sizeof(int));
    *digitsSize=0;
    for (i=0;s[i];i++)
    {
        if (s[i]>='0' && s[i]<='9')
        {
            res[(*digitsSize)++]=s[i]-'0';
        }
    }
    return res;
}

/* 你的代码将被嵌在这里 */
int* MinusOne(int *digits, int digitsSize, int *returnSize)
{
    int *returndigits = GetDigits(returnSize);
    if(digitsSize == 1 )
    {
        returndigits[0] = digits[0] - 1 ;
        *returnSize = digitsSize;
        return returndigits;
    }
    else
    {
        for (int i = digitsSize-1 ; i >= 0 ; i-- )
        {
            if(digits[i] != 0)
            {
                digits[i] = digits[i] - 1 ;
                break;
            }
            else
                digits[i] = 9 ;
        }
        if (digits[0] == 0 )
        {
            for( int i=0 , j=1 ; j < digitsSize ; i++,j++)
                returndigits[i] = digits[j];
            *returnSize = digitsSize -1 ;
        }
        else
        {
            for (int i=0 ; i <digitsSize ; i++ )
                returndigits [i] = digits[i] ;
            *returnSize = digitsSize;
        }
        return returndigits;
    }
}

提交结果: