算法提高 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;
}
输入:
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;
}
相关文章推荐
- 算法提高 P1001 (大数乘法)
- 蓝桥杯 ADV-197 算法提高 P1001
- 算法-蓝桥杯-算法提高 P1001(JAVA)
- 蓝桥杯 ADV-197 算法提高 P1001
- 算法提高 P1001(模拟)
- 算法提高 P1001
- 算法提高 P1001
- 算法提高 P1001
- 算法提高 P1001
- 算法提高P1001
- 算法提高 P1001
- 算法提高 ADV-197 P1001
- 2016蓝桥杯算法提高——P1001(大数乘法)
- 算法笔记_097:蓝桥杯练习 算法提高 P1001(Java)
- 算法提高 P1001
- 算法提高 P1001
- 算法提高 P1001
- 算法提高 P1001(Java解题)
- 算法提高 P1001 (大数相乘)
- 算法提高 最小乘积(提高型)