[解题报告]【第02题】给定 n,求 1 + 2 + 3 + ... + n 的和 | 四种解法

请添加图片描述
今天是c语言基础打卡的第2天,主要内容是求和,希望大家能够理解呢,我就给大家记一下重点,给点课后题提示0.0。

相关链接:
【第02题】给定 n,求 1 + 2 + 3 + … + n 的和 | 四种解法

🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)

全文大约阅读时间: 10min



🎁主要知识点

🍗等比数列求和公式

1 + 2 + 3... + n = n ∗ ( n − 1 ) 2 1+2+3...+n = \frac{n*(n-1)}{2} 1+2+3...+n=2n(n1)

🍟C语言写法

错误示例

#include <stdio.h>
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int ans = n * (n + 1) / 2;   // (1)
        printf("%d\n\n", ans);
    }
    return 0;
}

直接就溢出了0.0

正确解法1

#include <stdio.h>
int main() {
    int n, ans;
    while (scanf("%d", &n) != EOF) {
        ans = 0;          
        while(n) {        
            ans += n;     
            --n;          
        }
        printf("%d\n\n", ans);
    }
    return 0;
}

运用循环来求解

正确解法2

#include <stdio.h>
int main() {
    int n, ans;
    while (scanf("%d", &n) != EOF) {
        if(n % 2 == 0) {          
            ans = n / 2 * (n+1);  
        } else {                  
            ans = (n+1) / 2 * n;   
        }
        printf("%d\n\n", ans);
    }
    return 0;
}

因为错误的解法是假溢出,我们先进行除法缩小范围,再进行乘法就好了呗?根据奇偶判断nn+1肯定有一个是偶数,让其中一个偶数和2相除就好了。

正确解法3

#include <stdio.h>
int main() {
    unsigned int n;
    while (scanf("%u", &n) != EOF) {
        unsigned int ans = n * (n + 1) / 2;
        printf("%u\n\n", ans);
    }
    return 0;
}

其实就是扩大数据范围。把所有数据变成无符号就好了

正确解法4

#include <stdio.h>
int main() {
    long long n;
    while (scanf("%lld", &n) != EOF) {
        long long ans = n * (n + 1) / 2; 
        printf("%lld\n\n", ans);
    }
    return 0;
}

其实就是扩大数据范围。把所有数据变成长整形。


📓课后习题

剑指 Offer 64. 求1+2+…+n

剑指 Offer 64. 求1+2+…+n

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

解题思路

这就剩递归能用了把?冲!

int sumNums(int n){
    if(n == 1) return 1;
    return n + sumNums(n - 1);
}

Sum Problem

Sum Problem

这网站关了,占个坑,回头补0.0


剑指 Offer 57 - II. 和为s的连续正数序列

剑指 Offer 57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

解题思路

使用双指针,遍历1-target/2去寻找满足条件的解。

int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
    (*returnSize) = 0;
    int ** ans = malloc(sizeof(int *)*100);
    (*returnColumnSizes) = malloc(sizeof(int)*100);
    for(int left = 1, right = 2;left <= target/2;){
        int sum = (left + right) * (right - left + 1) /2;
        if(sum == target){	//满足就保存
            int temp = right - left +1;
            ans[(*returnSize)] = malloc(sizeof(int)*temp);
            (*returnColumnSizes)[(*returnSize)] = temp;
            for(int i = left;i <= right;i++)
                ans[(*returnSize)][i-left] = i;
            (*returnSize)++;
            left++;
        }
        else if(sum < target)   right++;//小了大指针右移
        else left++;//大了小指针右移动
    }
    return ans;
}

📑写在最后

最近的重心还是会放到算法笔记上面,希望大家能跟我一起呀,我尽量更。0.0

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XingleiGao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值