求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/melody_1016/article/details/82953348

题目:求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字, 
例如:2+22+222+2222+22222 


分析:由于不论输入的a是什么,都是计算前5项之和。所以关键点就是求出每一项的值。所以可以在主函数中for循环i=1~5(这里的i表示位数),然后调用5次fun函数(fun函数用于求出Sn的每一项的值);fun函数的图解如下:

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fun(int n, int a)//n表示位数(即项数)第一项是一位数;第二项是二位数……
{
	int num = 0;//第n项的值
	while (n > 0)
	{
		num = num * 10 + a;
		n--;
	}
	return num;
}


int main()
{
        int a = 0;
	scanf("%d", &a);
	int Sn = 0;
	for (int i = 1; i <= 5; i++)
	{
		 Sn = Sn+fun(i, a);//计算从第一项到第五项的所有值的和
	}
        printf("%d\n", Sn);
        system("pause");
	return 0;
}

运行结果:

但是上述代码还是有些缺点:每次计算各项的值都要从头开始(比如,当a为2时,计算第一项的值while循环中num = num * 10 + a;只执行一次。但是接着计算第二项的值22时又要重新开始计算,while循环执行2次;第三项222while循环执行3次……)以此类推,明显循环次数过多。

而受之前一道题“习题4-6 水仙花数https://blog.csdn.net/melody_1016/article/details/82947204第一次思路最后一个测试点运行超时,我们又采用了数组保存值”这一解决方法的影响,这题,完全也可以这样做:用一个数组来保存前一项的值。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void fun( int a,int p[])//将每一项的值存储在数组中
{
	p[0] = a;
	int i = 0;
	for (i = 0; i < 5;i++)
	{
		p[i + 1] = p[i] * 10 + 2;//后一项的值等于前一项的值*10+2
	}
	
}

int main()
{
        int a = 0;
	scanf("%d", &a);
	int Sn = 0;
	int p[5] = { 0 };//设置一个数组,用于保存每一项的值
	fun(a, p);

	for (int i = 0; i < 5; i++)//把数组中的值相加,即可得到Sn
	{
		Sn += p[i];
	}
	printf("%d\n", Sn);
        system("pause");
	return 0;
}

测试结果:

猜你喜欢

转载自blog.csdn.net/melody_1016/article/details/82953348