POJ 1001(高精度乘法)
阿新 • • 發佈:2019-01-04
在POJ上,測試通過(因為我在CSDN中很多不能通過的,特別宣告)
一,首先,說說我的解題思路,就是模仿乘法的運算過程,再來用字串存結果;(這個不是很難);
二,這個題目對於我來說,難的是沒有考慮全面,
a, 第一次使用完變數,前面都要初始化,不然容易出現 rinning error;
b, 在設計演算法的時候,對資料沒考慮全面,比如,資料前面,和後面為零的無意義;題目要求去掉,我沒去掉;
c, 在對資料處理的時候,有可能會影響到後面的演算法,要做好事先處理或事後處理;
#include <iostream> #include <stdio.h> #include <cstring> #include <string> using namespace std; const int MAX = 500; char a[MAX]; char b[MAX]; char temp[MAX]; char result[MAX]; char str[8]="98.999"; int n = 10,point; bool pointEmpty(){ int i; for(i=0; i<strlen(str); i++) if(str[i] == '.') return true; return false; } void init(){ int i,j; char str2[8] = "0"; memset(a,0,MAX*sizeof(char)); memset(b,0,MAX*sizeof(char)); memset(result,0,MAX*sizeof(char)); memset(temp,0,MAX*sizeof(char)); int len = strlen(str); for(i=0; str[i] == 48; i++) ; for(j=0; j<len||i<len; j++){ str[j] = str[i++]; } if(str[0] == '.'){ strcat(str2, str); strcpy(str,str2); } if(pointEmpty()) for(i=strlen(str)-1; str[i]=='0'; i--) str[i] = '\0'; for(i=strlen(str)-1,j=0; i>=0; i--){ if(str[i]!='.'){ b[j] = str[i]; a[j++] = str[i]; }else{ point = strlen(str) - i - 1; } } point = point*n; } void fun(){ int i,j,h,k,v,z,x,y; if(n==1) { strcpy(result, a); return ; } if(n==0){ strcpy(result, "1"); return ; } while(--n){ for(i=0; i<strlen(a); i++){ z=0; h=0; for(j=0; j<strlen(b); j++){ z = (a[i]-48) * (b[j]-48) + z; v = z%10; z = z/10; temp[h++] = v+48; } if(z!=0) temp[h++] = z+48; temp[h] = '\0'; h=0;z=0; for(k=i; k<j || h<strlen(temp); h++,k++){ if(i==0){ result[k] = temp[h]; }else{ if(result[k] == 0) x=0; else x = result[k]-48; if(temp[h] == 0) y=0; else y = temp[h]-48; z = x + y + z; v = z%10; z = z/10; result[k] = v+48; } } if(z!=0) result[k++] = z+48; result[k] = '\0'; } strcpy(b, result); } } void solve(){ int count,i,j,k; char ch; init(); fun(); strcpy(temp, result); for(i=0,j=0; i<strlen(result); i++){ if(point == i && point!=0){ result[j++] = '.'; } result[j++] = temp[i]; } k = strlen(result); for(i=k-1; i>=k/2; i--){ ch = result[i]; result[i] = result[k-i-1]; result[k-i-1] = ch; } for(i=0; result[i] == 48; i++) ; int len = strlen(result); for(j=0; j<len||i<len; j++){ result[j] = result[i++]; } printf("%s\n",result); } int main() { while(cin>>str>>n){ solve(); } return 0; }