减一运算

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的各位数字。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值