今天完善成的c++大整数乘法和除法,算了一个最小公约数。
是VIJOS-p1047,希望大家支持。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define MAXLEN 200//Convert input string into intvoid StringToLargeInt(char *stra, char *strb, int *inta, int *intb, int *la, int *lb)
{//* means it can change in the function.//*name[mumber] means it's an array, and it can change in the function.*la = (int)strlen(stra);*lb = (int)strlen(strb);//how many numbersfor(int i=0;i<*la;i++){inta[i]=stra[*la-i-1]-'0';}for(int i=0;i<*lb;i++){intb[i]=strb[*lb-i-1]-'0';}//turn the char to the int, and put the small one to the frount.//like turn "25436" to {6,3,4,5,2}.
}//Compute the additon of two large int
//inta and intb are two inputs, and intc is the output
void LargeIntAdd(int *inta, int la, int *intb, int lb, int *intc,int *lc)
{int min, max, i;int *temp;memset(intc,0, *lc * sizeof(int));if(la>lb){max = la;min = lb;temp = inta;}else{max = lb;min = lb;temp = intb;}for(i=0;i<min;i++){intc[i] += inta[i] + intb[i];if(intc[i] >= 10){intc[i+1]++;intc[i]-=10;}}while(i < max) {intc[i] += temp[i];if(intc[i] >= 10){intc[i+1]++;intc[i]-=10;}i++;}if(intc[max] == 0)*lc = max ;else*lc = max + 1;}// Compare two large int
// -1 means a is less than b, 1 means a is larger than b
//0 means a is equal to b
int LargeIntCompare(int *inta, int la, int *intb, int lb)
{if(la > lb)return 1;else if (la < lb)return -1;else{for(int i = la-1;i >= 0;i--){if(inta[i] > intb[i])return 1;else if (inta[i] < intb[i])return -1;}return 0;}
}
//Compute the substraction of two integers a - b
//inta stores the results of subtraction
void LargeIntSubtract(int *inta, int *la, int *intb, int lb)
{int i;for(i=0;i<*la;i++){if(i<lb){inta[i]=inta[i]-intb[i];if(inta[i]<0){inta[i+1]--;inta[i]+=10;}}else{if(inta[i]<0){inta[i+1]--;inta[i]+=10;}}}for(i = *la -1; i > 0 && inta[i] == 0; i--);*la= i + 1;}//add some zeros to the end of intb to make its length equal to laint AllignLargeInt(int *intb, int la, int *lb)//a>b
{int x = la - *lb;if(x == 0)return 0;else{for(int i = la-1; i >= 0; i--){if(i>=x)intb[i] = intb[i-x];elseintb[i]=0;}}*lb=la;return x;
}// remove zeros appending behind int b
// nZeros is number of zeros to be removed
int InvertAllignLargeInt(int *intb, int *lb, int nZeros)//a>b
{if(nZeros == 0)   return 0;for(int i = nZeros; i <= *lb - 1; i++)intb[i - nZeros] = intb[i];*lb -= nZeros;return 1;
}//Compute the a / b = c ... d
// 123 / 60 = 2 ... 3void LargeIntDevide(int *inta, int *la, int *intb, int *lb, int *intc, int *lc, int *intd,int *ld)
{int nAddZeros = AllignLargeInt(intb, *la, lb);int i,j;memset(intc,0,*lc *sizeof(int));memset(intd,0,*ld *sizeof(int));for(i = 0; i <= nAddZeros; i++){j = 0;while(LargeIntCompare(inta, *la, intb + i, *lb - i) >= 0){LargeIntSubtract(inta, la, intb + i, *lb - i);j++;}if (j > 0)intc[nAddZeros - i] = j;}for(i = nAddZeros; i > 0 && intc[i] == 0; i--);*lc = i + 1;for(i = *la - 1; i >= 0 && inta[i] == 0; i--);for(j = 0; j <= i ; j++)intd[j] = inta[j];*ld = i + 1;}// Compute the remaining of a % b, the result is stored in intavoid LargeIntMode(int *inta, int *la, int *intb, int *lb)
{int nAddZeros = AllignLargeInt(intb, *la, lb);int i;for(i = 0; i <= nAddZeros; i++){while(LargeIntCompare(inta, *la, intb + i, *lb - i) >= 0)LargeIntSubtract(inta, la, intb + i, *lb - i);}for(i = *la - 1; i >= 0 && inta[i] == 0; i--);*la = i + 1;InvertAllignLargeInt(intb, lb, nAddZeros);
}// return 0 means a == b is the divisor
// return 1 means b is the divisorint LargeIntCommonDivisor(int *inta, int *la, int *intb, int *lb)
{int *largeInt, *smallInt;int *largeIntLen, *smallIntLen;int *tempInt, *tempIntLen;int res;res = LargeIntCompare(inta, *la, intb, *lb);if (res == 0) return 0;if (res > 0) {largeInt = inta;smallInt = intb;largeIntLen = la;smallIntLen = lb;}else{largeInt = intb;smallInt = inta;largeIntLen = lb;smallIntLen = la;}while (res != 0) {LargeIntMode(largeInt, largeIntLen, smallInt, smallIntLen);if (*largeIntLen == 0)  break;tempInt = largeInt;largeInt = smallInt;smallInt = tempInt;tempIntLen = largeIntLen;largeIntLen = smallIntLen;smallIntLen = tempIntLen;res  = LargeIntCompare(largeInt, *largeIntLen, smallInt, *smallIntLen);}for(int i = 0; i < *smallIntLen; i++)inta[i] = smallInt[i];*la = *smallIntLen;return 0;
}void LargeIntMultiply(int *inta, int *la, int *intb, int *lb, int *intc, int *lc)
{int i,j,k;i = j = k = 0;memset(intc,0,sizeof(int) * (*lc + 1));for(i = 0; i < *la; i++)for(j = 0; j < *lb; j++){intc[i+j] += inta[i] * intb[j];}for (k = 0; k < *la + *lb - 1; k++ )if(intc[k] >= 10) {intc[k+1] += intc[k] / 10;intc[k] = intc[k] % 10;}if (intc[k] != 0)*lc = k + 1;else*lc = k;
}char* LargeIntPrint(int *inta, int la){char *temp = (char *)malloc(la +1);int i,j;for (i = la - 1,j = 0; i >= 0; i--,j++)sprintf(temp + j , "%1d",inta[i]);temp[j] = 0;return temp;}int main()
{char stra[MAXLEN+1];char strb[MAXLEN+1];int inta[MAXLEN+1];int intb[MAXLEN+1];int intc[MAXLEN+1];int intd[MAXLEN+1];int la = 0;int lb = 0;int lc = 0;int ld = 0;char *res;memset(stra,0,MAXLEN+1);memset(strb,0,MAXLEN+1);memset(inta,0,(MAXLEN+1) * sizeof(int));memset(intb,0,(MAXLEN+1) * sizeof(int));memset(intc,0,(MAXLEN+1) * sizeof(int));memset(intd,0,(MAXLEN+1) * sizeof(int));scanf("%s",stra);scanf("%s",strb);StringToLargeInt(stra, strb, inta, intb, &la, &lb);LargeIntMultiply(inta, &la, intb, &lb, intc, &lc);LargeIntCommonDivisor(inta, &la, intb, &lb);LargeIntDevide(intc, &lc, inta, &la, intd, &ld, intb, &lb);res = LargeIntPrint(intd, ld);printf("%s", res);free(res);return 0;
}

