给定一个大数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; }