今天的打卡章节为《C语言入门100例》(第2例) 求和;
附上链接:【第02题】给定 n,求 1 + 2 + 3 + ... + n 的和 | 四种解法
全文目录主要内容
求和方法:
力扣习题:
剑指 Offer 64. 求1+2+…+n
剑指 Offer 57 - II. 和为s的连续正数序列
主要内容 求和方法:
解法一:循环枚举
#includeint main() { int n, ans; while (scanf("%d", &n) != EOF) { ans = 0; while(n) { ans += n; --n; } printf("%dnn", ans); } return 0; }
解法二:奇偶性判断
#includeint 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("%dnn", ans); } return 0; }
解法三:无符号整型
#includeint main() { unsigned int n; while (scanf("%u", &n) != EOF) { unsigned int ans = n * (n + 1) / 2; printf("%unn", ans); } return 0; }
解法四:64位整型
#include力扣习题: 剑指 Offer 64. 求1+2+…+nint main() { long long n; while (scanf("%lld", &n) != EOF) { long long ans = n * (n + 1) / 2; printf("%lldnn", ans); } return 0; }
直接递归相加
int sumNums(int n){ if(n==0) { return 0; } return n+sumNums(n-1); }剑指 Offer 57 - II. 和为s的连续正数序列
n的和只能在n/2 + 1之前产生,利用双指针遍历1到n/2查找符合的条件,具体看代码。
int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes) { if (target < 1) { return NULL; } int** ans = (int**)malloc(sizeof(int*) * target); *returnColumnSizes = (int*)malloc(sizeof(int) * target); int left = 1, right = 1, sum = 0, len = target / 2; *returnSize = 0; while (left <= len) { if (sum == target) { (*returnColumnSizes)[*returnSize] = right - left; ans[*returnSize] = (int*)malloc(sizeof(int) * (right - left)); for (int i = left; i < right; i++) { ans[*returnSize][i - left] = i; } (*returnSize)++; sum -= left++; } if (sum < target) { sum += right++; } if (sum > target){ sum -= left++; } } return ans; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)