7-38 数列求和-加强版(参考灰信网文章)

给定某数字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

 我的代码:

#include <stdio.h>   
#define max 100000+1   //还有一个规律,任意一个四位数+任意一个三位数+任意一个两位数+任意一个一位数,结果要么是四位数,要么是五位数。 
					//	所以一个最大为100000位的数相加,最终结果最大为100000+1 位
				//	整型范围——最大位数为100000(十万)位。
				//而超过100000位的数无法输出,所以用数组来代表几位,[0]即是个位,[1]就是十位,以此类推 
int main()
{
	int a,n;
	scanf("%d %d",&a,&n);
	int number[max]={};   //初始化数组为0 
	if(n==0){
		printf("0");  //如果要求输入0位数,那只能是0 
		return 0; 
	}
	//举例:四位数+三位数+两位数+一位数,最多为五位数
	//     1			  9				
    //    11			 99				
    //   111		+   999
    //+ 1111        -------
    //------		   1107   --->27(3*9)+180(2*9)+900(1*9)=1107	
    //  1234		对照着竖式计算的进位可知。这里27可看做在个位		18可看做18个10,在10位   9也就是在百位 
    // 还没有进位的基础数据
    // result[3]=1*1            
    // result[2]=1*2;		9*1			[2]对应百位 
    // result[1]=1*3;		9*2			[1]对应十位 
    // result[0]=1*4;		9*3   其实这个[0]也就对应个位, 
	for(int i=0;i<n;i++){
		number[i]=a*(n-i);  //这里不用n--,是因为n下面还要参与运算,值不能变 
	} 						//根据上述分析,遍历,填数组当中对应值 
	for(int i=0;i<n;i++){
		if(number[i]>=10){
			//进位计算
			number[i+1]=number[i+1]+number[i]/10;
			//保留当前位的个位数
			number[i]=number[i]%10;
		}
	}
	int len=n+1;   //定义输出的和的长度,因为最大n位的数相加,最终和是n+1或n位,所以假定长度为n+1位 
	if(number[n]==0){   //由于最大n位数相加,也是有可能最终和为n位,而对应的下标是[n-1]有数,[n]则还是初始化的0; 
		len=n; }    //比如输出a=1,n=3;那么1+11+111=123,1在number[2]的位置,也就是说[3]=0,千位没有数
					//那么len=3,下面for循环中,j=len-1=3-1=2,也就会从下标2,把百位的数输出。
					//如果a=9,n=3;那么9+99+999=1107;1在number[3]的位置,虽然n为3,但是千位有数,则跳过if语句
					//j=len-1=4-1=3, 要把千位的数输出。 
	for(int j=len-1;j>=0;j--){
		printf("%d",number[j]);
	}

	return 0;
 } 

参考:

 基础编程题目集 —— 7-38 数列求和-加强版*** - 灰信网(软件开发博客聚合)基础编程题目集 —— 7-38 数列求和-加强版***,灰信网,软件开发博客聚合,程序员专属的优秀博客文章阅读平台。icon-default.png?t=N7T8https://www.freesion.com/article/6178614342/

 d235957c69c94964a22eb984fd216ea1.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值