首先回顾本题
求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字,为2。 例如,n=5时=2+22+222+2222+22222,n由键盘输入。
首先我们第一反应必然是循环,那么如何通过循环求解就是一个比较重要的问题了。
第一步,列好C语言的基本格式:

  1. #include<stdio.h>
  2. int main(){
  3. return 0;
  4. }

第二步,确认变量,首先需要一个输入值,我们将其设置为n,需要一个输出值,我们设置为sum,再加上最后控制循环的变量i。三个变量就找到了,于是我们可以写出

  1. #include<stdio.h>
  2. int main(){
  3. int n, i, sum = 0;
  4. scanf("%d", &n);
  5. for(i = 0; i < n; i++){
  6. }
  7. return 0;
  8. }

相比有的同学很好奇为什么只用一个循环,而不是通过循环先求出单个的2, 22,222,2222,22222。然后再通过循环累加。这是因为其中存在着规律~
从规律中,我们可以看到,个位的2出现过n次,而十位的出现过n-1次以此类推!
这意味着其中有规律,有规律就意味着可以简化!
于是我们思考一下,是否可以从最高为开始,比如说最高位只有一个2,然后两个,三个……
是的,我们可以用公式来归纳!
于是我们从最高为开始,依次补足!

  1. #include<stdio.h>
  2. int main(){
  3. int n, i, sum = 0;
  4. scanf("%d", &n);
  5. for(i = 0; i < n; i++){
  6. sum *= 10;
  7. sum += 2 * (i+1);
  8. }
  9. printf("%d", sum);
  10. return 0;
  11. }

这样我们完整的代码就出来了,从最高为开始一点一点的加上去,包括i这个控制变量我们都可以利用上,将其作为每个位置上有多少个2相加!
当然这只是我目前能想到的最佳解法,说不定其他人会有更优解呢?

点赞(1)
 

9.5 分

140 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 96 条评论

1年前 回复TA
#include<stdio.h>
int a(int n);

int main(void){
	int Sn,n,k;
	k=0;
	
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		Sn+=k;
		k+=a(i)*2;
		Sn+=a(i)*2;
	}
	printf("%d",Sn);
	return 0;
	
}

int a(int n){
	int a=1;
	for(int i=0;i<n;i++)
	{
		a*=10;
	}
	return a;
}
古月方源 1年前 回复TA
@木头人 满分牛魔呢?
木头人 1年前 回复TA
#include<stdio.h>
int main()
{
    int Sn,n;
    scanf("%d",&n);
	Sn=2+22+222+2222+22222;
	printf("%d",Sn);
	return 0;	
}
这也是满分。
028ldy 1年前 回复TA
@荆棘鸟的呼唤 你好,请问你定义这个a的作用是什么?
zxy03 1年前 回复TA
@zxy03 请问这个有什么问题呢
zxy03 1年前 回复TA
#include <stdio.h>
#include<math.h>
int main() {
    long a=0;
    int n=0,i=0;
    int Sn=0;

    scanf("%d",&n);
    for(a=1;a<=10000;i++)
    {
            a=a+(a%10)* pow(10,i-1);
            printf("\n%d",a);
            Sn+=a;
            printf("\nSn=%d",Sn-1);
    }

    return 0;
}
剑仙 1年前 回复TA
@收敛水 我理解的是求n个个位数的2加上前面的数
荆棘鸟的呼唤 1年前 回复TA
#include<stdio.h>
int main()
{
	int a,b,Sn,n;
	a=1;
	b=0;
	Sn=0;
	scanf("%d",&n);
	while(a<=n)
	{
		a++;
		b=b*10+2;
		Sn=Sn+b;
	}
	printf("%d",Sn);
	return 0;
}
菜鸟 1年前 回复TA
#include <stdio.h>
int main(){
	int m=2,n,i,s=2;
	scanf ("%d",&n);
	for (i=1;i<n;i++){
		m=m*10+2;
		s=s+m;
	} 
	printf ("%d",s);
	return 0; 
}
Ah 1年前 回复TA
#include<stdio.h>
#include<math.h>

int main()
{

   int n;
   scanf("%d",&n);
   int sum=0;
   while(n--)//控制次数
   {
      for(int i=n;i>=0;i--)//控制2的个数
          sum+=2*pow(10,i);
   }
   printf("%d\n",sum);
	return 0;
}