7-38 数列求和-加强版

该问题涉及计算由数字A重复构成的数列之和,当数值较大时,使用传统方法会导致溢出。解决方案是将大数存储在数组中,通过模拟进位计算过程,避免了长整数乘法和加法导致的问题。这种方法提高了效率并能正确处理所有情况。
摘要由CSDN通过智能技术生成

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AAANA)。例如A=1, N=3时,S=1+11+111=123。

输入格式:

输入数字A与非负整数N

输出格式:

输出其N项数列之和S的值。

输入样例:

1 3

输出样例:

123
错误代码:
#include<stdio.h>
long long Pow(int x,int y){
    long long answer=1;
    int i;
    for(i=1;i<=y;i++){
        answer=answer*x;
    }
    return answer;
}
long long getResult(int a,int i){
    long long Result=0;
    int j;
    for(j=0;j<i;j++){
        Result=Result+a*Pow(10,j);
    }
    return Result;
}
int main()
{
    long long sum=0;
    int i,n,a;
    long long result;
    scanf("%d %d",&a,&n);
    for(i=1;i<=n;i++){
        result=getResult(a,i);
        sum+=result;
    }
    printf("%lld\n",sum);
    return 0;
}

这题里面的数据十分的庞大,我用了long long都无法存下,同时for循环过多,导致有2个点过不去

正确代码:

#include<stdio.h>
int main()
{
    int number[100009];   //使用数组来存放这个数字
    int a,n,i;
    int count;
    int temp=0;      //temp用来表示进位
    scanf("%d%d",&a,&n);
    count=n;
    if(n==0){
        printf("0");
    }           //当只有0时单列
    else{for(i=0;i<n;i++){
            number[i]=(a*count+temp)%10;    
            temp=(a*count+temp)/10;       //进位数
            count--;       //位数减一
        }
        if(temp!=0){
            printf("%d",temp);    //若最后一个进位数不为0就打印,为0不打印
        }
        for(i=n-1;i>=0;i--){
                printf("%d",number[i]);    //逆序打印数字
        }
        printf("\n");
        }
    return 0;
}

注意的点就是将庞大的数字储存到数组之中去。

解题原理以9 3为例:

正常来说,得到的数字为9+99+999=1107。我们可以观察到,7=[3*9+temp(temp=0)]%10,所以number[0]=7,之后注意到[3*9+temp(temp=0)]/10=2,要向前进2位,所以temp=2。之后有0=[2*9+temp(temp=2)]%10所以number[1]=0,之后进2位,temp=2.以此类推。到最后数组number为[7,0,1]。此时temp=1,1!=0,所以将1打印。最后将数组逆序打印,打成107.这样我们就得到了1107.

:D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值