基于c语言写的大数运算代码
思路:用字符串实现
思路:用字符串实现
1. 大数乘法:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define M 100005
char s1[M],s2[M];
int a[M],b[M],c[M];
//大数乘法
int main(){
int i, j, m, n, k, t;
scanf("%d",&t);
int h = 0;
while(t--){
h++;
scanf("%s%s",s1,s2);
memset(c, 0,sizeof(c));
n = strlen(s1);
m = strlen(s2);
k = m + n;// 保证相乘后得位数不会大于K;
//字符串s1, s2逆序用数字排列
for(i = 0;i < n; i++)
a[i] = s1[n-i-1]-'0';
for(j = 0; j < m; j++)
b[j] = s2[m-j-1]-'0';
//乘运算
for(i = 0; i < n; i++){
for(j = 0; j < m; j++)
c[i+j]+= a[i]*b[j];
}
**for(i = 0; i < k; i++){
if(c[i] >= 10){
c[i+1]+=c[i]/10;
c[i] %= 10;
}
}**
printf("Case %d:\n",h);
printf("%s * %s = ",s1,s2);
//去除前导0
i = k;
while(c[i] ==0) i--;
if(i < 0) printf("0");
else {
for(; i >= 0; i--)
printf("%d",c[i]);
}
printf("\n\n");
}
return 0;
}
2. 大数加法(进位与大数乘法类似):
#include <stdio.h>
#include <string.h>
#define M 1005
char s1[M],s2[M];
int a[M],b[M],c[M];
int max(int a, int b){
if(a > b) return a;
else return b;
}
int main(){
int i, j, n, m, k;
scanf("%s%s",s1,s2);
memset(c,0,sizeof(c));
n = strlen(s1);
m = strlen(s2);
for(i = 0; i < n; i++)
a[i] = s1[n-i-1]-'0';
for(j = 0; j < m; j++)
b[j] = s2[m-j-1]-'0';
for(i = 0; i < max(n, m); i++)
c[i] = a[i] + b[i];
**for(i = 0; i <= max(n, m); i++){
if(c[i] >= 10){
c[i+1] += c[i]/10;
c[i] = c[i] % 10;
}
}**
i = max(n, m);
while(c[i] == 0) i--;
if(i < 0) printf("0");
for(; i >= 0; i--)
printf("%d",c[i]);
printf("\n");
return 0;
}
3. 大数阶乘
#include <stdio.h>
#include <string.h>
#define M 10001
int a[M];
void print_factorial(int n){
int i, j, temp, digit; //temp 为每次得到的次数,digit 为每次得到的位数
a[0] = 1;
digit = 1;
**for(i = 2;i <= n; i++){
int num = 0;
for(j = 0; j < digit; j++){
temp = a[j]*i + num;
a[j] = temp % 10;
num = temp/10;
}
while(num){
a[digit] = num%10;
num /= 10;
digit++;
}**
}
for(i = digit - 1;i >= 0; i--){
printf("%d",a[i]);
}
printf("\n");
}
int main(void){
int n;
scanf("%d",&n);
print_factorial(n);
return 0;
}
4. 大数高阶幂
#include <stdio.h>
#include <string.h>
#define M 10005
//计算n 的 m次幂
int a[M];
void print_mi(int n, int m){
a[0] = 1;
int i, j, temp, digit = 1, num = 0;
**for(i = 1;i <= m; i++){
num = 0;
for(j = 0; j < digit; j++){
temp = a[j]*n+num;
a[j] = temp%10;
num = temp/10;
}
while(num){
a[digit] = num%10;
num /= 10;
digit++;
}**
}
for(i = digit - 1;i >= 0; i--){
printf("%d",a[i]);
}
printf("\n");
}
int main(void){
int n, m;
scanf("%d%d",&n,&m);
print_mi(n, m);
return 0;
}