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

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

}

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

int main() 
{ 
 int A; 
 int N;
 int i; 
 int j; 
 int t; 
 int flag; 
 int num[1000000]; 
 scanf("%d%d",&A,&N); 
 if(N == 0) 
 printf("0\n"); 
 else 
 { 
      flag = 0; 
      for(i=N, j=0; i>=1; i--, j++) 
       { 

            t = A*i + flag; //flag为进位标志

            
            num[j] = t % 10; //每一次只保存一位数字

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

你可能感兴趣的:(PAT测试题)