c++大数乘法和大数减法
2018-01-12 15:38
337 查看
前言:大一新生,代码风格可能有点奇怪。
a1 = 11111111111111111111111111111111111b1 = 11111111111111111111111111111111111111求:a1 * b1;题目很简单求两个数的乘积,显然整形是存不下来的。
代码如下:
下面我们再来看一个大数减法#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
#define INF 0xfffff;
#define sl(a) strlen(a)
#define ll long long
void cl(char a[],char b[])
{
int a1,b1,i,j;
char c[100];
if(strcmp(a,b)==0) printf("0");//如果两个字符串比较一样 那么就输出0
else
{
for(i=sl(a)-1,j=sl(b)-1; i>=0,j>=0; i--,j--)//我们从最低位开始做减法
{
a[i]=a[i]-b[j]+'0';//因为a的长度比b长 所以我们只需要存在a里面
}
for(i=strlen(a)-1; i>=0; i--)//开始解决进位
{
if(a[i]<'0')
{
a[i]=a[i]+10;
a[i-1]=a[i-1]-1;//因为元素控制在0~9所以负数也不会小于-10,那么我只需要将前一位-1
}
}
for(i=0; a[i]!='\0'; i++)//判断前导0
if(a[i]!='0') break;
puts(a+i);
}
}
main()
{
int a1,b1,c1;
char a[100],b[100];
scanf("%s%s",a,b);
a1=sl(a);
b1=sl(b);
if(a1==b1&&a[0]<b[0])//判断长度,长度一样,但是第一位小 那么就肯定是负数
{
printf("-");
cl(b,a);
}
else if(a1>=b1)//这样就是正数
cl(a,b);
else
{
printf("-");
cl(b,a);
}
}
加法也类似于减法。这些仅仅只是对于整数,不含有小数部分的求解。希望能够帮助到入门的新生。
题目:
大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。例如:我们要计算如下两个数的乘积时,用我们已知的数据类型是无法精确表示其结果的:a1 = 11111111111111111111111111111111111b1 = 11111111111111111111111111111111111111求:a1 * b1;题目很简单求两个数的乘积,显然整形是存不下来的。
代码如下:
#include<bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)); #define INF 0xfffff; #define sl(a) strlen(a) #define ll long long char da(char *a, char *b) { int i,j,bl,al,c[1000]; char h[1000]; al = sl(a);//求出 a,b的长度 bl = sl(b); mem(c,0);//将数组清空 mem(h,0); for (i = 0; i <al; i++) { for (j = 0; j < bl; j++) { c[i + j + 1] += (a[i] - '0')*(b[j] - '0');//进行乘积运算 } } for (i = al + bl-1; i >0; i--)//我们从低位开始进位 { if (c[i] >= 10)//上面的运算乘积出来的结果大于10 我们就要进行进位 { c[i-1] += c[i] / 10; c[i] %= 10; } } i = 0; while (c[i]==0)//前导0的情况 i++; for (j = 0; i < al+ bl; j++, i++) h[j] = c[i]+'0';//将整形转换为字符型存下 也可以直接输出 h[j] = '\0'; cout<<h<<endl; } int main() { int i; char A[101]; char B[101]; while(scanf("%s%s",A,B)!=EOF) { if(strcmp(A,"0")==0||strcmp(B,"0")==0)//判断是否为0; cout<<0<<endl; else da(A,B); } return 0; }
下面我们再来看一个大数减法#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a));
#define INF 0xfffff;
#define sl(a) strlen(a)
#define ll long long
void cl(char a[],char b[])
{
int a1,b1,i,j;
char c[100];
if(strcmp(a,b)==0) printf("0");//如果两个字符串比较一样 那么就输出0
else
{
for(i=sl(a)-1,j=sl(b)-1; i>=0,j>=0; i--,j--)//我们从最低位开始做减法
{
a[i]=a[i]-b[j]+'0';//因为a的长度比b长 所以我们只需要存在a里面
}
for(i=strlen(a)-1; i>=0; i--)//开始解决进位
{
if(a[i]<'0')
{
a[i]=a[i]+10;
a[i-1]=a[i-1]-1;//因为元素控制在0~9所以负数也不会小于-10,那么我只需要将前一位-1
}
}
for(i=0; a[i]!='\0'; i++)//判断前导0
if(a[i]!='0') break;
puts(a+i);
}
}
main()
{
int a1,b1,c1;
char a[100],b[100];
scanf("%s%s",a,b);
a1=sl(a);
b1=sl(b);
if(a1==b1&&a[0]<b[0])//判断长度,长度一样,但是第一位小 那么就肯定是负数
{
printf("-");
cl(b,a);
}
else if(a1>=b1)//这样就是正数
cl(a,b);
else
{
printf("-");
cl(b,a);
}
}
加法也类似于减法。这些仅仅只是对于整数,不含有小数部分的求解。希望能够帮助到入门的新生。
相关文章推荐
- 整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c++ java
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- 大数加法、大数乘法、大数减法。Swift。
- 我用c++写的一个多项式的处理器的核心部分和输出部分。实现多项式的加法,减法,乘法,除法,及其求余。
- Java工作利器之常用工具类(二)——数字工具类-大数乘法、加法、减法运算
- c++实现大数乘法
- 2012蓝桥杯C++本科 大数乘法
- 华为经典面试题---大数乘法的c++实现
- C++大数乘法
- C++实现大数据的加法、减法和乘法
- C++ 高精度加法 高精度减法 高精度乘法1
- 大数乘法——C++实现
- [acm 1001] c++ 大数加法 乘法 幂
- C++大数加法乘法
- C++大作业之链表实现的高精度加法,减法,和数组实现的高精度乘法。
- 大数乘法的分治策略C++实现
- C++实现大数的减法
- 大数运算——加法,减法,乘法 .
- 大数的加法,减法,乘法
- 大数乘法C++实现