给定一个大数n,计算从1加到n
测试多组数据
用字符串处理
第一种,从1加到n,本来想到这种方法做,但发现速度超慢,下面是代码
#include<stdio.h>
#include<memory.h>
#include<string.h>
int main()
{
char a[100],b[100];
int c[100],sum[100];
int i,j,t,k;
while(scanf("%s",a)!=NULL)
{
t=strlen(a);
memset(sum,0,400);
memset(c,0,400);
memset(b,'0',t);
c[0]=1;
while(strcmp(a,b)>=0)
{
j=0;
for(i=t-1;i>=0;i--)
b[j++]=c[i]+48;
for(i=0;i<t;i++)
{
sum[i]+=c[i];
if(sum[i]>=10)
{
sum[i]-=10;
sum[i+1]++;
}
}
c[0]++;
for(i=0;i<t;i++)
{
if(c[i]>=10)
{
c[i]-=10;
c[i+1]++;
}
}
}
k=0;
for(i=99;i>=0;i--)
{
if(k)
printf("%d",sum[i]);
else
if(sum[i])
{
printf("%d",sum[i]);
k=1;
}
}
printf("\n");
}
return 0;
}
这是利用公式f(n)=n*(n+1)/2,先求出n*(n+1),再求出n*(n+1)/2
#include<stdio.h>
#include<string.h>
#define LEN 10000
unsigned an1[LEN+10];
unsigned an2[LEN+10];
unsigned result[LEN*2+10];
char szLine1[LEN+10];
char szLine2[LEN+10];
int main()
{
int i,j,k,t,len1,len2;
while(gets(szLine1))
{
memset(result,0,sizeof(result));
memset(an1,0,sizeof(an1));
memset(an2,0,sizeof(an2));
an2[0]=1; //an2[0]置为1
len2=len1=strlen(szLine1);
j=0;k=0;
for(i=len1-1;i>=0;i--)
{
an1[j++]=szLine1[i]-48; //用an1[]保存n,用an2[]保存n+1
an2[k++]+=szLine1[i]-48;
if(an2[k]==10)
{
if(k==len1-1)
len2=len1+1;
an2[k]-=10;
an2[k+1]+=1;
}
}
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
result[i+j]+=an2[j]*an1[i]; //求n*(n+1)
for(k=0;k<LEN*2;k++)
{
if(result[k]>=10)
{
result[k+1]+=result[k]/10; //result[]逐项求 利用result[k+1]+=result[k]/10;result[k]%=10;
result[k]%=10;
}
}
t=0;
for(k=LEN*2;k>=0;k--) //求n*(n+1)/2,对result[],循环利用
{ //result[k-1]=result[k]%2*10+result[k-1];result[k]/=2;可求得n*(n+1)/2
if(t){result[k-1]=result[k]%2*10+result[k-1];result[k]/=2;}
else if(result[k])
{t=1;result[k-1]=result[k]%2*10+result[k-1];result[k]/=2;}
}
t=0;
for(k=LEN*2;k>=0;k--)
{
if(t)printf("%d",result[k]); //输出,从最后一位开始
else if(result[k])
{
t=1;printf("%d",result[k]);
}
}
printf("\n");
}
return 0;
}