uva 748 - Exponentiation 带小数点的大数乘法
发布时间:2020-12-14 04:02:32 所属栏目:大数据 来源:网络整理
导读:实数的大数乘法 ? ? ?就多一个定位小数点 ? 输出的时候不输出前导和后导零 ? ?所以大数乘法模版很重要 下面直接上代码 #includecstdio#includecmath#includecstring#includealgorithmusing namespace std;int point;//小数点的最终位置int zero(char *l)//控
实数的大数乘法 ? ? ?就多一个定位小数点 ? 输出的时候不输出前导和后导零 ? ?所以大数乘法模版很重要 下面直接上代码 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int point;//小数点的最终位置 int zero(char *l)//控制后导零不输出 { int i; for(i = 0; l[i]=='0' ;i++); return i; } void print(char *p,int p_len) { char str[200],str_len = 0; for(int i = 0;i < p_len; i++) { if(i == point)str[str_len++] = '.';//补上小数点 str[str_len++] = p[i]; } int i = str_len-1; for(i = str_len-1; str[i] == '0'; i--);//加上这条输出时去掉前导零 for( ;i >= zero(str); i--) printf("%c",str[i]); printf("n"); } int re_order(char *p,int p_len,char *q)//逆序存储p到q中 { int q_len = 0; for(int i = p_len-1; i >= 0; i--) { if(p[i] == '.')continue;//去掉小数点 q[q_len++]=p[i]; } q[q_len]=' '; return q_len; } void multi(char *p,int p_len,int N) { char str[200]; int num[200],i,j,t; int str_len = p_len,sum; strcpy(str,p); for(t = 0; t < N-1; t++)//N个数相乘 { sum = 0; memset(num,sizeof(num));//这一定要初始化为零 要不容易Wrong的 for(i = 0; i < p_len; i++) for(j = 0; j < str_len; j++) num[i+j] += (p[i]-'0')*(str[j]-'0'); for(i = 0; i < p_len+str_len; i++) { sum += num[i]; str[i] = sum%10+'0'; sum /= 10; } str_len = i; str[i]=' '; } print(str,str_len); } int main() { #ifdef LOCAL freopen("in1.txt","r",stdin); #endif // LOCAL char str[10],s[10]; int N; while(scanf("%s%dn",str,&N)!=EOF) { int str_len = strlen(str); for(int i = 0; i < str_len; i++) if(str[i] == '.'){point = (str_len -i -1)*N;break;} int s_len = re_order(str,str_len,s); multi(s,s_len,N); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |