C++高精度加法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <iostream> #include <string> #include <cstring> using namespace std; /* 按顺序打印数组元素 flag为true时正序打印 flag为false时倒序打印 */ template < typename T> void show(T arr[], int len, bool flag= true ){ if (flag) // 正序打印 for ( int i=0;i<len;i++) cout << arr[i]; else // 逆序打印 for ( int i=len-1;i>=0;i--) cout << arr[i]; cout << endl; } int main() { string str1, str2; // 字符串方式获取数字 cin >> str1 >> str2; // 确定字符串的长度 int len1 = str1.length(); int len2 = str2.length(); // 取最长的字符长度作为转换后的数字数组长度,确保长度不一的加数遍历不会越界 // 如1248+384466转为842100 和 664483 int len = len1 > len2 ? len1 : len2; // 根据确定的长度创建用于存储数字的数组, int num1[len],num2[len]; // 使用memset函数将内存数据置为0 memset (num1, 0, sizeof (num1)); memset (num2, 0, sizeof (num2)); // 倒序的方式填充数字数组 // str1和str2中存储的是数字字符,每个数字字符有其对应的ASCII码值,'0'字符ASCII码值为48 // 因此要将字符转为int值,可以用str[i]-'0'或str[i]-48求字符差值的方式计算 for ( int i=0;i<len1;i++) num1[i] = str1[len1-i-1]- '0' ; for ( int i=0;i<len2;i++) num2[i] = str2[len2-i-1]-48; // show(num1, len); // show(num2, len); // 加法的极限就是最大加数的长度+1,因此可以初步判断和的最大长度 int num3[len+1]; // 进行加运算 // index为和数组的当前下标,最终也为和数组的实际长度-1 // x为每位相加后的进位值 int index = 0, x = 0; while (index < len) { // 对应的位求和并加上已存在的进位值 num3[index] = num1[index] + num2[index] + x; // 两位相加大于10,需要进位 if (num3[index] > 10) { // 求进位部分 x = num3[index] / 10; // 取余 num3[index] %= 10; } else x = 0; // 没超过10,x为0 index++; } // while循环完成,如果x不为0,说明最高位应赋值 // x为0则说明和未突破加数的位数,index--以作为num3的实际长度 if (x != 0) { num3[index] = x; } else index--; show(num3, index+1, false ); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律