您的位置:首页 > 其它

算法提高 P1001

2017-01-23 16:39 316 查看
  当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

输入:
  62773417 12345678

输出:

  774980393241726

#include<stdio.h>
#include<string.h>
int main()
{
char str1[10],str2[10];
int len,i,j,k=0,flag=0,count1=0,count2=0,count=0;
int num1[10],num2[10];
int sum[20][20],temp[20];
scanf("%s%s",&str1,&str2);
len=strlen(str1);
while(--len>=0)
{
num1[++count1]=str1[len]-'0';
}
/* printf("第一个数字:\n");
for(i=1;i<=count1;i++)
{
printf("%d",num1[i]);
}
printf("\n");
*/ len=strlen(str2);
while(--len>=0)
{
num2[++count2]=str2[len]-'0';
}
/* printf("第二个数字:\n");
for(i=1;i<=count2;i++)
{
printf("%d",num2[i]);
}
printf("\n");
*/ memset(sum,0,sizeof(sum));
memset(temp,0

,sizeof(temp));
for(i=1;i<=count2;i++)
{
for(j=1;j<=count1;j++)
{
sum[i][j+k]=num2[i]*num1[j];
}
k++;
}
for(i=1;i<=count1+count2-1;i++)
{
for(j=1;j<=count2;j++)
{
temp[i]+=sum[j][i];
}
}
for(i=1;i<=count1+count2-1;i++)
{
if(temp[i]>9)
{
temp[i+1]+=(temp[i]/10);
temp[i]=temp[i]%10;
}
}
count=count1+count2-1;
if(temp[count1+count2]>0)
{
count++;
}
for(i=count;i>=1;i--)
{
if(temp[i]!=0 || flag!=0)
{
flag=1;
printf("%d",temp[i]);
}
}
if(flag==0)
{
printf("0");
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: