大数相加与相乘 客官°小女子只卖身不卖艺 2022-08-23 03:45 166阅读 0赞 //先说相加 #include<iostream> #include<cstring> using namespace std; int main() { char num1[200]; char num2[200]; //用以存放反转后的字符串 char num3[200]; char num4[200]; //用以存放结果,到时候从后往前输出即可 char result[201]; memset(num1, 0, 200); memset(num2, 0, 200); memset(num3, 0, 200); memset(num4, 0, 200); memset(result, 0, 201); cin >> num1 >> num2; //字符串反转 int count = 0; for (int i = strlen(num1)-1; i >=0; --i) { num3[count++] = num1[i]; } count = 0; for (int i = strlen(num2) - 1; i >= 0; --i) { num4[count++] = num2[i]; } int maxlen = strlen(num1) > strlen(num2) ? strlen(num1) : strlen(num2); for (int i = 0; i < maxlen; ++i) { result[i] = num3[i] + num4[i] -'0'; } //进位 for (int i = 0; i < strlen(result); ++i) { if (result[i] > '9') { result[i] = result[i] - 10; result[i + 1] += 1; } } //为了防止这一位是进位上来的,而不是原来就有的,所以先判断一下然后加上 ‘0’ if (result[strlen(result) - 1] < '0') result[strlen(result) - 1] += '0'; //输出 for (int i = strlen(result) - 1; i >= 0; --i) { cout << result[i]; } system("pause"); return 0; } //相乘(经测试只能乘不是很大的数,原因是某个小于10的数乘以一个大数还是不够安全,以后会加上加强版的,估计就是继续进行拆分,(●ˇ∀ˇ●)) #include<iostream> #include<cstring> using namespace std; int main() { char num1[100]; char num2[100]; //用以存放反转后的字符串 char num3[100]; char num4[100]; //用以存放结果,到时候从后往前输出即可,这里换成long long类型而不是char类型(cahr方便输出),因为相加的时候数字比较小,char可以存下,相乘就不行了 long long result[101]; memset(num1, 0, 100); memset(num2, 0, 100); memset(num3, 0, 100); memset(num4, 0, 100); for (int i = 0; i < 101; ++i) result[i] = 0; cin >> num1 >> num2; //字符串反转 int count = 0; for (int i = strlen(num1) - 1; i >= 0; --i) { num3[count++] = num1[i]; } count = 0; for (int i = strlen(num2) - 1; i >= 0; --i) { num4[count++] = num2[i]; } //开始乘啦 int flag = 0;//result的位数 for (int i = 0; i < strlen(num3); ++i) { count = 0;//位数 for (int j = 0; j < strlen(num4); ++j) { result[flag]+=(num3[i]-'0')*(num4[j]-'0')*pow(10,count); ++count; } ++flag; } //进位 for (int i = 0; i < 101; ++i) { if (result[i] > 9) { result[i + 1] += (result[i] / 10); result[i] %= 10; } } //防止输出不必要的0 for (int i = 100;; --i) { if (result[i] != 0) { count = i; break; } } for (int i = count; i >= 0; --i) cout << result[i]; system("pause"); return 0; } //今天下课回来的路上一直在想着怎么解决昨晚遗留的问题,问题主要是即使分解了原来的数,但是第一个数的每一位还是要和另一个数相乘,当数字过大时显然不能存放下,所以还得进行分解,于是想到了二维数组。,下面是代码:(我分别测试了一下两者,发现差距还不小呢(●ˇ∀ˇ●)) #include<iostream> #include<cstring> using namespace std; //问为什么要在主函数外定义这些数组。他们现在属于全局变量,存放在中静态存储区中,而主函数中的数组存放在栈中,显然前者空间比较大,因此我们定义一个过大的数组或容器,应当把它把它定义为全局变量为宜 char num1[1000]; char num2[1000]; //用以存放反转后的字符串 char num3[1000]; char num4[1000]; //用以存放结果,到时候从后往前输出即可,这里换成long long类型而不是char类型(cahr方便输出),因为相加的时候数字比较小,char可以存下,相乘就不行了 long long result[1001][1001];//通过之前的教训,即使是这样也不能计算比较大的数,所以设成二维数组 int main() { memset(num1, 0, 1000); memset(num2, 0, 1000); memset(num3, 0, 1000); memset(num4, 0, 1000); for (int i = 0; i < 1001; ++i) for(int j=0;j<1001;++j) result[i][j] = 0; cin >> num1 >> num2; //字符串反转 int count = 0; for (int i = strlen(num1) - 1; i >= 0; --i) { num3[count++] = num1[i]; } count = 0; for (int i = strlen(num2) - 1; i >= 0; --i) { num4[count++] = num2[i]; } //开始乘啦 int flag = 0;//result的位数 for (int i = 0; i < strlen(num3); ++i) { count = i;//这样就能每次乘的时候自动往前填数,而不是始终从0开始,到时候还得移位 for (int j = 0; j < strlen(num4); ++j) { result[i][count++] = (num3[i] - '0')*(num4[j] - '0'); } ++flag; } //进位 for (int i = 0; i <= flag; ++i) { for (int j = 0; j < 1001; ++j) { if (result[i][j] > 9) { result[i][j + 1] += result[i][j] / 10; result[i][j] %= 10; } } } //将所有的数相加 int finalresult[1001]; for (int i = 0; i < 1001; ++i) finalresult[i] = 0; for (int j = 0; j < 1001; ++j) { for (int i = 0; i < 1001; ++i) { finalresult[j] += result[i][j]; } } //最终结果进位 for (int i = 0; i < 1001; ++i) { if (finalresult[i] > 9) { finalresult[i + 1] += finalresult[i] / 10; finalresult[i] %= 10; } } //防止输出不必要的0 for (int i = 1000;; --i) { if (finalresult[i] != 0) { count = i; break; } } //逆序输出 for (; count >= 0; --count) { cout << finalresult[count]; } system("pause"); return 0; } 下面是测试内容: 第一种相乘: ![这里写图片描述][20160606132347116] 看,如果出现这种稍大些的数就溢出了。 再来看看第二种: ![这里写图片描述][20160606132327475] 还是好好的呢(●ˇ∀ˇ●) 再来更变态的: ![这里写图片描述][20160606132222631] [20160606132347116]: /images/20220722/ce4cddf4c3ae4c48801ce70721512a83.png [20160606132327475]: /images/20220722/9f63a7138a9a41e59d55bfc5a4a924d5.png [20160606132222631]: /images/20220722/3b1c58fb96144d2f9527db1844bcdee9.png
相关 大数相乘 一、背景 最近在看算法的时候发现了一个问题,我们都知道方法的形参是要指定类型的,假如有以下方法 public int example(int a,int b){ 傷城~/ 2022年09月30日 13:55/ 0 赞/ 185 阅读
相关 大数相加与相乘 //先说相加 include<iostream> include<cstring> using namespace std; int main 客官°小女子只卖身不卖艺/ 2022年08月23日 03:45/ 0 赞/ 167 阅读
相关 大数相乘 无意中看到一个华为面试题,使用代码计算[1234567891011121314151617181920\2019181716151413121110987654321][123 系统管理员/ 2022年08月11日 20:29/ 0 赞/ 179 阅读
相关 大数相乘 题目:请使用代码计算1234567891011121314151617181920\2019181716151413121110987654321。 答: ![复制代码][ Bertha 。/ 2022年08月05日 08:54/ 0 赞/ 189 阅读
相关 大数相乘 在这之前我们先来了解一下Java 中每种基本数据类型所占存储空间的大小。其中 1Byte = 8bit。 <table> <tbody> <tr> <th> 朱雀/ 2022年06月02日 02:36/ 0 赞/ 227 阅读
相关 大数相乘 设X和Y是n位的二进制整数,现在要计算X\Y的结果 将a和b分为两段,每段长均为总长的1/2, ![20180329214901958][] 拼搏现实的明天。/ 2022年05月28日 05:06/ 0 赞/ 197 阅读
相关 大数相乘 题目 编写两个任意位数的大数相乘的程序,给出计算结果。比如: > 题目描述: 输出两个不超过100位的大整数的乘积。 > 输入: 输入两个大整数,如1234567 今天药忘吃喽~/ 2022年05月23日 11:23/ 0 赞/ 321 阅读
相关 大数相乘 输入两个大数,输出两个数的乘积,位数可能很大,少于1000位 一个数的第i位和另一个数的第j位相乘所得的数,一定是要累加到结果的第i+j位上,这里i,j都是自由往左从0开始数 墨蓝/ 2021年12月13日 03:43/ 0 赞/ 296 阅读
相关 【手撕代码】大数问题:大数相加和大数相乘问题 + Karatsuba 算法 目 录: 1、大数相加 2、大数相乘 3、Karatsuba 算法 -------------------- 大数问题,简而言之就是不可以使用 int 类型直接 谁借莪1个温暖的怀抱¢/ 2021年12月10日 15:05/ 0 赞/ 308 阅读
相关 大数相乘 def fun(num1,num2): num1 type str num2 type str a = map(int, 落日映苍穹つ/ 2021年10月24日 01:48/ 0 赞/ 315 阅读
还没有评论,来说两句吧...