蓝桥杯某例题的解决方案和拓展(完全能解决例题本身)

蓝桥杯题目:求1(包含)直到20230408(包含)所有自然数的加和。


这个题比较恶心的一点在于,20230408本身没有超过int的上限,但是它的加和是超过int上限的,因此如果直接用int来计算,就会变成负数,算错结果。

当然,一个最简单的方法,或许就是设定一个long long类型的变量,比如long long sum,用sum来存放这个结果。这样由于long long的上限比int要大,就可以解决这个问题。然而这个方法有个明显的缺点,在于long long类型实际上也是有边界的,而且边界也比int大不了多少,只要你放入的数字足够大,你就总有可能破除上限,导致类似先前的问题。

因此我采用了一种灵感来源于"科学计数法"的方法,即,我把这个输入的数字做拆分,把它每一位的数字都分开存储到数组里面,这样我只需要进行数组对应位置的加减然后检查其是否需要进位就可以了。

下面我们展示完整的代码,我这次仍然给他加了注释,用了递归和指针:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//求1(含)到20230408(含)中每个数的和
//204 6347 1403 8436       65566
//204 6347 1403 8436
int spreadFun(int a,int b,int* c, int arr_rec[]) {  
	if (a / 10 > 10) {
		arr_rec[b]=spreadFun(a / 10,b+1,c, arr_rec);
		*c = *c + 1;
		return a % 10;
	}
	else {
		arr_rec[0] = a/10;
		*c = *c + 1;
		return a % 10;
	}
}

int main()
{
	int input =1 ; int arr_each[25] = { 0 }; 
	int arr_sum[25] = { 0 };  
	int cont = 0; int chan = 0;
	int whAt = 0;
    int* pcount = &cont;
	printf("请输入你要计算的大数");
	scanf("%d", &whAt);
	while (input<20230409) {
		//这部分成功将每一位分离
		//scanf("%d", &input);
		int count = 1; int t = 0;
		arr_each[cont]=spreadFun(input, count, pcount, arr_each);
		chan = arr_each[cont];
		arr_each[cont] = arr_each[0];
		arr_each[0] = chan;
		//这部分成功将每一位分离
		while (t <= cont) {
			arr_sum[24 - t] += arr_each[t];//存到sum后侧以方便进位
			t++;
		}
		//此时t=cont
		t = 0;
		//下面用于检查是否某一位大于10并进位
		while (t <= cont) {
			if (arr_sum[24 - t] >= 10) {
				arr_sum[23 - t] += (arr_sum[24 - t] / 10);
				arr_sum[24 - t] = (arr_sum[24 - t] % 10);
			}
			t++;
		}
		if (input == whAt) {
			for (t = 0; t <= 24; t++) {
				printf("%d", arr_sum[t]);
			}
			printf("\n");

		}
		cont = 0; input++;
	}
	return 0;
}

这就是我完整的代码了,欢迎检验,这个代码我给他做了修改,现在你不仅仅可以用于求这个蓝桥杯的题,也可以用于求任何大数的加和,前提是,它的加和不要超过24,如果你需要更大的数字,你可以修改数组的大小,这样也可以达到你的目的。

相关推荐
KobeSacre5 分钟前
CyclicBarrier 源码
java·jvm·算法
手写码匠5 分钟前
注意力机制全家桶:从 Multi-Head 到 GQA 再到 Flash Attention 的手写实现
人工智能·深度学习·算法·aigc
达达尼昂8 分钟前
编码智能体中的模型选择与执行深度
人工智能·后端·程序员
用户67570498850211 分钟前
写了 6 年 Go ,我终于领悟到了泛型的真正威力!
后端·go
名字还没想好☜27 分钟前
Go error 处理:errors.Is/As 与错误包装
开发语言·后端·golang·go·错误处理
csdndenglu40 分钟前
Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据,无复杂要求时可替代VTK
开发语言·c++·图形渲染·3d渲染
doiito42 分钟前
【安全,架构】RustyVault 项目深度分析报告以及和HashiCorp Vault的差异
后端·安全·rust
学究天人43 分钟前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷3.2)
线性代数·算法·机器学习·数学建模·动态规划·抽象代数·拓扑学
尚早立志1 小时前
Spring Boot 之 BeanDefinitionLoader 详解
java·spring boot·后端
tkevinjd1 小时前
力扣322-零钱兑换
算法·leetcode·动态规划