您的位置:首页 > 其它

大数相乘

2012-12-12 12:15 330 查看
昨晚闲着无聊,试着写下大数相乘,看看初起到时候问题多多,不过整体思路还是对的我想法是用字符数组处理,有两个字符数组,用一个字符数组的每个元素分别和另一个数组的每个元素相乘,把他们的乘积保存在另一个数组中,当然其中也是有点小技巧的,最开始的源码如下:
#include<string.h>
#include<stdio.h>
int crr[10001]={0};
void main()
{
int fun(char arr[],char brr[]);
int remc(char *a);
int jcmwl(int k);
int k,a,b,l;//l为零的个数,a,b小数点的位数,k数的位数
char arr[1001],brr[1001];
scanf("%s %s",arr,brr);
a=remc(arr);
b=remc(brr);
printf("The result is:\n");
if(a==-1 || b==-1)
printf("Input is incorrect, please enter again!\n");

else{
k=fun(arr,brr);
if(a==0 && b==0){
for(k=k-1;k>=0;k--)
printf("%d",crr[k]);
printf("\n");
}
else if(a==0 && b!=0){
l=jcmwl(k);
for(k=k-1-l;k>=0;k--){//结果的位数-零的位数=实际的位数
if(k==b-1-l)//判断下点'.'的位置(k=多少说明后面还有多少位数,此时如果等于小数位数,就输出 '.')
printf(".");
printf("%d",crr[k]);
}
printf("\n");
}
else if(b==0 && a!=0){
l=jcmwl(k);
for(k=k-1-l;k>=0;k--){
if(k==a-1-l)
printf(".");
printf("%d",crr[k]);
}
printf("\n");
}
else{
l=jcmwl(k);
for(k=k-1-l;k>=0;k--){
if(k==(a+b-1-l))
printf(".");
printf("%d",crr[k]);
}
printf("\n");
}
}
}
int remc(char *a)//找出'.'的位置 ,重定义数组,返回小数点后面的位数
{
int l_a,i,j;
l_a=strlen(a);
for(i=0;i<l_a;i++){
if(a[i]<46 ||(a[i]>46 && a[i]<48 ) || a[i]>57)//检查是否输入的是数字
return -1;
if(a[i]=='.'){
for(j=i;j<l_a;j++){
if(a[j+1]=='.')//检查是否出现重复'.'
return -1;
a[j]=a[j+1];
}
return l_a-i-1;
}
}
return 0;
}
int fun(char arr[],char brr[])//计算,返回数的位数
{
int i,j,k=0,len_a,len_b,n=0,rem;
len_a=strlen(arr);len_b=strlen(brr);
for(i=len_a-1;i>=0;i--){
k=n++;
rem=0;
for(j=len_b-1;j>=0;j--){
rem=crr[k]+rem+(brr[j]-'0')*(arr[i]-'0');
crr[k]=rem%10;
k++;
rem/=10;
}
if(rem>0){
crr[k++]=rem;
}
}
return k;
}
int jcmwl(int k)//检查小数点末尾无效的零,并去掉,返回去掉零的个数
{
int i,m=0;
while(!crr[0]){
for(i=0;i<k-m-1;i++){
crr[i]=crr[i+1];
}
m++;
}
if(m!=0)
crr[i]='\0';
return m;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: