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

本文深入讲解大数加法和乘法的实现原理,通过C语言和Python代码详细演示如何处理超出常规整型范围的数学运算,包括字符串转换、逐位计算、进位处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,大数的加法
大数题目链接
题目思路:
1,以字符串的形式读取
2,将字符串倒着转化为数字
3,逐位计算这些数字,对进位要考虑清楚,在哪里进,以及超过9怎么办
4,倒着输出这些处理了的数字,排除0008+2=0010,这种情况。

#include<stdio.h>
#include<string.h>
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<stdio.h>
#include<string.h>
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<len2,用于控制循环
  if(len1>=len2)
  {
   int  temp=len1;
   len1=len2;
   len2=temp;
   p=&a[0];
   q=&b[0];
  }
  else //len1<len2;
  {
   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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值