用C语言编程求S=2+22+222+……+2222…2

 我来答
自我编程
2018-03-06 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

计算思路很多比如:2+(2*10+2)+(2*10^2+2)。。(2*10^n+2)

但考虑数字长度不定,n可能会很大,那么就不能用一般整型类型存储(因为大小有限,超出就溢出了),所以采用字符串保存及按位计算。当然不能超出内存限制。

#include <stdio.h>
#include<malloc.h>
#include<string.h>
char *getNum(int len);//获取任意位数的 22222...的数字字符串
char *Addnum(char *sum,char *num);//两数字字符串按十进制数字相加后存储在sum中返回
int main(void)
{
    int len,i;
    char *num=NULL,*sum=NULL;
    printf("请输入要累加的数字最高位数为:");
    scanf("%d",&len);
    sum=(char *)malloc(sizeof(char)*(len+1));//总和存储 最大位数+2
    memset(sum,'0',len+1);
    sum[len]=0;

    for(i=1;i<=len;i++)
    {
        num=getNum(i);
        sum=Addnum(sum,num);
        if(i==len)
            printf("%s",num);
        else
            printf("%s+",num);
    }
    printf("=%s",sum);
    return 0;
}
char *getNum(int len)//获取任意位数的 22222...的数字字符串
{
    int i;
    char *num=(char *)malloc(sizeof(char)*(len+1));
    for(i=0;i<len;i++)
        num[i]='2';
    num[i]=0;
    return num;
}
char *Addnum(char *sum,char *num)//两数字字符串按十进制数字相加后存储在sum中返回
{
    int add,jw=0,y=0;
    char *p1=sum,*p2=num;//定义2个指针,分别指向sum和num的最后一个字符地址
    while(*p1++!=0);
    p1--;p1--;
    while(*p2++!=0);
    p2--;p2--;

    while(1)
    {

        add=*p1-'0'+*p2-'0'+jw;
        jw=add/10;
        y=add%10;
        *p1=y+'0';
        if(p2==num)
        {
            if(jw>0)
                *(--p1)=jw+'0';
            break;
        }
        else
        {
            p1--;
            p2--;
        }
    }
    return sum;
}
fallx
2018-03-06 · TA获得超过5486个赞
知道大有可为答主
回答量:2321
采纳率:73%
帮助的人:731万
展开全部
/*
求S=2+22+222+……+2222…2,有N个数,最长数字为N个2组成
 */
#include<stdio.h>  
#define MAX 1000
int main()  
{   
  int i,j,n,t=0;
  char a[MAX]; 
  printf("输入长度n:\n"); //n个数:2,22,..., 2...2(n个)
  scanf("%d",&n);   
  for(i=0;i<n;i++)
  {   
    
    for(j=0;j<n-i;j++)//随着数位增加,2的个数相应减少
      t+=2;      //按个位,十位,……N位顺序把各个加数里相应数位上的2相加
     a[i]=(t%10)+'0';  //考虑到可能会超出数字精度,采用字符形式保存,
     //如有进位,把进位数放到下一位加数上。
      t=t/10;    
  }
  for(i=n-1;i>=0;i--)
  { 
    printf("%c",a[i]); //注意保存的顺序是反序,输出要从字符数组后面到前面
   }   
  return 0;  
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
2018-03-06 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450135
专业C/C++软件开发

向TA提问 私信TA
展开全部
#include <stdio.h>
int main()
{
    double s=0, a=0;//如果输入的n在12以下,可以改成int。
    int i,n;
    scanf("%d",&n);
    for(i = 1; i <= n; i ++)
    {
        a=a*10+2;
        s+=2;
    }
    printf("%.0lf\n", s);//如果用int s, 这里用%d
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
户哲茂5B
2018-03-06 · TA获得超过817个赞
知道小有建树答主
回答量:781
采纳率:59%
帮助的人:135万
展开全部

代码如下

#include<stdio.h>

unsigned long int fun2(unsigned int n)//n=5   结果 22222
{
int i;
unsigned long int tmp=0;
for(i=0;i<n;i++)
{
tmp = tmp*10;
tmp = tmp+2;
}
return tmp;
}


unsigned long int funHE(unsigned int n)//
{
int i;
unsigned long int tmp=0;
for(i=1;i<=n;i++)
{
tmp = tmp+fun2(i);
}
return tmp;
}


void main( )

printf("%d\r\n",funHE(5));
}

如图

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-04-12
展开全部

说哈思想,就是前者*10+2,然后求和,有个小错误,但不是什么大问题,只是i=1,要从1开始,写数组多了的缘故,将就看!!!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(14)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式