一,大数的加法
大数题目链接
题目思路:
1,以字符串的形式读取
2,将字符串倒着转化为数字
3,逐位计算这些数字,对进位要考虑清楚,在哪里进,以及超过9怎么办
4,倒着输出这些处理了的数字,排除0008+2=0010,这种情况。
#include
#include
int main()
{
int t,m;
scanf("%d",&t);
getchar();
char s1[1010],s2[1010];
int a[1010],b[1010];
int sum[1010];
int len1,len2;
int i,j,k;
int flag;
for(m=1;m<=t;m++)
{
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
flag=1;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
for(i=len1-1,k=0;i>=0;i--)
{
a[k++]=s1[i]-'0';
}
for(i=len2-1,k=0;i>=0;i--)
{
b[k++]=s2[i]-'0';
}
int temp,count;
for(i=0,count=0;i<len1||i<len2;i++)
{
temp=a[i]+b[i]+count;//进位很重要啊
sum[i]=temp%10;
count=temp/10;
}
printf("Case %d:\n",m);
printf("%s + %s = ",s1,s2);
flag=0;
for(k=i;k>=0;k--)
{
if(sum[k]!=0)//排除0008 +2=0010这样的情况,正确输出10,而不是0010
flag=1;
if(flag==1)
printf("%d",sum[k]);
}
if(flag==0)
printf("0");
printf("\n");
if(m!=t) printf("\n");
}
return 0;
}
二,大数乘法:
和大数加法的基础上改变了一些计算部分。
题目链接510nod大数乘法
在计算部分,三个变量控制乘法过程,长度小的在第一层循环,长度大的在第二个循环,注意计算部分的二重循环
#include
#include
int sum[10000020];
int main()
{
int t,m;
char s1[1010],s2[1010];
int a[1010],b[1010];
int len1,len2;
int i,j,k;
int flag;
for(m=1;m<=1;m++)
{
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
flag=1;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
for(i=len1-1,k=0;i>=0;i--)
{
a[k++]=s1[i]-'0';
}
for(i=len2-1,k=0;i>=0;i--)
{
b[k++]=s2[i]-'0';
}
//用指针的方式对数组进行选择。
int *p,*q;// p对应的数组长度大于或等于q对应的//len1
if(len1>=len2)
{
int temp=len1;
len1=len2;
len2=temp;
p=&a[0];
q=&b[0];
}
else //len1
{
p=&b[0];
q=&a[0];
}
int temp,count;
for(j=0;j<len1;j++)
{
for(k=0,i=j,count=0;k<len2;i++,k++)
{
temp=q[j]*p[k]+count+sum[i];
sum[i]=temp%10;
count=temp/10;
}
sum[i]+=count;//注意最后一位的count加上去。
}
flag=0;
i=len1*len2+1;//控制输出的长度
for(k=i;k>=0;k--)
{
if(sum[k]!=0)//过滤高位为0的情况。
flag=1;
if(flag==1)
printf("%d",sum[k]);
}
if(flag==0)
printf("0");
}
return 0;
}
三,大数乘法——python
题目链接
当a*b的乘积超过一定长度时,不能开数组
当然也有c语言方法,暂时没看
压位解决
python解决,好酷<. .>
a=int(input())
b=int(input())
print a*b