1-1 数列求和-加强版 (20 分)​

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

输入格式:

输入数字A与非负整数N。

输出格式:

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

输入样例:

1 3

结尾无空行

输出样例:

123

结尾无空行

 

小白做的第一道数据结构的题,c语言才学到创建函数,自己摸索了快3个小时,代码测试才通过,有瑕疵的地方还请各位大佬指正。


第一次成功好激动!!!!

把数字列成竖式,就有思路了

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long int a,n,i,j,k;
    int m[100003]={0};//存储数字每一位
    scanf("%d %d",&a,&n);
    if(n==0)//当n等于0时,直接输出0
        {
        printf("0");
        }
    else if(a==9)//当n=9时,因为进位部分在打印时需要根据i来判定,n=9必要再进一位,而i的循环已经截止,所以要额外判定,再多循环一次
        {
        for(i=0,k=n;i<n;i++,k--)
            {
            m[i]+=k*a;//前一位的值需要累加
            if(m[i]>9)//大于9就要进位
                {
                m[i+1]+=m[i]/10;//进位等于前一位除以10
                m[i]=m[i]%10;//前一位只保留乘积的个位
                }
            else
                {
                m[i]=m[i]%10;//不过9就不需要进位
                }
            }
        for(i;i>=0;i--)//i需要多循环一次
        printf("%d",m[i]);
        }
    else
        {
        for(i=0,k=n;i<n;i++,k--)
            {
            m[i]+=k*a;
            if(m[i]>9)
                {
                m[i+1]+=m[i]/10;
                m[i]=m[i]%10;
                }
            else
                {
                m[i]=m[i]%10;
                }
            }
                for(i--;i>=0;i--)//最高位无需进位,所以少循环一次,避免出现最高位为0的情况(例如打印出0123)
                printf("%d",m[i]);
        }


    return 0;
}

补充一下为什么要单独列出a=9的情况:

如果a=8,则最高位=8,次高位=8*2=16,次高位进位最多只能是1,而最高位8+1=9,最高位就不需要进位了,原来的循环就足够刚好打印出了。

如果a=9,则最高位=9,次高位=9*2=18,次高位进位最多只能是1,而最高位9+1=10,最高位就需要进位了,如果按照原来的循环,那么就会少循环一次,最高位便打印不出,所以要单独判断,打印数组的循环次数就要多一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值