大数运算

基于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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值