一、原题
原题链接 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] Input: [0, 1, 4] Input: [0, -1, -5] |
二、解题
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即可,可是若返回结果长度变化大或者多个值,该方法就乏力了。若有好方法,欢迎留言。