#include<bits/stdc++.h>
using namespace std;
const double e=2.7182818284590452354,
pi=3.141592653589793239;
int main()
{
int n;
int ans;
while(cin>>n)
{
if(n==0)
{
cout<<"1"<<endl;
continue;
}
ans=(int)(0.5*log10(2*pi*n)+n*log10(n/e))+1;
cout<<ans<<endl;
}
return 0;
}
nefu-881和nefu-71
无符号整型存加数
#include<bits/stdc++.h>
using namespace std;
int main()
{
unsigned long long a,b,sum,c;
while(cin>>a>>b)
{
if(a==0&&b==0)
return 0;
sum=0;
c=0;
for(int i=0;i<=9;i++)
{
if((a%10+b%10+c)>=10)
{
sum++;
c=1;
}
else
c=0;
a=a/10;
b=b/10;
}
cout<<sum<<endl;
}
return 0;
}
用字符串存加数
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[31],b[31];
int sum,a1,b1,c;
while(scanf("%s%s",a,b)>0)
{
sum=0;
if(strcmp(a,"0")==0&&strcmp(b,"0")==0)
return 0;
a1=strlen(a)-1;
b1=strlen(b)-1;
c=0;
while(a1>=0&&b1>=0)
{
if(a[a1]-'0'+b[b1]-'0'+c>=10)
{
sum++;
c=1;
}
else c=0;
a1--;
b1--;
}
while(a1>=0)
{
if(a[a1]-'0'+c>=10)
{
sum++;
c=1;
}
else c=0;
a1--;
}
while(b1>=0)
{
if(b[b1]-'0'+c>=10)
{
sum++;
c=1;
}
else c=0;
b1--;
}
cout<<sum<<endl;
}
return 0;
}
n!
f[ ]一个元素一位
#include<bits/stdc++.h>
using namespace std;
const int maxn=50000;
int main()
{
int n,i,j,s,f[maxn+1],c,k;
while(cin>>n)
{
memset(f,0,sizeof(f));
f[0]=1;
for(i=1;i<=n;i++)
{
c=0;
for(j=0;j<=maxn;j++)
{
s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
}
for( k=maxn;k>=0;k--)
if(f[k]!=0)
break;
for(int m=k;m>=0;m--)
cout<<f[m];
cout<<endl;
}
return 0;
}
f[ ]每一个元素都有五位
#include<bits/stdc++.h>
using namespace std;
const int maxn=50000;
int main()
{
int n,i,j,s,f[maxn+1],c,k;
while(cin>>n)
{
memset(f,0,sizeof(f));
f[0]=1;
for(i=1;i<=n;i++)
{
c=0;
for(j=0;j<=maxn;j++)
{
s=f[j]*i+c;
f[j]=s%100000;
c=s/100000;
}
}
for( k=maxn;k>=0;k--)
if(f[k]!=0)
break;
cout<<f[k];
for(int m=k-1;m>=0;m--)
printf("%05d",f[m]);
cout<<endl;
}
return 0;
}
精确位数
#include<bits/stdc++.h>
using namespace std;
const int maxn=50000;
int main()
{
int n,i,j,s,f[maxn+1],c,k;
double ws;
while(cin>>n)
{
memset(f,0,sizeof(f));
f[0]=1;
ws=0;
for(i=1;i<=n;i++)
{
c=0;
ws+=log10(i);
int kk=((int)ws+1)/5;
for(j=0;j<=kk;j++)
{
s=f[j]*i+c;
f[j]=s%100000;
c=s/100000;
}
}
for( k=ws;k>=0;k--)
if(f[k]!=0)
break;
cout<<f[k];
for(int m=k-1;m>=0;m--)
printf("%05d",f[m]);
cout<<endl;
}
return 0;
}
nefu-73
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[40];//字符串储存大数
while(gets(str)>0)
{
int len=strlen(str);
int ans=0;
if(len==1&&str[0]=='0')
return 0;
for(int i=len-1;i>=0;i--)
{
ans+=(str[i]-'0')*(pow(2,(len-i))-1);
}
cout<<ans<<endl;
}
return 0;
}
nefu-880大数加法
#include<bits/stdc++.h>
using namespace std;
int main()
{
char x[200];
int y[200][200],ans[200],i,j,k,len,max,num;
int sum,carry,digit,N;
scanf("%d",&N);
for(k=1;k<=N;k++)
{
max=-1;
memset(y,0,sizeof(y));
memset(ans,0,sizeof(ans));
for(num=0;num<200;num++)
{
gets(x);
if(strcmp(x,"0")==0)
break;
len=strlen(x);
if(len>max)
max=len;
for(i=0;i<len;i++)
y[num][i]=x[len-i-1]-'0';//倒序存入二维数组
}
carry=0;
for(i=0;i<max+2;i++)
{
sum=carry;
for(j=0;j<num;j++)
sum+=y[j][i];
digit=sum%10;
carry=sum/10;
ans[i]=digit;
}
for(i=max+2;i>=0;i--)//去除不必要的0
{
if(ans[i]!=0)
break;
}
while(i>=0)//倒序输出
cout<<ans[i--];
if(k<N)
cout<<endl;
}
return 0;
}
大数乘法
#include<bits/stdc++.h>
using namespace std;
char a[101],b[101];
int lena,lenb;
int ai[101],bi[101],t[202];
char ans[202];
void dao(char s[],int si[])
{
int len=strlen(s);
for(int i=0;i<len;i++)
si[len-1-i]=s[i]-'0';
}
int main()
{
while(scanf("%s",a)>0)
{
int i;
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
dao(a,ai);dao(b,bi);
memset(t,0,sizeof(t));
memset(ans,0,sizeof(ans));
for(i=0;i<lenb;i++)
{
int start=i;
for(int j=0;j<lena;j++)//计算中间数
{
t[start++]+=ai[j]*bi[i];
}
}
for(i=0;i<202;i++)//处理进位
{
if(t[i]>=10)
{
t[i+1]+=t[i]/10;
t[i]=t[i]%10;
}
}
for( i=201;i>=0;i--)//处理没必要的0
{
if(t[i])
break;
}
int num=i+1;
for(i=0;i<num;i++)
{
ans[num-1-i]=t[i]+'0';
}
ans[num]='\0';
printf("%s\n",ans);
}
return 0;
}