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; //返回数组
}
}