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

来源:互联网 发布:淘宝代销怎么设置运费 编辑:程序博客网 时间:2024/05/22 12:35

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; }


1 0