最小公约数(大整数乘除法,C++)相关推荐

  1. C++ 大整数运算 高精度除法

    前言 这篇文章主要是对于大整数类的设计过程中,如何实现并改进长除法(模拟竖式法)的一个总结. 高精度除法的分类和比较 虽然有些文章在讨论大整数的除法运算时,喜欢分成高精度除以高精度和高精度除以低精度( ...

  2. 关于大整数包的设计!

            C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-4294967295.所以,int和unsigned类型变量 ...

  3. C++ 大整数除法 | 大整数乘法

    大整数除法 L1-046. 整除光棍 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数 ...

  4. javascript乘法和加法_js 大整数加法、乘法、除法

    有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作.接下来我将演示大整数的加法 ...

  5. 1.13 编程基础之综合应用 47 大整数除法方法 python

    http://noi.openjudge.cn/ch0113/47/ """ 1.13 编程基础之综合应用 47 大整数除法方法一 http://noi.openjudg ...

  6. Bailian2737 大整数除法【大数】

    2737:大整数除法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个大的正整数相除的商. 输入 第1行是被除数,第2行是除数.每个数均不超过100位. 输出 一行,相应的商的整数 ...

  7. c/c++ 大整数除法

    运算思路如下思路: 以1234 / 7为例: 1与7比较, 不够除, 因此该位商为 0, 余数为1. 余数1与新位 2组合成12, 12与7比较, 够除, 商为1, 余数为5. 余数 5与新位 3组合 ...

  8. NOI1.13.47 大整数除法 题解(C++)

    NOI1.13.47 大整数除法 题解(C++) 这题一看题目就知道绝非普通的long long 或 int .这可是高精度呀. 题目 47:大整数除法 总Time Limit: 1000ms Mem ...

  9. python 大整数的精确计算——除法(/)、整数除法(//)

    ____tz_zs 误差来源 这是因为浮点运算永远只是一个近似值,特别是当你超出了你的CPU能够准确建模的范围(因为浮点运算是在硬件中处理的). 整数除法不需要把整数转换成浮点数,它只需要用整数相除, ...

最新文章

  1. 关于正则表达式 \1 \2之类的问题
  2. 《算法技术手册》一2.4.6 二次方的算法性能
  3. 支付宝的架构到底有多牛逼!还没看完我就跪了!
  4. TensorRT和PyTorch模型的故事
  5. 最终幻想4 android,《最终幻想4》安卓版发布:重温那段曲折的冒险故事
  6. Resin-IOException: write() forbidden after writer is closed
  7. 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
  8. 金蝶软件怎么过账_代理记账用什么财务软件?
  9. RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看
  10. MathType中如何快速输入空心字母
  11. 编写一个油猴脚本,去除百度首页的广告卡片(亲测有效)
  12. Eastmount博客导读:专栏系统分类和博客归纳总结
  13. GINI Index-基尼指数
  14. android耳机检测驱动程序,USB 音频 CTS 验证程序测试
  15. LTE-TDD资源调度(1)-QCI、GBR和Non-GBR
  16. 三维交互可视化平台(智慧海上牧场平台)学习开发Flask+Vue+Echarts+Mysql+websocket 实战(四)
  17. android n 状态栏分析,Android N状态栏图标白底问题
  18. 给你一个水杯如何进行测试?
  19. 在win10上通过usb连接树莓派
  20. 【抓包工具】实战:WireShark 捕获过滤器的超全使用教程

热门文章

  1. 苹果设置网易邮箱收件服务器,苹果手机iphone怎么设置网易邮箱 iphone设置网易邮箱教程【步骤】...
  2. 双因素认证,让用户的帐号安全无忧
  3. java统一返回结果集封装,解决No converter found for return value of type
  4. 向量代数:向量的内积和外积
  5. 如何用纯前端去写购物车_索尼商城购物车
  6. 存储器PCB布线技巧
  7. javascript学习-canvas
  8. Java学习(二)---SE阶段回顾
  9. jQuery移除或禁用html元素的点击事件
  10. Redis中的ttl命令用法解析