acm集训队选拔——大数加法和乘法

一,大数的加法
大数题目链接
题目思路:
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

你可能感兴趣的:(大数)