1、加法运算
1、首先将两个很大的数放入字符数组a,b中,然后将大数的每个数倒着放入s1和s2中,例如a中是1234,则s1[1]=4,s1[2]=3,s1[3]=2,s1[4]=1。然后判断哪个数更大,然后加完得到的值放在s3中;加的方法为:先从低位开始加,如果值大于10,则后一位为这一位除以10;则这一位的值为自己对10取余;依次循环。然后判断s3值的最后一位是否为0,并且长度要大于0,要是为0的话就忘前挪一位来去掉前面的0;例如:1234+9111,1+9要往前进一位,len3不用减;1234+22,结果为1256,但在s3中为65210,要去掉0。最后反向输出答案即可。
#include<stdio.h>
#include<string.h>
int main(){
char a[1000],b[1000];
int s1[1000],s2[1000],s3[1000];
scanf("%s",a);
scanf("%s",b);
int len1,len2,len3;
int i,j;
len1=strlen(a);
for(i=0;i<len1;i++)
s1[len1-i]=a[i]-'0';
len2=strlen(b);
s2[len2-j]=b[j]-'0';
int max=len1;
if(max<len2) max=len2;
len3=max+1;
for(i=1;i<len3;i++){
s3[i]+=s1[i]+s2[i];
s3[i+1]=s3[i]/10;
s3[i]=s3[i]%10;
}
while(s3[len3]==0&&len3>0) len3--;
for(j=len3;j>0;j--) printf("%d",s3[j]);
return 0;
}
2、减法运算
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
char s1[1000],s2[1000],s3[1000];
int a[1000]={0},b[1000]={0},c[1000]={0};
int flag=0;
int i,j;
bool exange(char s1[],char s2[],int len1,int len2)//判断s1和s2的大小
{ if(len1!=len2) return len1>len2;//len1大于len2输出true,反之输出false
int i;
for(i=0;i<len1;i++){
if(s1[i]!=s2[i])
return s1[i]>s2[i];
}
return true;//len1=len2,输出true
}
int main(){
int len1,len2,len3;
scanf("%s %s",s1,s2);
len1=strlen(s1),len2=strlen(s2);
if(!exange(s1,s2,len1,len2)){//s1小于s2执行
flag=1;//标志位
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}
for(i=0;i<len1;i++)
a[len1-i]=s1[i]-'0';
for(j=0;j<len2;j++)
b[len2-j]=s2[j]-'0';
len3=len1;
if(len3<len2) len3=len2;
for(i=1;i<=len3;i++){
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
while(c[len3]==0&&len3>0) len3--;
if(flag==1) printf("-");
int k;
for(k=len3;k>0;k--)
printf("%d",c[k]);
return 0;
}
1、减法的主要思想是:先判断能否减过,例如342-77,2-7向前借一,12-7=5,所以c【i+1】先减1,然后c【i】自加10,在进行减法。
2、还要考虑负数的情况;用布尔函数进行判断,如果两个数位数不同,s1大于s2则返回true,反之返回false,若位数相同,则一位一位判断,同理s1大于s2则返回true,反之返回false,若相同最后返回true。
3、调用布尔函数判断时取非,即s1小于s2是执行下面的指令:用strcpy函数交换。
4、然后将字符数组转置成整形数组,最后进行相减。
5、最后一步一样,删除前面的0。结束!
3、乘法运算
1、主要思想:(b站麦克老师)
#include<stdio.h>
#include<string.h>
int main(){
char s1[1000],s2[1000];
int a[1000],b[1000],c[1000];
scanf("%s %s",s1,s2);
int len1,len2,len3;
len1=strlen(s1),len2=strlen(s2);
int i,j;
len3=len1+len2;
for(i=0;i<len1;i++) a[len1-i]=s1[i]-'0';//转置数组
for(j=0;j<len2;j++) b[len2-j]=s2[j]-'0';
for(i=1;i<=len1;i++){
for(j=1;j<=len2;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
if(c[len3]==0&&len3>0) len3--;
for(i=len3;i>0;i--) printf("%d",c[i]);
return 0;
}
4、除法运算
1、高精度除低精度
方法:逐位试商法
#include<stdio.h>
#include<string.h>
int main(){
char s1[1000];
long a[1000],b,x,c[1000];
scanf("%s",s1);
scanf("%d",&b);
int len1,len4;
len1=strlen(s1);
int i;
for(i=1;i<=len1;i++) a[i]=s1[i-1]-'0';
for(i=1;i<=len1;++i){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
len4=1;
while(c[len4]==0&&len4<len1) len4++;
for(i=len4;i<=len1;i++) printf("%d",c[i]);
return 0;
}
主要思想:4312除以12,用每一项去除12,4除12=0,然后4*10+3除12,余7,然后7*10+1=71再去除12,依次类推即可。
注意:这里转置数组时不需要倒置。
2、高精度除高精度
方法:减法类比法
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
void add_0(char b[],int tmp,int len2){
int j;
for(j=0;j<tmp;j++){
b[len2+j]=0;
}
}
bool vs(char b[],char a[]){
int bl=strlen(b);
int al=strlen(a);
if(al!=bl) return al>bl;
int i;
for(i=0;i<al;i++){
if(a[i]!=b[i]) return a[i]>b[i];
}
return true;
}
//高精度减法
void subt(char s1[],char s2[]){
int u=strlen(s1),v=strlen(s2);
int a[1000],b[1000],c[1000];
int i,max;
for(i=0;i<u;i++) a[u-i]=s1[i]-'0';
for(i=0;i<v;i++) b[v-i]=s2[i]-'0';
max=u;
if(max<v) max=v;
for(i=1;i<=max;i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
s1[i]=c[i];
}
while(s1[max]==0&&max>0) max--;
}
int main(){
char s1[1000],s2[1000];
int len1,len2,len3,c[1000];
scanf("%s %s",s1,s2);
len1=strlen(s1),len2=strlen(s2);
int i,j,tmp;
len3=len1-len2+1;
for(i=len3;i>=1;i--){
tmp=--i;
add_0(s2,tmp,len2);
while(vs(s2,s1)){
c[i]++;
//高精度减法
subt(s1,s2);
}
}
for(i=1;i<=len3;i++) printf("%d",c[i]);
return 0;
}
这个代码我暂时还没弄懂,大家可以帮我看一下。