sincerit 大数加减乘除

本文深入讲解了大数加法、减法及乘法的实现原理与算法细节,通过C++代码示例展示了如何处理超出标准整数类型的大数运算,包括大数的字符串表示、进位处理、借位处理等关键步骤。

简单大数加法

#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;
}
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值