包含(阶乘,乘法,加减)
大数阶乘:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int factorial(int n)
{
int i, j, c, l, m, w;
long a[1000];
a[0] = 1;
m = 0;
for(i = 1; i <= n; i++){
c = 0;
for(j = 0; j <= m; j++){
a[j] = a[j] * i + c;
c = a[j] / 10000;
a[j] = a[j] % 10000;
}
if(c > 0){
m++;
a[m] = c;
}
}
w = m*4 + log10(a[m]) + 1; //位数
printf("%ld", a[m]);
for(i = m-1; i >=0; i--){
printf("%4.4ld", a[i]);
}
cout << endl;
return w;
}
int main()
{
int n;
cin >> n;
int ans = factorial(n);
cout << ans << endl;
return 0;
}
大数乘小数:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
void mult(char c[], char t[], int m)
{
int i, l, k, flag ,add;
add = 0;
char s[100];
l = strlen(c);
for(i = 0; i < l; i++){
s[l-i-1] = c[i] - '0'; //倒序存入
}
for(i = 0; i < l; i++){ //计算乘法
k = s[i] * m + add;
if(k >= 10){
s[i] = k % 10;
add = k / 10;
flag = 1;
}
else{
s[i] = k;
flag = add = 0;
}
}
if(flag){ //考虑末位
l = i + 1;
s[i] = add;
}
else
l = i;
for(i = 0; i < l; i++){
t[l-1-i] = s[i] + '0'; //正序保存
}
t[l] = '\0';
}
int main()
{
char c[30];
char t[30];
int m;
cin >> m;
cin >> c;
mult(c, t, m);
int len = strlen(t);
for(int i = 0; i < len; i++){
printf("%d", t[i] - '0');
}
return 0;
}
大数乘大数:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
void mult(char a[], char b[], char s[])
{
int i, j, k, alen, blen, sum, flag;
k = sum = flag = 0;
int res[65][65] = {0};
char result[65];
alen = strlen(a);
blen = strlen(b);
for(i = 0; i < alen; i++){
for(j = 0; j < blen; j++){
res[i][j] = (a[i] - '0') * (b[j] - '0');
}
}
for(i = alen-1; i >= 0; i--){
for(j = blen-1; j >= 0; j--){
sum += res[i+blen-j-1][j];
}
result[k] = sum % 10;
k++;
sum /= 10;
}
for(i = blen - 2; i >= 0; i--){
for(j = 0; j <= i; j++){
sum += res[i-j][j];
}
result[k] = sum % 10;
k++;
sum /= 10;
}
if(sum != 0){
result[k] = sum;
k++;
}
for(i = 0; i < k; i++){
result[i] += '0';
}
for(i = k-1; i >= 0; i--){
s[i] = result[k-1-i];
}
s[k] = '\0';
while(1){
if(strlen(s) != strlen(a) && s[0] == '0'){
strcpy(s, s+1);
}
else
break;
}
}
int main()
{
char a[30];
char b[30];
char s[100];
cin >> a;
cin >> b;
mult(a, b, s);
cout << s << endl;
return 0;
}
大数加法:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
void add(char a[], char b[], char s[])
{
int i, j ,k , up, x, y, z, l;
char *c;
if(strlen(a) > strlen(b)){
l = strlen(a) + 2;
}
else
l = strlen(b) + 2;
c = (char*)malloc(l*sizeof(char));
i = strlen(a) - 1;
j = strlen(b) - 1;
k = up = 0;
while(i >= 0 || j >= 0){
if(i < 0)
x = '0';
else
x = a[i];
if(j < 0)
y = '0';
else
y = b[j];
z = x - '0' + y - '0';
if(up)
z += 1;
if(z > 9){
up = 1;
z %= 10;
}
else
up = 0;
c[k++] = z + '0';
i--;
j--;
}
if(up)
c[k++] = '1';
i = 0;
c[k] = '\0';
for(k -= 1; k >= 0; k--){
s[i++] = c[k];
}
s[i] = '\0';
}
int main()
{
char a[30];
char b[30];
char s[35];
cin >> a;
cin >> b;
add(a, b, s);
cout << s << endl;
return 0;
}
大数减法:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
void sub(char s1[], char s2[], char t[])
{
int i, l1 ,l2 , k;
l1 = strlen(s1);
l2 = strlen(s2);
t[l1] = '\0';
l1--;
for(i = l2 - 1; i >= 0; i--,l1--){
if(s1[l1] - s2[i] >= 0)
t[l1] = s1[l1] - s2[i] + '0';
else{
t[l1] = 10 + s1[l1] - s2[i] + '0';
s1[l1-1] -= 1;
}
}
k = l1;
while(s1[k] < 0){
s1[k] += 10;
s1[k-1] -= 1;
k--;
}
while(l1 >= 0){
t[l1] = s1[l1];
l1--;
}
loop:
if(t[0] == '0'){
l1 = strlen(s1);
for(i = 0; i < l1-1; i++)
t[i] = t[i+1];
t[l1-1] = '\0';
goto loop;
}
if(strlen(t) == 0){
t[0] = '0';
t[1] = '\0';
}
}
int main()
{
//此处默认s1 > s2;
char s1[30];
char s2[30];
char t[30];
cin >> s1;
cin >> s2;
sub(s1, s2, t);
cout << t << endl;
return 0;
}