用C语言编程求S=2+22+222+……+2222…2
首先,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...