sincerit 大数加减乘除

简单大数加法

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char p[100] = {"999"}, q[100] = {"1"};
// 大数加法--可以实现连加 p+q
// 大数p, q相加 再把结果放在p
void add(char* p, char* q) {  
  int i, j, t = 0, k = 0;
  for (i = 0, j = 0; p[i] != '\0' && q[j] != '\0'; i++,j++) {
    t = (p[i] - '0') + (q[j] - '0') + t;
    p[k++] = t % 10 + '0';
    t /= 10;
  }
  // 假如这个数更长,更短的话不用考虑 
  while (q[j] != '\0') {
    t = (q[j] - '0') + t;
    p[k++] = t % 10 + '0';
    t /= 10;
    j++;
  }
  // p[k]要是原来有数还要再加上本身这个数,再考虑进位 
  while (t) {
    if (p[k] >= '0' && p[k] <= '9') t = (p[k]-'0') + t;
    p[k++] = t % 10 + '0';
    t /= 10;
  }
}
int main() {
  int len = strlen(p), lek = strlen(q);
  for (int i = 0; i < len/2; i++) swap(p[i], p[len-1-i]);
  for (int i = 0; i < lek/2; i++) swap(q[i], q[lek-i-1]);
  add(p, q);
  for (int i = strlen(p)-1; i >= 0; i--) printf("%c", p[i]);
  return 0;
}

简单大数减法, 默认大数p大于等于q,答案放在p里可以实现连减

#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
char p[100] = {"1000"}, q[100] = {"1000"};
// 大数减法--可以实现连减  p-q
void sub(char* p, char* q) {
   int i, j;
   int ans[1000] = {0},k = 0; // 借助整数会更好写,字符不好处理借位的 
   for (i = 0; p[i] != '\0'; i++) ans[i] = (p[i]-'0');
   for (i = 0,j = 0; p[i] != '\0' && q[j] != '\0'; i++,j++) {
     ans[k] = ans[k] - (q[j]-'0'); 
     if (ans[k] < 0) {
       ans[k] += 10;
       ans[k+1]--;
     }
     k++;
   }
   while (ans[k] == -1) {
     if (ans[k] < 0) {
       ans[k] += 10;
       ans[k+1]--;
     }
     k++;
     i++;
     if (ans[k] >= 0) break;
   }
   while (p[i]!='\0') {i++; k++;} // 使k等于原来的长度
   // 开始去后导0
   while (ans[k-1] == 0 && k-1 >= 0) k--;  
   for (i = 0; i < k; i++) p[i] = ans[i]+'0';
   p[i] = '\0';
} 
int main() {
  int len = strlen(p), lek = strlen(q);
  for (int i = 0; i < len/2; i++) swap(p[i], p[len-1-i]);
  for (int i = 0; i < lek/2; i++) swap(q[i], q[lek-i-1]);
  sub(p, q);
  if (strlen(p) == 0) printf("0");
  else for (int i = strlen(p)-1; i >= 0; i--) printf("%c", p[i]);
  return 0;
}

简单大数乘法

#include<stdio.h>
#include<string.h>
#define MAX 1000    // 大数的最大位数 
int Multiplication(char num1[],char num2[], int sum[]) {
  int i, j, len, len1, len2;
  int a[MAX+10] = {0};
  int b[MAX+10] = {0};
  int c[MAX*2+10] = {0};

  len1 = strlen(num1);
  len2 = strlen(num2);
  for(j = 0, i = len1-1; i >= 0; i--) //把数字字符转换为整型数 并且倒过来低位在前 
    a[j++] = num1[i]-'0';
  for(j = 0, i = len2-1; i >= 0; i--)
    b[j++] = num2[i]-'0';

  for(i = 0; i < len2; i++) { //用第二个数乘以第一个数,每次一位
    for(j = 0; j < len1; j++) {
      c[i+j+1] += b[i] * a[j]; //先乘起来,后面统一进位
    }
  }

  for(i = 1; i < MAX*2; i++) { //循环统一处理进位问题
    if(c[i] >= 10) {
      c[i+1] += c[i] / 10;
      c[i] %= 10;
    }
  }

  len =  MAX*2;
  while (c[len] == 0 && len >= 1) len--; //跳过高位的0
  for(; i >= 1; i--) sum[i] = c[i];
  return len;
}

int main() {
  int i, len;
  int sum[MAX*2+10] = {0}; // 存放计算的结果,低位在前,高位在后,即sum[0]是低位
  char num1[] = "12"; // 第一个大数
  char num2[] = "12"; // 第二个大数
  len = Multiplication(num1, num2, sum);
  // 输出结果
  printf("%s * %s = \n", num1, num2);
  for (i = len; i >= 1; i--)  printf("%d", sum[i]);
  printf("\n");
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值