每题多学点——Odd or Even?【C语言】

一、原题

原题链接 Odd or Even? 

Instructions

Task:

Given a list of integers, determine whether the sum of its elements is odd or even.

Give your answer as a string matching "odd" or "even".

If the input array is empty consider it as: [0] (array with a zero).

Examples:

Input: [0]
Output: "even"

Input: [0, 1, 4]
Output: "odd"

Input: [0, -1, -5]
Output: "even"

二、解题 

1、读题 

        结合下面题中给出的测试用例, 可以知道,此题是将输入值求和,结果为基数返回“odd”,结果为偶数返回“even”。

  cr_assert_str_eq(odd_or_even((int[]){0}, 1), "even");
  cr_assert_str_eq(odd_or_even((int[]){1}, 1), "odd");
  cr_assert_str_eq(odd_or_even((int[]){}, 0), "even");
  cr_assert_str_eq(odd_or_even((int[]){0, 1, 5}, 3), "even");
  cr_assert_str_eq(odd_or_even((int[]){0, 1, 3}, 3), "even");
  cr_assert_str_eq(odd_or_even((int[]){1023, 1, 2}, 3), "even");
  cr_assert_str_eq(odd_or_even((int[]){0, -1, -5}, 3), "even");
  cr_assert_str_eq(odd_or_even((int[]){0, -1, -3}, 3), "even");
  cr_assert_str_eq(odd_or_even((int[]){-1023, 1, -2}, 3), "even");
  cr_assert_str_eq(odd_or_even((int[]){0, 1, 2}, 3), "odd");
  cr_assert_str_eq(odd_or_even((int[]){0, 1, 4}, 3), "odd");
  cr_assert_str_eq(odd_or_even((int[]){1023, 1, 3}, 3), "odd");
  cr_assert_str_eq(odd_or_even((int[]){0, -1, 2}, 3), "odd");
  cr_assert_str_eq(odd_or_even((int[]){0, 1, -4}, 3), "odd");
  cr_assert_str_eq(odd_or_even((int[]){-1023, -1, 3}, 3), "odd");

 2、分析

        1)题中通过const char *odd_or_even(const int *v, size_t sz),传入存储值的整型数组的初始地址和数组长度,可通过v[i]遍历每个值,通过for循环求和

 for(i=0;i<s_z;i++){
    sum+=v[i];
  }

其中, const char *odd_or_even(const int *v, size_t sz), 表示C中任何对象所能达到的最大长度,它是无符号整数。为便于使用,我将其强制转换成int型,并赋值给s_z。

参考链接    size_t 数据类型_size-t-CSDN博客

 int i,sum=0,s_z;
  s_z=(int)sz;  

        2)因为是个char型指针函数,无法通过char数组返回结果(因为char[],在函数调用结束后就失效,不能用来传递结果),故需要申请动态地址。

 char *a=(char *)malloc(sizeof(char)*5); char *a=(char *)malloc(sizeof(char)*5);

        3)因为malloc申请的动态地址是连续的,且上面申请的地址存入char *a,可以用a[i]对每一个进行读写。

        如:

a[0]='e';
a[1]='v';
a[2]='e';
a[3]='n';

4)根据结果的奇偶型,将对应结果存入a[i],并返回首地址a;

 if(sum%2==0){
    /*strcmp(a,"even"); 该方式错误*/
    a[0]='e';
    a[1]='v';
    a[2]='e';
    a[3]='n';
  }
  else{
    
    a[0]='o';
    a[1]='d';
    a[2]='d';
  }
  return a;

3、Myway 

 

#include <stddef.h>
#include<string.h>
#include<stdlib.h>
const char *odd_or_even(const int *v, size_t sz) {
  char *a=(char *)malloc(sizeof(char)*5);
  int i,sum=0,s_z;
  s_z=(int)sz;  
  for(i=0;i<s_z;i++){
    sum+=v[i];
  }
  if(sum%2==0){
    /*strcmp(a,"even"); 该方式错误*/
    a[0]='e';
    a[1]='v';
    a[2]='e';
    a[3]='n';
  }
  else{
    
    a[0]='o';
    a[1]='d';
    a[2]='d';
  }
  return a;
}

三、总结

1、动态申请空间后存入值

该题需存入定长且较短的“odd”或“even”,通过a[i]存入,然后返回首地址a即可,可是若返回结果长度变化大或者多个值,该方法就乏力了。若有好方法,欢迎留言。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱读书的小胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值