?? large.cpp
字號:
/* * Name: large.cpp * Date: 2009-02-20 * Function: 給定一些整數(其位數可能上百位),對其可完成加、減、乘和整除運算。 輸入描述 輸入若干組數據,每組數據由一個運算符(+,-,*,/)和兩個整數構成,整數的范圍在(-10^150~10^150),如果遇到符號"@",則輸入結束。 輸出描述 對于輸入的每組數據,輸出其運算序號和運算結果,每個結果獨占一行; 如果計算結果超200位,則輸出"Too Large Number."; 如果運算符不是上述四種之一,則輸出"Illegal Operator."; 如果除0,則輸出"Divide By Zero."。 輸入樣本 / 100 0 * 12345678901234567890 54321 * 12 21 @ " 輸出樣本 1 Divide By Zero. 2 670629623593962962352690 3 252* CopyRight: 電控 * Modify: */#include <iostream.h>#include <stdlib.h>#include <string.h>#define MAXLENGTH 512#define RESULTLENGTH 512#define MAXPAIR 256char *sub(char *num1,char *num2);char *add(char *num1,char *num2);char *mul(char *num1,char *num2);char *div(char *num1,char *num2);void clearZero(char *r); //清除字符串前0void DelFlag(char *r) ; //刪除字符串前面的負號char * AddFlag(char *r) ;//加負號
int cmp(char *r,char *t);//比較兩個字串 int main(int argc,char **argv){ char flag; //符號 char *num1; char *num2; char *result[MAXPAIR]; int t = 0; num1 = (char*)malloc(MAXLENGTH * sizeof(char)); if(num1 == NULL) { cout << "內存分配失敗"<<endl; return -1; } num2 = (char*)malloc(MAXLENGTH * sizeof(char)) ; if(num2 == NULL) { cout << "內存分配失敗"<<endl; return -1; } cout <<" 輸入樣本 :"<<endl; while(1) { cin >> flag; if(flag == '@') { break; } result[t] = (char*)malloc(2*MAXLENGTH * sizeof(char)); if(result[t] == NULL) { cout << "內存分配失敗"<<endl; return -1; }
for(int i = 0 ;i<2*MAXLENGTH ;i++)
{
result[t][i] = '\0';
} cin >> num1; cin >> num2; switch(flag) { case '-': { strcpy(result[t], sub(num1,num2)); } break; case '+': { strcpy(result[t], add(num1,num2)); } break; case '*': { strcpy(result[t],mul(num1,num2)) ; } break; case '/': { strcpy(result[t], div(num1,num2)); } break; default : { strcpy(result[t],"Illegal Operator"); }
break; } ++t; } cout << "輸出結果:"<<endl; for (int i = 0; i < t; i++) { cout << i+1<<"\t"<<result[i]<<endl; }
free(num1);
free(num2);
for(i = 0; i < t; i++)
{
free(result[i]) ;
} return 0;}////////////數組前清零//////////////////////////////////////////////////////////////void clearZero(char *r){ int lr; int i=0, j; lr=strlen(r); while(r[i] == '0') { ++i; } if(i > 0) { for(j = 0; j < lr-i; ++j) { r[j] = r[j+i]; } for(j = lr-i; j < lr; ++j) { r[j] = '\0'; } } if(r[0] == '\0') { r[0] = '0'; } }//////////////刪除符號////////////////////////////////////////////////////////////void DelFlag(char *r) //刪除字符串前面的負號{ int lr; lr = strlen(r) ; int i ; for(i = 0;i<lr-1;i++) { r[i] = r[i+1]; } r[lr-1] = '\0' ;}///////////增加符號///////////////////////////////////////////////////////////////char * AddFlag(char *r) //加負號{ int lr ; lr = strlen(r) ; char *p = (char*)malloc((lr+1)*sizeof(char)); if(p == NULL) { cout << "內存分配出錯"<<endl ; exit(0) ; }
memset(p,'\0',lr+1); p[0] = '-' ; strcat(p,r) ; return p ;}//////////////////乘法////////////////////////////////////////////////////////char *mul(char *num1,char *num2){ char *temp ; //存結果
char c = '0' ; //暫存符號num1
char d = '0'; //暫存符號num2 int i,j; int len1 = strlen(num1); int len2 = strlen(num2); temp = (char*)malloc((RESULTLENGTH)*sizeof(char)); if(temp == NULL) { cout << "內存分配出錯"<<endl; exit(-1) ; } //初始化結果數組 for(i = 0 ;i<len1+len2;i++) { temp[i] = '0' ; } temp[i] = '\0' ; c = num1[0] ;
d = num2[0]; if(c == '-') { DelFlag(num1);
len1 = strlen(num1); } if(d == '-') { DelFlag(num2);
len2 = strlen(num2); } int carry = 0; //進位初時設為0 int h ; for(i=len1-1; i>=0; --i) { carry = 0; for(j=len2-1; j>=0; --j) { int lp = i+j+1; h = (num1[i] - '0')*(num2[j] - '0')+(temp[i+j+1] - '0') + carry; //x - '0' 將字符轉化為數字 carry = h / 10 ; h = h %10 ; temp[i+j+1] = h+'0'; }
if(carry > 0)
{
temp[i+j+1] = carry + '0' ;
} }
clearZero(temp) ;
if((c == '-'&&d != '-' ) || (c != '-' &&d == '-')) {
int len = strlen(temp);
temp[len-1] = '\0'; strcpy (temp,AddFlag(temp));
}
else if (c == '-' && d == '-')
{
int len = strlen(temp);
temp[len-2] = '\0';
}
int len = strlen(temp) ; //計算結果位數
if(len > 200)
{
strcpy(temp,"Too Large Number.");
return temp;
}
else
{ return temp;
}}
//////////////加法 //////////////////////////////////////////////////////////
char *add(char *num1,char *num2)
{
int len1;
int len2;
int mid; //交換用
int carry = 0;//進位
char *result;
char *p ;
int temp;
char tt;
len1 = strlen(num1);
len2 = strlen(num2);
result = (char*)malloc((len1+len2)*sizeof(char));
if( result == NULL)
{
cout << "分配內存錯誤 "<<endl;
exit(-1);
}
for(int m = 0 ;m < len1+len2; m++)
{
result[m] = '0' ;
}
result[m] = '\0' ;
char c,d;
c = num1[0];
d = num2[0];
if((c == '-') && (d!= '-'))
{
DelFlag(num1);
return(sub(num2,num1)); ////直接調用減法
}
if((d == '-')&&(c != '-'))
{
DelFlag(num2);
return (sub(num1,num2)); //直接調用減法
}
if((c == '-')&&(d == '-'))
{
DelFlag(num1);
DelFlag(num2);
strcpy (result,AddFlag(add(num1,num2))); //遞歸調用
}
else
{
//如果第一個數字長度比第2個大 ,交換兩個字串
if(len2 > len1)
{
p = num1;
num1 = num2 ;
num2 = p;
mid = len1;
len1 = len2;
len2 = mid ;
}
int i;
for(i=0; i<len1; ++i)
{
mid = num1[len1-i-1] -'0' + num2[len2-i-1] -'0' + carry;
if(mid > 9)
{
carry = 1;
mid = mid - 10;
}
else
{
carry = 0;
}
result[i] = mid + '0';
}
for(i = len2; i < len1; ++i)
{
mid = num1[len1-i-1] - '0' + carry;
if(mid > 9)
{
carry = 1;
mid = mid - 10;
}
else
{
carry = 0;
}
result[i] = '0' + mid;
}
if(carry > 0)
{
result[i] = carry + '0';
temp = i;
}
else
{
temp = i - 1;
}
for(i = temp + 1; i < len1 + 2; ++i)
{
result[i]='\0';
}
for(i=0; i<(temp+1)/2; ++i)
{
tt = result[i];
result[i] = result[temp-i];
result[temp-i] = tt;
}
}
int len = strlen(result) ;
if(len > 200)
{
strcpy(result,"Too Large Number.");
return result;
}
else
{
return result;
}
}
////////減法/////////////////////////////////
char *sub(char *num1,char *num2)
{
int len1;
int len2;
int mid;
int carry = 0;
int flag = 0; //大小標志
char c,d;//暫存符號
char hc;
len1 = strlen(num1);
len2 = strlen(num2);
char *p; //交換字符串
char *result ;
result = (char*)malloc((len1+len2)*sizeof(char));
if(result == NULL)
{
cout << "內存分配失敗"<<endl ;
exit(-1);
}
//清空result
for(int m = 0 ;m < len1+len2; m++)
{
result[m] = '0' ;
}
result[m] = '\0' ;
c = num1[0];
d = num2[0];
if(c == '-' && d != '-')
{
strcpy(num2,AddFlag(num2));
strcpy (result,(add(num1,num2))); //調用 加法 并在結果加負號
return result;
}
if(c != '-' && d == '-')
{
DelFlag(num2);
strcpy (result,add(num1,num2)); //變為加
return result;
}
if(c == '-' && d == '-')
{
DelFlag(num2);
return (add(num2,num1));//遞歸調用,num2 - num1 為結果
}
else
{
if(cmp(num1,num2) < 0)
{
flag = 0xff;
p = num1;
num1 = num2;
num2 = p;
mid = len1;
len1 = len2 ;
len2 = mid;
}
int i;
for(i=0; i<len2; ++i)
{
mid = num1[len1-i-1] - num2[len2-i-1] - carry;
if(mid < 0)
{
carry = 1;
mid = mid + 10;
}
else
{
carry = 0;
}
result[i] = mid + '0';
hc = mid + '0';
}
for (i=len2; i<len1; ++i)
{
mid = num1[len1-i-1] - '0' - carry;
if(mid < 0)
{
carry = 1;
mid += 10;
}
else
{
carry = 0;
}
result[i] = '0' + mid;
hc = '0' + mid;
}
int temp ;
result[i] = '\0';
temp = i-1;
while(result[temp] == '0' && temp != 0)
{
result[temp] = '\0';
temp--;
}
for(i=0; i<(temp+1)/2; ++i)
{
hc = result[i];
result[i] = result[temp-i];
result[temp-i] = hc;
}
}
int len = strlen(result) ;
if(len > 200)
{
strcpy(result,"Too Large Number.");
return result;
}
else
{
if(flag == 0xff)
{
strcpy(result,AddFlag(result));
}
return result;
}
}
///////////////整除///////////////////char *div(char *num1,char *num2)
{
char *result;
char *remain;
int len1;
int len2;
len1 = strlen(num1);
len2 = strlen(num2);
char c,d;//暫存符號
result = (char*)malloc((len1+len2)*sizeof(char));
if(result == NULL)
{
cout << "內存分配失敗 "<<endl;
exit(-1);
}
for(int m = 0 ;m < len1+len2; m++)
{
result[m] = '\0' ;
}
remain = (char*)malloc((len1+len2)*sizeof(char));
if(remain == NULL)
{
cout << "內存分配失敗 "<<endl;
exit(-1);
}
for(m = 0 ;m < len1+len2; m++)
{
remain[m] = '\0' ;
}
c = num1[0];
d = num2[0];
if(d != '-')
{
clearZero(num2);
if(num2[0] == '0') //判斷除數 0
{
strcpy(result,"Divide By Zero.");
free(remain);
return result;
}
}
if(d == '-')
{
DelFlag(num2);
if(num2[0] == '0')
{
strcpy(result,"Divide By Zero.");
free(remain);
return result;
}
}
if(c == '-')
{
DelFlag(num1);
}
int i ;
int temp;
int remainlength ;
if(cmp(num1,num2) < 0)
{
strcpy(result,"0");
free(remain);
return result;
}
for(i=0; i < len1; ++i)
{
clearZero(remain);
remainlength = strlen(remain);
remain[remainlength] = num1[i];
remain[remainlength +1 ] = '\0';
temp = 0;
clearZero(num2);
clearZero(remain);
while(cmp(remain,num2) >= 0)
{
if(remain[0] == '-')
{
break;
}
strcpy(remain,sub(remain, num2));
++temp;
}
result[i] = temp + '0';
}
clearZero(result);
int len;
if((c == '-'&& d != '-') || (c != '-' && d == '-'))
{
strcpy(result,AddFlag(result));
free(remain);
len = strlen(result);
if(len > 200)
{
strcpy(result,"Too Large Number.");
return result;
}
else
{
return result;
}
}
else
{
free(remain);
if(len > 200)
{
strcpy(result,"Too Large Number.");
return result;
}
else
{
return result;
}
}
}
//比較兩字串 大小
int cmp(char *r,char *t)
{
int lenr;
int lent;
lenr = strlen(r);
lent = strlen(t);
if(lenr > lent )
{
return 1;
}
else if(lenr < lent)
{
return -1;
}
else
{
return (strcmp(r,t));
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -