大数问题:用字符串解决大数相加和相乘。【转】
来源:互联网 发布:网络连接配置存在问题 编辑:程序博客网 时间:2024/04/29 05:18
在ACM的题目中经常会遇到大数相加和相乘的问题,在有些公司的面试题中也有暗含要用大数才能解决的问题。比如:输入三个整数,写一个程序判断这个三个整数能否构成一个直角三角形。此题算法很简单,但是却暗含着结果可能溢出的问题。如果不会用大数,此题就无法给出完美的答案。
下面给出大数的乘法和加法算法:
1、加法:
// assume m is bigger than n.
char* add(char *a, char *b, int m, int n)
{
// 为结果分配内存空间。
char *c = (char*)malloc((m + 2)* sizeof(char));
memset(c, 0, (m + 2) * sizeof(char));
// 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。
for (int i = m, j = n - 1; j >= 0; --i, --j)
c[i] += (b[j] - 0x30);
for (int i = m, j = m - 1; j >= 0; --i, --j)
{
c[i] += (a[j] - 0x30);
if (c[i] > 9)
{
c[i - 1] += 1;
c[i] -= 10;
}
}
// 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
char* add(char *a, char *b, int m, int n)
{
// 为结果分配内存空间。
char *c = (char*)malloc((m + 2)* sizeof(char));
memset(c, 0, (m + 2) * sizeof(char));
// 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。
for (int i = m, j = n - 1; j >= 0; --i, --j)
c[i] += (b[j] - 0x30);
for (int i = m, j = m - 1; j >= 0; --i, --j)
{
c[i] += (a[j] - 0x30);
if (c[i] > 9)
{
c[i - 1] += 1;
c[i] -= 10;
}
}
// 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
c[m + 1] = '/0';
for (int i = 0; i != m + 1; ++i)
c[i] += 0x30;
if (c[0] == 0x30)
for (int i = 0; c[i] != '/0'; ++i)
c[i] = c[i + 1];
// 返回结果所在内存单元的首地址。
return c;
}
for (int i = 0; i != m + 1; ++i)
c[i] += 0x30;
if (c[0] == 0x30)
for (int i = 0; c[i] != '/0'; ++i)
c[i] = c[i + 1];
// 返回结果所在内存单元的首地址。
return c;
}
2、乘法:
// assume m is bigger than n.
char* mult(char *a, char *b, int m, int n)
{
// 为结果分配内存空间。
char *c = (char*)malloc((m + n + 1) * sizeof(char));
memset(c, 0, (m + n + 1) * sizeof(char));
// 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。
for (int i = m - 1, r = m + n - 1; i >= 0; --i, --r)
{
for (int j = n - 1, k = r; j >= 0; --j, --k)
{
c[k] += (a[i] - 0x30) * (b[j] - 0x30);
int tmp = c[k] / 10;
if (tmp > 1)
{
c[k - 1] += tmp;
c[k] -= tmp * 10;
}
}
}
// 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
c[m + n] = '/0';
for (int i = 0; i != m + n; ++i)
c[i] += 0x30;
char* mult(char *a, char *b, int m, int n)
{
// 为结果分配内存空间。
char *c = (char*)malloc((m + n + 1) * sizeof(char));
memset(c, 0, (m + n + 1) * sizeof(char));
// 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。
for (int i = m - 1, r = m + n - 1; i >= 0; --i, --r)
{
for (int j = n - 1, k = r; j >= 0; --j, --k)
{
c[k] += (a[i] - 0x30) * (b[j] - 0x30);
int tmp = c[k] / 10;
if (tmp > 1)
{
c[k - 1] += tmp;
c[k] -= tmp * 10;
}
}
}
// 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
c[m + n] = '/0';
for (int i = 0; i != m + n; ++i)
c[i] += 0x30;
if (c[0] == 0x30)
for (int i = 0; c[i] != '/0'; ++i)
c[i] = c[i + 1];
// 返回结果所在内存单元的首地址。
return c;
}
for (int i = 0; c[i] != '/0'; ++i)
c[i] = c[i + 1];
// 返回结果所在内存单元的首地址。
return c;
}
- 大数问题:用字符串解决大数相加和相乘
- 大数问题:用字符串解决大数相加和相乘。
- 大数问题:用字符串解决大数相加和相乘。【转】
- 大数问题:用字符串解决大数相加和相乘(转载)
- 大数问题-相加和相乘
- 大数相加和大数相乘
- 大数相乘和大数相加
- 用字符串解决大数问题
- 大数相乘和相加
- 大数相加 和 相乘
- 用字符串实现大数相乘
- 算法:大数相乘,用字符串表示
- 大数相乘解决办法,用字符串表示的大数
- 大数相加, 大数相乘
- 大数相加、大数相乘
- 大数相乘,大数相加
- 大数相加,大数相乘和100!
- 字符串大数相加和相乘
- 正则表达式高级技巧背后的关键概念
- bash如何判断一个文件是否存在
- C# 中 MongoDB 更新操作
- You have new mail in /var/spool/mail/loganalysis
- MS SQL 注入总结
- 大数问题:用字符串解决大数相加和相乘。【转】
- ASCII码表
- 一个C语言的惨痛教训
- 如何和外国人流利对话:出国英语900句 (301-600)
- Hibernate关于Session管理的openSession和getCurrentSession的理解
- iPhone开发学习笔记_剪切板的使用
- 构建Spring环境(基于spring-framework-2.5.6开发)
- IT公司的加班文化
- 如何和外国人流利对话:出国英语900句 (601-900)