C++中的大数运算
2013-03-22 12:36
585 查看
1.大数相加
思路:
建立两个长度为N的整型数组分别存放两个大数,和一个长度为N+1的数组存放它们得和。
建立一个字符数组存放每次输入的大数(此时数组中存放的实际为字符,要将它们转化为int型后再传递给整型数组)
运行结果如下:
2.大数相乘
思路:
建立两个字符数组分别存放两个大数,并将字符数组中的char元素转换为int型;
根据等式mResult[i+j] =mResult[i+j] + mult1[i]*mult2[j];求解;
代码如下:
运行结果如下:
待续。。。
思路:
建立两个长度为N的整型数组分别存放两个大数,和一个长度为N+1的数组存放它们得和。
建立一个字符数组存放每次输入的大数(此时数组中存放的实际为字符,要将它们转化为int型后再传递给整型数组)
//实现两个大数相加 #include <iostream> using namespace std; #define N 1000 //将c 中字符串转化成数字存入arr void InitArray(int arr[],char c[],int n)//初始化数组 { int k = strlen(c); for (int i = 0;i < k;i++)//strlen(c)等于c中字符个数,不包括‘\0’ { arr[n - k + i] = c[i] - '0'; } } void PrintArray(int arr[],int n)//打印数组中的元素 { int k = 0; for (int i = 0;i < n;i++) if(arr[i] != 0) { k = i; break; } for (int i = k;i < n;i++) cout << arr[i]; } void CulateSum(int arr1[],int arr2[],int sum[],int n)//由低位到高位计算两个大数的和,并把结果存入数组sum { for (int i = n;i >= 1;i--) { //注意:数组sum比数组arr1和arr2多一位元素,用来存放进位 sum[i] += arr1[i - 1] + arr2[i - 1]; if(sum[i] >= 10) { sum[i] -= 10;//取个位 sum[i-1] += 1;//进位 } } } //在函数体外定义的数组,元素均初始化为零 int a ; int b ; int sum[N+1]; //字符数组初始化为空,下面strlen(c)的值为0 char c ; int main() { cout << "input first number:" << endl; cin >> c; //对数组a进行初始化 InitArray(a,c,N); //打印数组a中元素 //PrintArray(a,sizeof(a)/sizeof(int)); cout << "input second number:" << endl; cin.clear(); cin >> c; //对数组b进行初始化 InitArray(b,c,N); //打印数组b中元素 //PrintArray(b,sizeof(b)/sizeof(int)); //求sum CulateSum(a,b,sum,N); cout << "\nthe result is: " << endl; PrintArray(sum,sizeof(sum)/sizeof(int)); cout << endl; return 0; }
运行结果如下:
2.大数相乘
思路:
建立两个字符数组分别存放两个大数,并将字符数组中的char元素转换为int型;
根据等式mResult[i+j] =mResult[i+j] + mult1[i]*mult2[j];求解;
代码如下:
#include <iostream> using namespace std; #define M 100 //将c 中字符串转化成数字存入arr void InitArray(int arr[],char c[],int n)//初始化数组 { int k = strlen(c); for (int i = 0;i < k;i++)//strlen(c)等于c中字符个数,不包括‘\0’ { arr[n - k + i] = c[i] - '0'; } } void bigDataMultiply(char m1[],char m2[],int mResult[],int m1Length,int m2Length) { int mult1[M]; int mult2[M]; //数组初始化 InitArray(mult1,m1,m1Length); InitArray(mult2,m2,m2Length); memset(mResult,0,sizeof(int)*2*M);//注意:将指针mResult指向位置开始的前sizeof(int)*2*M个字节值为0 //carry表示进位 int carry = 0; //remainder表示余数 int remainder = 0; for (int i = 0;i < m1Length;++i) for(int j = 0;j < m2Length;++j) mResult[i+j] =mResult[i+j] + mult1[i]*mult2[j]; //处理进位 for (int i = 0;i < m1Length + m2Length;++i) { mResult[i] += carry; carry = mResult[i]/10; //若存在进位,则对mResult[i]求余 int k = carry; while (k) { mResult[i] = mResult[i]%10; k /= 10; } } } //打印数组中的元素 template<class T> void printArray(T arr[],int n) { int k = 0; for (int i = 0;i < n;i++) { if(arr[i] != 0) { k = i; break; } } for (int i = k;i < n;i++) cout << arr[i]; cout << endl; } int main() { char bigData1[M],bigData2[M]; int resultData[2*M] = {0}; cout << "输入两个大数:\n"; while(cin >> bigData1 >> bigData2) { reverse(bigData1,bigData1+strlen(bigData1)); reverse(bigData2,bigData2+strlen(bigData2)); //printArray(bigData1,strlen(bigData1)); //printArray(bigData2,strlen(bigData2)); bigDataMultiply(bigData1,bigData2,resultData,strlen(bigData1),strlen(bigData2)); reverse(resultData,resultData+sizeof(resultData)/sizeof(int)); cout << "乘积为:\n"; printArray(resultData,2*M); cout << "\n输入两个大数:\n"; } return 0; }
运行结果如下:
待续。。。
相关文章推荐
- 大数的加减乘除运算(C++)
- C++大数运算之加法,减法
- 大数运算c++
- C++ gmp大数运算库 window下配置使用
- 【C++】大数的+-*/四则运算
- c++实现大数的加减乘运算(数组存放)
- 大数之四则运算(C++)
- c++大数、分数、模数运算实现模板
- 高精度(大数)的四则运算与逻辑运算---c++ struct版
- 小项目之用C++实现以顺序表存储的大数运算
- ZOJ 1205题解本来是一道大数运算水题,可是却纠结了很久,原因是没能真正读懂题意,要求的计算必须是一一对应输出即使前面出现几个0最后也要把前面的0输出,看别人用C++自己还是两个都提交了结果还是C占的内存少。
- [新手向] c++大数运算 (1)
- C++实现大数运算 加法部分。
- c++ 大数运算测试代码
- C++大数运算
- C++使用string大数运算——加法
- 大数运算-减法(C/C++实现)
- C++之运算符的重载实现大数的运算
- C++高精度大数运算板子
- 大数运算之加法和乘法算法C++模板