PAT-基础编程题-5-38 数列求和-加强版

5-38 数列求和-加强版   (20分)

给定某数字AAA1≤A≤91\le A\le 91A9)以及非负整数NNN0≤N≤1000000\le N\le 1000000N100000),求数列之和S=A+AA+AAA+⋯+AA⋯AS = A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA++AAANNNAAA)。例如A=1A=1A=1,N=3N=3N=3时,S=1+11+111=123S = 1 + 11 + 111 = 123S=1+11+111=123

输入格式:

输入数字AAA与非负整数NNN

输出格式:

输出其NNN项数列之和SSS的值。

输入样例:

1 3

输出样例:

123

解答程序:


方法一:(原创)

#include<stdio.h>

#define  fun x*A
int main(void)
{
        int i,x,N,b,A,j;
        scanf("%d %d",&A,&N);//N代表多少个数字,A代表数字;
        int num[1000001]={0}; //不要问我为什么不用可变数组:int num[N+1],也不要问我为什么要用100万的数组;
                              //不用可变数组的原因是:在线测试的编译器跟我使用DEV C++不同,无法编译;100万的数组是因为,没有这么长会一直显示段错误;
        int flag; //只是为了方便显示  x*A,
        i=0;
        if(N==0)    {
            printf("0\n");   
            return 0;
        }
        
            for(x=N;x>=1;x--)    {
                b=i;
                flag=fun;
                while(flag!=0)    {
                    num[i]=flag%10+num[i]; //加上后面数字的进位值,num[i]开始初始化为0
                    if(num[i]>=10)    {        //    判断是否有进位
                        num[i]=num[i]%10;
                        num[i+1]+=1;
                    }
                    flag=flag/10;
                    i++;   //数组下标值加1;
                    if(flag==0)    {
                        i=b; //b的作用是为了记录flag循环时i的值,出去的时候再返回;
                    }
                }
            
                i++;
            }
            
        i=1000000;
        while(num[i]==0)    {  //如果数组过长,就要先把数组下标值移动到不为0的位置,最后输出;
            i--;
        }
            
        for(j=i;j>=0;j--)    {
            printf("%d",num[j]);
        }
        printf("\n");    
    return 0;            

}

方法二:(非原创,有改进)

<code class="hljs perl has-numbering"><span class="hljs-keyword">int</span> main() 
{ 
 <span class="hljs-keyword">int</span> A; 
 <span class="hljs-keyword">int</span> N;
 <span class="hljs-keyword">int</span> i; 
 <span class="hljs-keyword">int</span> j; 
 <span class="hljs-keyword">int</span> t; 
 <span class="hljs-keyword">int</span> flag; 
 <span class="hljs-keyword">int</span> num[<span class="hljs-number">1000000</span>]; 
 scanf(<span class="hljs-string">"<span class="hljs-variable">%d</span><span class="hljs-variable">%d</span>"</span>,&A,&N); 
 <span class="hljs-keyword">if</span>(N == <span class="hljs-number">0</span>) 
 <span class="hljs-keyword">printf</span>(<span class="hljs-string">"0\n"</span>); 
 <span class="hljs-keyword">else</span> 
 { 
      flag = <span class="hljs-number">0</span>; 
      <span class="hljs-keyword">for</span>(i=N, j=<span class="hljs-number">0</span>; i>=<span class="hljs-number">1</span>; i--, j++) 
       { 

            t = A<span class="hljs-variable">*i</span> + flag; //flag为进位标志

            </code><pre name="code" class="prettyprint"><code class="hljs perl has-numbering">            num[j] = t % <span class="hljs-number">10</span>; //每一次只保存一位数字</code>

<code class="hljs perl has-numbering">            flag = t / <span class="hljs-number">10</span>; </code>
} if(flag > 0) //在N,A都大的时候,最后一位可能会有进位,所以要注意: { num[j] = flag; j++; } for(i=j- 1; i>= 0; i--) { printf( "%d",num[i]); } } return 0; }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值