大树阶乘
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
char *strrev(char *s)
{
int i,len;
char c;
len=strlen(s);
if(len%2==0)
{
for(i=0;i<=len/2-1;i++)
{
c=s[i];s[i]=s[len-1-i];
s[len-1-i]=c;
}
}
else
{
for(i=0;i<len/2;i++)
{
c=s[i];s[i]=s[len-1-i];
s[len-1-i]=c;
}
}
return s;
}
int main()
{
int n,i,j,cnt,len;
char s[100000],ans[010000];
while(scanf("%d",&n)!=EOF)
{
strcpy(s,"1");
for(i=2;i<=n;i++)
{
len=strlen(s);
strrev(s);
cnt=0;
for(j=0;j<len;j++)
{
int id=(s[j]-'0')*i+cnt;
s[j]=(id)%10+'0';
cnt=(id)/10;
}
while(cnt)
{
s[j++]=cnt%10+'0';
cnt=cnt/10;
}
s[j]='\0';
strrev(s);
}
cout<<s<<endl;;
}
return 0;
}
大数阶乘2:
#include<iostream>
#define MAX 100000
using namespace std;
int main()
{
int n,a[MAX];
int i,j,k,count,temp;
while(cin>>n)
{
a[0]=1;
count=1;
for(i=1;i<=n;i++)
{
k=0;
for(j=0;j<count;j++)
{
temp=a[j]*i+k;
a[j]=temp%10;
k=temp/10;
}
while(k)//记录进位
{
a[count++]=k%10;
k/=10;
}
}
for(j=MAX-1;j>=0;j--)
if(a[j])
break;//忽略前导0
for(i=count-1;i>=0;i--)
cout<<a[i];
cout<<endl;
}
return 0;
}
大数加法1:
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char* strrev(char *s)
{
int i,len;
char c;
len=strlen(s);
if(len/2==0)
{
for(i=0;i<len/2-1;i++)
{
c=s[i];
s[i]=s[len-1-i];
s[len-1-i]=c;
}
}
else
{
for(i=0;i<len/2;i++)
{
c=s[i];
s[i]=s[len-1-i];
s[len-1-i]=c;
}
}
return s;
}
int main()
{
int t,i,j,len1,len2,k,r;
char s1[1000],s2[1000],s[1000];
cin>>t;
for(k=1;k<=t;k++)
{
cin>>s1>>s2;
len1=strlen(s1);
len2=strlen(s2);
strrev(s1);
strrev(s2);
i=0;j=0;r=0;
int cnt=0,tem;
while(i<len1||j<len2)
{
if(i<len1&&j<len2)
tem=s1[i]-'0'+s2[j]-'0'+cnt;
if(i<len1&&j>=len2)
tem=s1[i]-'0'+cnt;
if(i>=len1&&j<len2)
tem=s2[j]-'0'+cnt;
s[r++]=tem%10+'0';
cnt=tem/10;
i++;j++;
}
if(cnt)
s[r++]=cnt+'0';
s[r]='\0';
strrev(s1);strrev(s2);strrev(s);
cout<<"Case "<<k<<":"<<endl;
cout<<s1<<' '<<"+"<<' '<<s2<<' '<<"="<<' '<<s<<endl;
if(k!=t)
cout<<endl;
}
return 0;
}
大数加法2:
#include <stdio.h>
#include <string.h>
int main()
{
char a[1000],b[1000];
int n,i,j,l1,l2,max;
scanf("%d",&n);
j=0;
while( n-- )
{
int c[1000]= {0};
int d[1000]= {0};
scanf("\n%s%s",a,b);
l1 = strlen(a);
l2 = strlen(b);
if(l1 > l2)
max = l1;
else
max = l2;
for(i = l1-1; i >= 0; i--)
c[l1-i] = a[i] - '0';
for(i = l2-1; i >= 0; i--)
d[l2-i] = b[i] - '0';
for(i = 1; i <= max; i++)
{
c[i] = c[i] + d[i];
if( c[i] > 9)
{
if( i == max)
max++;
c[i+1]++;
c[i] = c[i] - 10;
}
}
printf("Case %d:\n",++j);
printf("%s + %s = ",a,b);
for(i = max; i > 0; i--)
printf("%d",c[i]);
if( n != 0)
printf("\n\n");
else
printf("\n");
}
return 0;
}
大数除法:
高精度除低精度求商模板*/大数除法 ------除数为int范围
#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 1000
using namespace std;
void division(char * src,int n)
{
int len = strlen(src),i,k,t=0,s=0;
char dest[N];
bool flag = true; //商是否有了第一个有效位,防止商首部一直出现0
for(i=0,k=0; i<len; i++)
{
t = s*10+(src[i]-48); //新余数
if(t/n>0 || t==0) //余数为0要修改商
{
dest[k++] = t/n+48,s = t%n,flag = false;
}
else //不够除,修改余数
{
s = t;
if(!flag) //商已经有有效位了,补零
dest[k++] = '0';
}
}
for(i=0;i<k;i++)
cout<<dest[i];
cout<<endl;
}
int main()
{
char num[N];
int n;
while(scanf("%s%d",num,&n)!=EOF)
{
division(num,n);
}
return 0;
}
大数求余:大数取余-------mod X ,X为 (int范围)
具体做法:
从大数最高位开始,只要其大于mod
就实行取余,一直下去,最终得到余数
例如:123 % 4 取一个中间变量t=0
1<4 t=1
--- 2 t=1*10+2=12>4 t=t%4=0
--- 3 t=0+3=3 t=t%4=3
-------------------- 余数 3
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int MOD(string a,int mod)
{
int len=a.length(),i;
int t=0;//中间变量,最终存储余数
for(i=0;i<len;i++)
{
t*=10;
t+=a[i]-'0';
if(t>=mod)
t=t%mod;
}
return t;
}
int main()
{
string a;
int mod;
while(cin>>a>>mod)
{
cout<<MOD(a,mod)<<endl;
}
return 0;
}