http://ac.jobdu.com/problem.php?pid=1037
高精度运算加,减,乘。并且带有符号。
//高精度算法,400位以内的加,减,乘。
#include <stdio.h>
#include <string.h>
//add func
void add(int *a, int lena, int *b, int lenb, int *t, int &lent)
{
int i, j, k = 0;
for(i = 0, j = 0; i < lena && j < lenb; i ++, j ++){
t[k ++] = a[i] + b[j];
}
while(i < lena){
t[k ++] = a[i ++];
}
while(j < lenb){
t[k ++] = b[j ++];
}
j = 0;
for(i = 0; i < k; i ++){
t[i] += j;
j = t[i]/10;
t[i] %= 10;
}
while(j != 0){
t[k ++] = j % 10;
j /= 10;
}
lent = k;
}
//sub func
void sub(int *a, int lena, int *b, int lenb, int *t, int &lent)
{
int i, j = 0, k = 0;
for(i = 0; i < lenb; i ++){
t[i] = a[i] - b[i];
}
k = i;
while(i < lena){
t[k ++] = a[i ++];
}
for(i = 0; i < k; i ++){
t[i] += j;
if(t[i] < 0){
j = -1;
t[i] += 10;
}
else {
j = 0;
}
}
while(t[k - 1] == 0){
k --;
}
lent = k;
}
//numti func
void multi(int *a, int lena, int *b, int lenb, int *t, int &lent)
{
int i, j, k = 0;
for(i = 0; i < lena; i ++){
for(j = 0; j < lenb; j ++){
t[i + j] += a[i] * b[j];
}
}
k = i + j - 1;
/* for(i = 0; i < k; i ++){
printf("%d ", t[i]);
}
printf("\n");
*/
j = 0;
for(i = 0; i < k; i ++){
t[i] += j;
j = t[i] / 10;
t[i] %= 10;
}
while(j != 0){
t[k ++] = j % 10;
j /= 10;
}
lent = k;
}
//chang char * to int * and return the lenth and signal
void getnum(char *str, int *a, int &lena, char &op)
{
int len = strlen(str);
int i, t = 0;
if(str[0] == '-')op = '-';
else op = '+';
for(i = len - 1; i >= 1; i --){
a[t ++] = (int)(str[i] - '0');
}
if(str[0] != '-' && str[0] != '+')a[t ++] = (int)(str[0] - '0');
lena = t;
}
int main()
{
// freopen("input.in", "r", stdin);
char str[450], str2[450], op, op2;
int num[450], num2[450];
int ares[450], sres[450], mres[900];
int lennum, lennum2, lena, lens, lenm;
int i;
while(gets(str)){
gets(str2);
lennum = strlen(str);
lennum2 = strlen(str2);
getnum(str, num, lennum, op);
getnum(str2, num2, lennum2, op2);
/*
add(num, lennum, num2, lennum2, ares, lena);
printf("%d\n", lena);
for(i = lena - 1; i >= 0; i --){
printf("%d", ares[i]);
}
printf("\n");
if(lennum > lennum2){
sub(num, lennum, num2, lennum2, sres, lens);
printf("%d\n", lens);
for(i = lens - 1; i >= 0; i --){
printf("%d", sres[i]);
}
printf("\n");
}*/
if(op == op2){
//add
add(num, lennum, num2, lennum2, ares, lena);
if(op == '-')printf("-");
for(i = lena - 1; i >= 0; i --){
printf("%d", ares[i]);
}
printf("\n");
//sub
if(lennum > lennum2){
sub(num, lennum, num2, lennum2, sres, lens);
if(op == '-')printf("-");
for(i = lens - 1; i >= 0; i --){
printf("%d", sres[i]);
}
printf("\n");
}//if
else if(lennum < lennum2){
sub(num2, lennum2, num, lennum, sres, lens);
if(op == '+')printf("-");
for(i = lens - 1; i >= 0; i --){
printf("%d", sres[i]);
}
printf("\n");
}//else if
else{
for(i = lennum - 1; i >= 0; i --){
if(num[i] != num2[i])break;
}
if(i < 0)printf("0\n");
else if(num[i] > num2[i]){
sub(num, lennum, num2, lennum2, sres, lens);
if(op == '-')printf("-");
for(i = lens - 1; i >= 0; i --){
printf("%d", sres[i]);
}
printf("\n");
}
else{
sub(num2, lennum2, num, lennum, sres, lens);
if(op == '+')printf("-");
for(i = lens - 1; i >= 0; i --){
printf("%d", sres[i]);
}
printf("\n");
}//else
}//else
}//if
else{
//add
if(lennum > lennum2){
sub(num, lennum, num2, lennum2, ares, lena);
if(op == '-')printf("-");
for(i = lena - 1; i >= 0; i --){
printf("%d", ares[i]);
}
printf("\n");
}//if
else if(lennum < lennum2){
sub(num2, lennum2, num, lennum, ares, lena);
if(op == '+')printf("-");
for(i = lena - 1; i >= 0; i --){
printf("%d", ares[i]);
}
printf("\n");
}//else if
else{
for(i = lennum - 1; i >= 0; i --){
if(num[i] != num2[i])break;
}
if(i < 0)printf("0\n");
else if(num[i] > num2[i]){
sub(num, lennum, num2, lennum2, ares, lena);
if(op == '-')printf("-");
for(i = lena - 1; i >= 0; i --){
printf("%d", ares[i]);
}
printf("\n");
}
else{
sub(num2, lennum2, num, lennum, ares, lena);
if(op == '+')printf("-");
for(i = lena - 1; i >= 0; i --){
printf("%d", ares[i]);
}
printf("\n");
}//else
}//else
//sub
add(num, lennum, num2, lennum2, sres, lens);
if(op == '-')printf("-");
for(i = lens - 1; i >= 0; i --){
printf("%d", sres[i]);
}
printf("\n");
}
memset(mres, 0, sizeof(mres));
multi(num, lennum, num2, lennum2, mres, lenm);
if(op != op2)printf("-");
for(i = lenm - 1; i >= 0; i --){
printf("%d", mres[i]);
}
printf("\n");
}
return 0;
}