Codewars练习(1)——Sum of odd numbers?

本文分享了一道Codewars上的编程挑战题,目标是计算一个由连续奇数组成的三角形中特定行的元素之和。通过分析规律,作者提出了一个简洁的算法,并使用C++实现,展示了如何高效地解决这个问题。

每周写Codewars的宗旨:多刷Codewars,多虐自己一点点,每周提升多一点

个人觉得Codewars都做的还挺好的,就是在它那个页面写代码不自带缩进很难受,所以我运行成功的代码都复制到Vscode里面调整好再放到代码块里的
Codewars:Kata 7kyu——Sum of odd numbers?
题目要求:
Given the triangle of consecutive odd numbers:

             1
          3     5
       7     9    11
   13    15    17    19
21    23    25    27    29
...

Calculate the row sums of this triangle from the row index (starting at index 1) e.g.:

rowSumOddNumbers(1); // 1
rowSumOddNumbers(2); // 3 + 5 = 8

C++编写:

long long rowSumOddNumbers(unsigned n){
    if(n == 1)  return 1;
    else
    {
        int m = n*(n-1)+1;
        int k = n/2;
        if(n%2 == 1)
        {
            return (m+k*2)*n;
        }
        else
        {
            return (m+n-1)*n;
        } 
    } 
} 

本来第一题我是打的Kata 6kyu——Is a number prime的,不过我真的是被虐的够惨,无论怎么打都是超时,没办法,第一个练个简单的,其实这道题要说难还是有一定的难度,要说简单也很简单,讲解一下我的思路:
思路:
这道题其实就类似于初高中的找规律求第几行第几个数是多少的题。不难看出其实每一行的和都可以是一个平均数乘上行数,那么我们要找到这个平均数是多少,只要知道该行的第一个数是多少就可以了。那么每行的第一个数就等于:行数×(行数-1)+1,也就是代码中的m = n*(n-1)+1;那么如果行数是奇数行,那么那个平均数大小就为:该行第一个数+(行数/2)×2,注意此处的(行数/2)的值是等于该运算所得值的整数部分,对应代码中的m+k*2;而如果行数是奇数,那么这个平均数大小就等于:该行第一个数+行数-1,对应代码中的m+n-1;那么最后将平均数乘上行数就是答案了。当然第一行是个例外,单独写出即可。

### 实现奇数与偶数之和的C语言函数 以下是基于提供的引用以及标准编程实践编写的解决方案。此方案利用指针遍历数组并分别累加奇数和偶数。 #### 函数实现 ```c #include <stdio.h> void sumOddEven(int *arr, int length, int *sum_odd, int *sum_even) { *sum_odd = 0; // 初始化奇数总和为零 *sum_even = 0; // 初始化偶数总和为零 for (int i = 0; i < length; ++i) { // 遍历数组中的每一个元素 if (*(arr + i) % 2 == 0) { // 如果当前元素是偶数 *sum_even += *(arr + i); // 将其加入偶数总和 } else { // 否则,如果当前元素是奇数 *sum_odd += *(arr + i); // 将其加入奇数总和 } } } ``` 上述代码中,`*(arr + i)` 使用了指针算术来访问数组中的第 `i` 个元素[^1]。通过这种方式,可以直接操作内存地址上的数据,从而提高程序效率。 #### 测试代码 为了验证功能正确性,可使用如下测试代码: ```c int main() { int array[] = {1, 2, 3, 4, 5, 6}; // 定义一个整型数组 int size = sizeof(array) / sizeof(array[0]); // 计算数组大小 int odd_sum = 0; int even_sum = 0; sumOddEven(array, size, &odd_sum, &even_sum); printf("Sum of Odd Numbers: %d\n", odd_sum); printf("Sum of Even Numbers: %d\n", even_sum); return 0; } ``` 在此示例中,调用了 `sumOddEven` 函数并将结果存储在变量 `odd_sum` 和 `even_sum` 中[^2]。最后打印这两个值以展示计算结果。 #### 输出样例 对于输入 `{1, 2, 3, 4, 5, 6}` 的情况,预期输出应为: ``` Sum of Odd Numbers: 9 Sum of Even Numbers: 12 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值