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

供稿:hz-xin.com     日期:2025-01-13
用C语言怎么写类似s=2+22+222+2222+22222?希望能给个详尽的解题过程,主要是算法问题,谢谢了。

首先,n个2的计算方法是2*(10的n次方)+ (n-1)个2
也就是说,比如已经求出了2222后,变到22222只要加上2乘以10的5次方
而该试首相已知,就是2,那么第二项就是2+2*(10的1次方),第三项就是2+(第二项的结果)*(10的2次方),第四项就是2+(第三项的结果)*(10的3次方),而这10的n次方也可以不用一遍遍算的那么麻烦,我们也可以用一个变量(比如命名为ten)来存储,第一项的时候乘以的是10的0次方,就是ten=1,第二项的时候乘以的是10,就是ten=ten*10,第三项是10的平方,依然可以ten=ten*10...依次类推
最后只要再把这n个数加起来即可
综上所述,我们可以写出一个函数来计算n个aaa...aa的函数
//n表示项数,a表示数字(例如你给的题中a=2)
long fun(int a,int n)
{
long ten=1,t=0,s=0;
int i,j;
for(i=0;i<n;++i)
{
for(ten=1,t=j=0;j<=i;++j)
{
t+=a*ten;
ten*=10;
}
s+=t;
}
return s;
}
已经用VC++6.0试过了,是对的
这个方法应该是最省时间和空间的,当然你也可以用函数来求10的n次方,不过那样时间和空间复杂度都开销很大
你再理解一下吧,不懂可以再问,希望对你有帮助

#include

int add = 0;
int num = 0;

void func(int n)
{
if(n > 0)
{
num = num*10+2;
add += num;
n--;
func(n);
}
}

void main()
{
int n;
printf("enter n:");
scanf("%d",&n);
func(n);
printf("%d",add);
}

这是int型的数据,n的值不能太大,
否则超出界限,可以通过long型改善,但也是有限的。
如果要想实现无限位运算算法就比较麻烦了
这就和阶乘算法一样,范围要控制好

计算思路很多比如: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;
}


/*
求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个数: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;  
}


#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
", s);//如果用int s, 这里用%d
    return 0;
}


代码如下

#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
",funHE(5));
}

如图



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



用C语言编程求S=2+22+222+……+2222…2
计算思路很多比如:2+(2*10+2)+(2*10^2+2)。。(2*10^n+2)但考虑数字长度不定,n可能会很大,那么就不能用一般整型类型存储(因为大小有限,超出就溢出了),所以采用字符串保存及按位计算。当然不能超出内存限制。include <stdio.h>#include<malloc.h>#include<string.h>char *getNum(...

C语言编程: s=2+22+222+2222+22222+222222
222=22*10+2 ……所以可以通过一个for循环求出每个加数,并累加。参考代码:include <stdio.h>int main(){ int i,n=2,sum=0;for(i=1;i<=6;i++){sum += n;n = n*10+2; }printf("%d\\n",sum);return 0; }\/*246912*\/ ...

用C语言怎么写类似s=2+22+222+2222+22222?希望能给个详尽的解题过程,主 ...
首先,n个2的计算方法是2*(10的n次方)+ (n-1)个2 也就是说,比如已经求出了2222后,变到22222只要加上2乘以10的5次方 而该试首相已知,就是2,那么第二项就是2+2*(10的1次方),第三项就是2+(第二项的结果)*(10的2次方),第四项就是2+(第三项的结果)*(10的3次方),...

c语言题目。编写程序,输入数字字符c和整数n,求下式的值。Sn=c+cc+ccc...
\/*功能:输出2+22+222……的值 作者:*\/ include<stdio.h> include<math.h> \/\/函数声明 int ngem(int n,int m); \/\/功能:此函数功能输出n个m 比如n为3,m为5,那返回值就是555;void main(){ int sum=0;int i;for(i=1;i<=20;i++){ sum=sum+ngem(i,2); \/\/2+22+222+...

c语言的一个循环问题
程序说的很明白,这里的“ i ”确实是项数,表示的是2+22+222+……这个多项式的项的个数,比如:这个多项式为2+22+222+2222,则项数 i =4;变量term的值表示的是当前一项的值,当i=1时,即此多项式只有一项也就是2,由于term的初值是0,所以此时term=0*10+2=2;sum+=term 即表示 sum=sum...

C语言 求内似2+22+222+2222+22222的 哪里有问题 算出来老是等于0_百 ...
include<stdio.h> \/\/#include<stdlib.h> \/\/#include<math.h> void main(){ int n;int a;int s=0;int i=0;int c;printf("请输入n,a:");scanf("%d,%d",&n,&a);while (n>i){ c=pow(10,i);s+=a*(n-i)*c;i++;} printf("%d\\n",s);system("pause");} ...

C语言编程,求2+22+222+2222+。。。+2...2(10个2)的和??
int main (void){ unsigned int a,b,sum;for(a=2,b=1,sum=0;b<=10;b++){ sum+=a;a=a*10+2;} printf("2+22+222+2222+...+2222222222=%u\\n",sum);return 0;} 算出来是 2469135800 你可以自己调试一下。 或者计算机按一下。。对的哦 简单易懂,代码少,效率高。采纳吧~~~...

C语言求2+22+222+2222++22...22数组存储精确计算
代码已经写好,在附件里,有问题继续追问。程序运行的结果如下图:

计算2+22+222+2222+22222+222222+2222222的结果..用C语言for循环怎么写...
include "math.h" \/\/后边的求幂函数要用到这个头文件 include "stdio.h"void main(){ int a;int b = 2;int sum = 0;for(int i = 0;i<6;i++) \/\/7个数 要6次求和,如果想继续按规律求 只需改下i<6中的6 { a = 2;for(int j = 1;j<i+2;j++) \/\/算出没个数的...

...其中a是一个数字,n表示a的位数,例:2+22+222+2222
void main(){ int a,n,i;long sum=0;printf("Please input a(0<a<=9) and n:");scanf("%d%d",&a,&n);if(a>9||a<=0){ printf("a is not in (1,2,3,4,5,6,7,8,9)!\\nplease input a again:");scanf("%d",&a);} for(i=1;i<=n;i++){ sum+=(pow(10...