实数的大数乘法 就多一个定位小数点 输出的时候不输出前导和后导零 所以大数乘法模版很重要
下面直接上代码
#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]='\0'; 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]='\0'; } 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%d\n",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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。