求2+22+222+...+(n个2)的精确值

解题思想:按照从低位到高位的顺序,把各个被加数的位上的数值相加并加上比该位更低位向该位的进位,取余求出该位上的余数,取整求出该位像比它高一位的进位。重复上述步骤,直至求出和的所有位。

方法一:

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
int count=0;

void sum1(int n )
{   
    int s[n]={0}, sum1[n]={0}; //数组s存储被加数,sum1存储和
    int i, d, h;

    long  long c;
    
    for (i=n-1; i>=0; i--)
      {
          d=0;  //d 为进位
        s[i]=2;  //确定被加数的第i位上的数值
     
         for (h=n-1; h>=i; h--) // 从低位到高位分别计算和的每位上的数值 
           {
              c=sum1[h]+s[h]+d;
                sum1[h]=c%10;
                d=c/10;
                      //printf("%d   %d   %d   %d\n", c, d, s[j], sum1[j]);
           } 
                           
        count++;
        
          for (int p=i; p<=n-1; p++)    //打印和      
             printf("%d", sum1[p]);    
    
        printf("\n");          
      }
       
}


int main()
{
  sum1(30);
  printf("\ncount=%d\n", count);
  //system("pause");
 //return 0;

}

方法二://相对方法一,计算量少,复杂度更低

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
int count=0;

void sum1(int n )
{   
    int s[n]={0}, sum1[n]={0};
    int i, c, d=0, b, h;
    int cc=0;
        
    for (i=n; i>=1; i--)
      {
        b=i*2+d;
        s[cc]=b%10;
        d=b/10;
        cc=cc+1;     
      }
        
    while(d>10)
        {
            s[cc]=d%10;
            d=d/10;
            cc++;
        }
    for (int p=cc-1; p>=0; p--)          
             printf("%d", s[p]);    
    
        printf("\n");       
       
       
}


int main()
{
  for (int i=1; i<=10; i++)
        sum1(i);
  printf("\ncount=%d\n", count);
  //system("pause");
 //return 0;

}

方法三:python编程  (注意:C语言不可以这么操作,当n过大,发生溢出现象。python可以这么操作的原因是,python可以处理数值很大的整数而不会出错)

import math

def func(n):
    s=0
    b=0
    for i in range(0, n):
        s=s*10+2
        b=b+s
        print(b)

        
func(20)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值