string bigIntegerAdd(string s1,string s2){
int a[maxn],b[maxn];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int len1 = s1.size(),len2 = s2.size();
int maxL = max(len1,len2);
for(int i = 0; i < len1; i++)a[i] = s1[len1-1-i]-'0';
for(int i = 0; i < len2; i++)b[i] = s2[len2-1-i]-'0';
for(int i = 0; i < maxL; i++){
if(a[i]+b[i] >= 10){
int temp = a[i]+b[i];
a[i] = temp%10;
a[i+1] += (temp/10);
}
else a[i] += b[i];
}
string c = "";
if(a[maxL] != 0)
c += a[maxL] + '0';
for(int i = maxL-1; i >= 0; i--)c += a[i] + '0';
return c;
}
string bigIntegerMul(string s1,string s2){
int a[maxn],b[maxn],c[maxn*2 + 5];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int len1 = s1.size(),len2 = s2.size();
for(int i = 0; i < len1; i++)a[i] = s1[len1-1-i]-'0';
for(int i = 0; i < len2; i++)b[i] = s2[len2-1-i]-'0';
for(int i = 0; i < len1; i++){
for(int j = 0; j < len2; j++){
c[i+j] += a[i]*b[j];
}
}
for(int i = 0; i < maxn*2; i++){
if(c[i] >= 10){
c[i+1] += c[i]/10;
c[i] %= 10;
}
}
string ans = "";
int i;
for(i = maxn * 2; i >= 0; i--)
if(c[i] != 0)
break;
for(;i >= 0; i--)ans += c[i] + '0';
return ans;
}
int main(){
int n;
string s[255];
s[0] = "1",s[1] = "1";
for(int i = 2;i <= 255; i++){
string temp = bigIntegerMul("2",s[i-2]);
s[i] = bigIntegerAdd(s[i-1],temp);
}
while(~scanf("%d",&n))
cout<<s[n]<<endl;
return 0;
}
#include <bits/stdc++.h>
const int maxn = 200 + 10;
using namespace std;
typedef long long LL;
string subInfo(char *s1,char *s2){
int a[maxn],b[maxn];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int len1 = strlen(s1),len2 = strlen(s2);
int maxLen = max(len1,len2);
for(int i = 0; i < len1; i++) a[i] = s1[len1 - i - 1] - '0';
for(int i = 0; i < len2; i++) b[i] = s2[len2 - i - 1] - '0';
for(int i = 0; i < maxLen; i++){
if(a[i]-b[i] < 0){
a[i] = a[i]+10-b[i];
a[i+1] -= 1;
}
else a[i] -= b[i];
}
string str = "";
int i;
for(i = maxLen-1; i >= 0; i--)if(a[i] != 0)break;
for(;i >= 0; i--)str += a[i]+'0';
return str;
}
string bigIntegerSub(char *s1,char *s2){
if(s1 == s2)
return "0";
int len1 = strlen(s1),len2 = strlen(s2);
if(len1 > len2)
return subInfo(s1,s2);
else if(len1 < len2)
return "-" + subInfo(s2,s1);
else {
for(int i = 0; i < len1; i++){
if(s1[i]-'0' > s2[i]-'0')
return subInfo(s1,s2);
else if(s1[i]-'0' < s2[i]-'0')
return "-" + subInfo(s2,s1);
}
}
}
int main(){
char s1[maxn],s2[maxn];
scanf("%s\n%s",s1,s2);
cout<<bigIntegerSub(s1,s2)<<endl;
return 0;
}
求阶乘以及位数模板
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
int factorialDigit(int n){
double sum = 0;
for(int i = 1; i <= n; i++){
sum += log10(i);
}
return (int)sum+1;
}
string bigFactorial(int n){
int ans[maxn],digit = 1;
ans[0] = 1;
for(int i = 2; i <= n; i++){
int num = 0;
for(int j = 0; j < digit; j++){
int temp = ans[j]*i + num;
ans[j] = temp%10;
num = temp/10;
}
while(num != 0){
ans[digit] = num%10;
num /= 10;
digit++;
}
}
string str = "";
for(int i = digit-1; i >= 0; i--)
str += ans[i] + '0';
return str;
}
int main(){
int n;
while(~scanf("%d",&n)){
cout<<bigFactorial(n)<<endl;
}
return 0;
}