零基础算法题-数列求和-加强版

这道题如果使用最原始的方式就是不断的循环乘十得到每一个数,最后一个相加。

#include <stdio.h>
int main()
{
    int a,n;
    scanf("%d %d",&a,&n);
    int i = 0;
    int j = 0;
    int sum = 0;
    for(i=1;i<n;i++)
    {
        int A = a;
        int B= 0;
        for(j=0;j<i;j++)
        {
            
             A*=10;
              B+=A;
        }
        B+=a;
        sum += B;
    }
    printf("%d",sum+a);
    return 0;
}

就像这样,但是这道题的核心并不是在于如何求解,而是如何处理整形范围过大的问题。

这段代码,所相加的数一旦超过了整形范围,那么就不能再实现了。

所以我们可以用数组来对代码进行优化。

我们可以给定一个数组来进行存放每一位的数字。

#include<stdio.h>
int main()
{
	int num,n,i,j,flag=0;
	scanf("%d %d",&num,&n);
	if(n==0)
	{
		printf("0");
		return 0;
	}
	int a[n+1];
	for(i=1;i<=n;i++)
	{
		a[i]=(int)(num*(n-i+1)+flag)%10;
		flag=(int)(num*(n-i+1)+flag)/10;
	}
	if(flag)
	printf("%d",flag);
	for(i=n;i>=1;i--)
	printf("%d",a[i]);
}

代码如上,原理就是不断地相加进一。

比如 1 3 

是 1 + 11 +111

那么我们可以先求出最终结果的个位。

因为是三个数字相加嘛,每个个位的又是 1 所以就是三个一相加就是三,然而不够十则不需要进一。

那么 十位同样如此,但是他的个数要比 个位少一个,所以就是两个一相加,因为我们还要考虑到前边的个位有没有进一,但是前边的个位没有进一所以直接用两个一相加就可以了。

最后一个百位也是一样。

那么我们就可以知道如果给的例子是 n m

那么我们的个位 就是 m*n因为要考虑进一,所以直接 %10就可以得到个位数字,那么进了多少位就可以 /10来解决进位了。

同样十位就是 m*n-1 因为我们前边有进上来的数字,所以要先加上进上来的数字,然后再进行%10得到十位,最后再/10解决进位。

就这样循环往复,我们就可以得到每一位的数字了。

而且因为数组的存在,我们同时也解决了超时一系列的问题可以说是一次很好的优化了。

这样这个题就可以完美的解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值