大数乘法
来源:互联网 发布:js中json对象转字符串 编辑:程序博客网 时间:2024/06/13 03:50
#include <stdio.h>
#include <string.h>
#define DIGIT 2 //num length of a array unit
#define MAXDIGIT 100 //10^DIGIT, max-1 of a array unit
#define MAX 1000 //Max of array
#define LL long //type of num
struct BigInt
{
LL data[MAX];
int size;
};
//把string类型转换为BigInt类型
BigInt StrToBigInt(char *str)
{
int i,j,k;
LL sum;
BigInt ret;
memset(&ret, 0, sizeof(ret));
int len;
len = strlen(str);
i=0;k=0;
while (len-i>=DIGIT)
{
sum = 0;
for (j=len-i-DIGIT;j<len-i;j++)
sum = sum*10+(str[j]-'0');
ret.data[k++] = sum;
i+=DIGIT;
}
if (i<len)
{
sum = 0;
for (j=0;j<len-i;j++)
sum = sum*10+(str[j]-'0');
ret.data[k++] = sum;
}
ret.size = k;
return ret;
}
BigInt BigIntMul(BigInt a, BigInt b)
{
BigInt ret;
memset(&ret, 0, sizeof(ret));
if (a.size == 1&&a.data[0] == 0)
{ ret.data[0] = 0;ret.size = 1;return ret; }
if (b.size == 1&&b.data[0] == 0)
{ ret.data[0] = 0;ret.size = 1;return ret; }
int i,j;
for (i=0;i<a.size;i++)
{
for (j=0;j<b.size;j++)
{
ret.data[i+j] += b.data[j] * a.data[i];
ret.data[i+j+1] += ret.data[i+j] / MAXDIGIT;
ret.data[i+j] = ret.data[i+j] % MAXDIGIT;
}
}
ret.size = i+j;
if (ret.data[ret.size]!=0)
ret.size++;
while(ret.data[ret.size-1]==0)
ret.size--;
return ret;
}
void PrintBigInt(BigInt a)
{
int i;
if (a.data[a.size-1]!=0||a.size==1)
printf("%d",a.data[a.size-1]);
for (i=a.size-2;i>=0;i--)
{
int w = MAXDIGIT / 10;
while (w > 1)
{
if (a.data[i] >= w)
break;
printf("0");
w /= 10;
}
printf("%d",a.data[i]);
}
printf("/n");
}
int main()
{
char a[300], b[300];
BigInt BigNum_a, BigNum_b, BigNum_c;
while (scanf("%s%s", a,b)!=EOF)
{
BigNum_a = StrToBigInt(a);
BigNum_b = StrToBigInt(b);
BigNum_c = BigIntMul(BigNum_a, BigNum_b);
PrintBigInt(BigNum_c);
}
return 0;
}
#include <string.h>
#define DIGIT 2 //num length of a array unit
#define MAXDIGIT 100 //10^DIGIT, max-1 of a array unit
#define MAX 1000 //Max of array
#define LL long //type of num
struct BigInt
{
LL data[MAX];
int size;
};
//把string类型转换为BigInt类型
BigInt StrToBigInt(char *str)
{
int i,j,k;
LL sum;
BigInt ret;
memset(&ret, 0, sizeof(ret));
int len;
len = strlen(str);
i=0;k=0;
while (len-i>=DIGIT)
{
sum = 0;
for (j=len-i-DIGIT;j<len-i;j++)
sum = sum*10+(str[j]-'0');
ret.data[k++] = sum;
i+=DIGIT;
}
if (i<len)
{
sum = 0;
for (j=0;j<len-i;j++)
sum = sum*10+(str[j]-'0');
ret.data[k++] = sum;
}
ret.size = k;
return ret;
}
BigInt BigIntMul(BigInt a, BigInt b)
{
BigInt ret;
memset(&ret, 0, sizeof(ret));
if (a.size == 1&&a.data[0] == 0)
{ ret.data[0] = 0;ret.size = 1;return ret; }
if (b.size == 1&&b.data[0] == 0)
{ ret.data[0] = 0;ret.size = 1;return ret; }
int i,j;
for (i=0;i<a.size;i++)
{
for (j=0;j<b.size;j++)
{
ret.data[i+j] += b.data[j] * a.data[i];
ret.data[i+j+1] += ret.data[i+j] / MAXDIGIT;
ret.data[i+j] = ret.data[i+j] % MAXDIGIT;
}
}
ret.size = i+j;
if (ret.data[ret.size]!=0)
ret.size++;
while(ret.data[ret.size-1]==0)
ret.size--;
return ret;
}
void PrintBigInt(BigInt a)
{
int i;
if (a.data[a.size-1]!=0||a.size==1)
printf("%d",a.data[a.size-1]);
for (i=a.size-2;i>=0;i--)
{
int w = MAXDIGIT / 10;
while (w > 1)
{
if (a.data[i] >= w)
break;
printf("0");
w /= 10;
}
printf("%d",a.data[i]);
}
printf("/n");
}
int main()
{
char a[300], b[300];
BigInt BigNum_a, BigNum_b, BigNum_c;
while (scanf("%s%s", a,b)!=EOF)
{
BigNum_a = StrToBigInt(a);
BigNum_b = StrToBigInt(b);
BigNum_c = BigIntMul(BigNum_a, BigNum_b);
PrintBigInt(BigNum_c);
}
return 0;
}
0 0
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 三门问题之概率思维
- Google Samples MVP + RxJava 官方精简Demo
- leetcode题解分析_84. Largest Rectangle in Histogram
- Filter
- Two Sum
- 大数乘法
- AngularJs如何验证重复密码
- 关于printf()函数的总结
- 链表简单使用(打印、删除、增加元素)的几个注意事项
- PHP团队 编码规范 & 代码样式风格规范
- libreoffice 文档中插入表格-保存-打印
- 秒杀DX12!Vulkan 1.0规范正式发布
- 数据结构实验之链表九:双向链表
- Spring的事务关于配置到service和dao中的区别