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