C程序设计高级编程动态分配内存之减一运算
减一运算
给定一个由正整数组成的非空数组,也就是一个大于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;
}
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;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 0 1 9
输出样例:
2 0 1 8
我的代码及详细解答
int* MinusOne(int *digits, int digitsSize, int *returnSize)//在原数组的基础上减一,返回一个新的数组
{
//定义将要返回的数组,即N-1的各位数字
int *returndigits=GetDigits(returnSize);
//当原数组大小为1时
if(digitsSize==1)
{
digits[0]=digits[0]-1;
*returnSize=digitsSize;
}
//当原数组大小不为1时
else
{
for(int i=digitsSize-1;i>=0;i--)//从N-1位数开始
{
//判断各位数字是否为0,并作出相应操作
if(digits!=0)
{
digits[i]=digits[i]-1;
break;//完成减一操作,跳出循环
}
else
digits[i]=9;
}
if(digits[0]==0)//判断数组第一位是否为0
{//为0,则进行数组后移
for(int j=0;j<digitsSize;j++)
{
returndigits[j]=digits[j+1];
*returnSize=digitsSize-1;
}
}
else
{
for(int j=0;j<digitsSize;j++)
{
returndigits[j]=digits[j];
*returnSize=digitsSize;
}
}
return returndigits;
}
}
补充:
个人认为裁判程序中int *GetDigits(int *digitsSize);的作用是传入数组大小,传出数组N的各位数字。