跪求c++大数相加和大数相乘的代码,注释要详细的啊
发布网友
发布时间:2024-10-11 14:43
我来回答
共2个回答
热心网友
时间:2024-10-11 16:33
两个超大数相加,相乘/*
本程序假设所输入的大数均在20位以内,并且输入数字时候假定不出现非法情况
特例:(不存在这样情况123a78ty等)
*/
#include "stdio.h"
#define MAX 21
void InputNumber(int []); //输入大数
void InitNumber(int []); //初始化用于存放结果的数组
void Multi(int [],int [],int []); //进行大数乘法
void singleMulti(int [],int,int []); //对大数乘以一位数的函数
void Add(int [],int []); //对结果进行错位相加
void printresult(int []); //输出结果
void main()
{
int largenumber1[MAX],largenumber2[MAX],mResult[2 * MAX -1];
//largenumber1[]和largenumber2[]表示要相乘的大数
//mResult[]表示结果存放的数组,显然其位数不会超过2 * (MAX - 1)
printf("Input the first number:\n");
InputNumber(largenumber1);
printf("Input the second number:\n");
InputNumber(largenumber2);
InitNumber(mResult);
Multi(largenumber1,largenumber2,mResult);
printf("The result is:\n");
printresult(mResult);
getchar();
}
void InputNumber(int largenumber[])
{
char numberchar;
int i = 0;
scanf("%c",&numberchar);
while(numberchar != '\n' && i < MAX) //最初输入大数用字符串表示
{
largenumber[++i] = numberchar - '0';
scanf("%c",&numberchar);
}
largenumber[0] = i;
}
void InitNumber(int result[])
{
for(int i = 0; i < 2 * MAX - 1; i++)
result[i] = -1;
}
void Multi(int number1[],int number2[],int result[])
{
int i;
int temper[2 * MAX - 1];
for(i = number2[0]; i >= 1; i--)
{
singleMulti(number1,number2[i],temper);
Add(result,temper);
}
}
void singleMulti(int number1[],int number2,int temper[])
{
int i,t = 0,c = 2 * MAX - 2;
for(i = number1[0]; i >= 1; i--)
{
int tempernumber = number2 * number1[i];
temper[c--] = (tempernumber + t) % 10;
t = (int)((tempernumber + t) / 10);
}
if (t > 0)
{
temper[c] = t;
temper[0] = 2 * MAX - 2 - c + 1;
}
else
temper[0] = 2 * MAX -2 - c;
}
void Add(int result[],int temper[])
{
static int pos = 2 * MAX - 2;
int c = pos,t = 0;
for(int i = 2 * MAX - 2; i > 2 * MAX - 2 - temper[0]; i--)
{
if (result[c] == -1)
result[c] = 0;
int tempernumber = result[c] + temper[i];
result[c--] = (tempernumber + t) % 10;
t = (int)(tempernumber / 10);
}
if (t == 1)
result[c] = 1;
pos--;
}
void printresult(int result[])
{
for(int i = 1; i < 2 * MAX - 1 ; i++)
if (result[i] != -1)
printf("%d",result[i]);
}
热心网友
时间:2024-10-11 16:35
你小学用来计算大数加减乘除,是需要列竖式的,
好好回忆一下,翻翻小学数学课本
把那些数字都用字符串来存储再运算吧
把竖式的加减乘除实现即可,反正也是一位一位的计算
代码细节就不说了,这个都自己分析不出来
就真的无语了
这个不需要用到什么生僻技术滴