大正整数数相加以及相乘

本文介绍了一种使用C语言实现的大数加法和乘法的方法。通过字符串操作来处理任意精度的整数运算,包括处理进位逻辑、字符串长度比较等细节。

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

#include <stdio.h>
#include <string.h>
#include <memory.h>
//两大数相加,值存放第一个参数
void AddStr(char *_first,char *_second,int size)
{
if(!_first||!_second) return ;
int minLength,maxLength;
bool tag=false;
char *first,*second;
maxLength = strlen(_first)>=strlen(_second)?strlen(_first):strlen(_second); //记录两数组中最长的数组的长度
minLength = strlen(_first)<=strlen(_second)?strlen(_first):strlen(_second);//记录较小的长度
if(strlen(_first)>=strlen(_second))
{
first  = _first;//若数组_first比_second长度长,first指向长的数组
second = _second;//second指向较短数组
}
else
{
tag = true; //该标志为真,则是first指向_second(_second比_first长)
first  = _second;
second = _first;
}
int flag=0; //相加产生进位标志
for (int i = maxLength-1;i>=(maxLength-minLength);i--)
{
int data = (first[i]-'0')+(second[i-(maxLength-minLength)]-'0');//计算同一位的两个数相加的值
first[i] = (data + flag)%10+'0';  //记录余数
flag = (data + flag)/10; //记录进位
if (i==(maxLength-minLength)&&flag!=0)
{
for (int j =(maxLength-minLength)-1;j>=0;j--) //剩余高位进行判断是否产生进位,并且相加
{
if (first[j]-'0'+flag==10) 
{
first[j] = '0';
flag =1;
}
else
{
first[j]+=1;
flag = 0;
break;
}
}
if (flag!=0)
{
for (int k = maxLength;k>0;k--)first[k]=first[k-1];
first[0] = '1';
}
}
}
if (tag==true) strcpy(_first,first);
}
//大数相乘,值存放第一个参数
void MultiStr(char *ary,char *ard,int size)
{
int i,counts = strlen(ard),flag = 0;//进位标志
char record[1000];//记录被乘数
memset(record,0,1000);
strcpy(record,ary);//复制被乘数
for(i = counts-1;i>=0;i--)
{
int len = strlen(record)-1;     //从低位开始计算
char middle[1000];//用于记录被乘数 被 乘数 乘后的结果
memset(middle,0,1000);
if(i!=counts-1)
{
len+=1; //乘数往高位走时,被乘数补0(扩大十倍)
record[len]='0';
strcpy(middle,ary);//复制每一个乘数位乘以被乘数的结果
strcpy(ary,record);//将扩大后的被乘数的值复制到ary
}
for (int  j = len;j>=0;j--)
{
int  data = (ary[j]-'0')*(ard[i]-'0');//两个位相乘
ary[j] = (data + flag)%10+'0';//记录余数
flag = (data + flag)/10;//记录进位
if (j==0&&flag>0)
{
for (int k = len+1; k>0;k--) ary[k] = ary[k-1];//后移一位
ary[0] = flag+'0';
flag=0;
}
}
if(i!=counts-1) AddStr(ary,middle,size);//奖将上一次计算结果与本次计算结果相加,存放在ary(middle的值可能变动)
}
}
int main()
{
char ary[1001],ard[1001];
 while(1)
  {
memset(ary,0,1001);
memset(ard,0,1001);
printf("请输入相加的两个正整数A、B(两者之间空格):\n");
printf("A:");
scanf("%s",ary);
printf("B:");
scanf("%s",ard);
printf("\t%s + %s = ",ary,ard);
AddStr(ary,ard,1001);
printf("%s\n\n",ary);
memset(ary,0,1001);
memset(ard,0,1001);
printf("请输入相乘的两个正整数A、B(两者之间空格):\n");
printf("A:");
scanf("%s",ary);
printf("B:");
scanf("%s",ard);
printf("\t%s * %s = ",ary,ard);
MultiStr(ary,ard,1001);
printf("%s\n\n",ary);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值