1-3 减一运算

1-3 减一运算 (20分)

给定一个由非负整数组成的非空数组,也就是一个大于0的自然数N的各位数字,其中最高位数字存放在数组的首位, 且每个数组元素只存储一位数字。

本题要求实现一个函数,在N的基础上减一,返回一个新的数组。

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

函数接口定义:
int* MinusOne(int *digits, int digitsSize, int *returnSize)

其中 ,digits是用户传入的数组,即N的各位数字,digitsSize 是该数组的大小,即N的位数;函数返回N-1后对应的新数组,*returnSize 是该数组的大小。

注意:返回的数组必须是通过动态分配内存建立的,且由主程序负责释放。

裁判测试程序样例:

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

/* 你的代码将被嵌在这里 */

输入样例:
2 0 1 9

输出样例:
2 0 1 8

int* MinusOne(int *digits, int digitsSize, int *returnSize){
    int *returndigits, i;
    //returndigits = (int *)malloc((*returnSize) *sizeof(int));
    returndigits = GetDigits(returnSize);  //由裁判程序可得 先要为returndigits这个数组动态分配内存
    if(digitsSize == 1){   //当输入的数组长度为1时,直接就减1
        returndigits[0] = digits[0] - 1;
        *returnSize = digitsSize;    
        return returndigits; 
    }
    else{
        for(i = digitsSize - 1; i >= 0; i--){     //从数组尾部扫描,遇0变9,否则就减一,并退出循环
            if(digits[i] != 0){
                digits[i] = digits[i] - 1;
                break;
            }
            else    digits[i] = 9;
        }
        if(digits[0] == 0){     //若数组首元素为0,说明数组中的其他元素都是9,要将数组长度减一
        int j = 0;
        for(j = 0; j < digitsSize; j++)       returndigits[j] = digits[j+1];
        *returnSize = digitsSize - 1;        
        }
        else{      //否则直接拷贝
            //int j = 0;
            for(int j = 0; j < digitsSize; j++)     returndigits[j] = digits[j];
            *returnSize = digitsSize;
        }    
        return returndigits;     //返回数组
        }
}
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值