用C语言处理长整数的计算
长整数的计算假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,实际的长整数m表示为:m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]其中a[0]保存该长整数的位数。完成:长整数乘普通整数。#include<stdio.h>#include<string.h>void CharToNum(int num[],char ar
·
长整数的计算
//声明:本人所作博客均为自己学习复习所用
题目:
假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,实际的长整数m表示为:m=a[k]×10k-1+a[k-1]×10k-2+….+a[2]×10+a[1]
其中a[0]保存该长整数的位数。完成:长整数乘普通整数。
#include<stdio.h>
#include<string.h>
void CharToNum(int num[],char arr[])
{
int i=0;
int len=strlen(arr);
num[0]=len;//num[0]储存位数
for(i=0;i<len;i++)
{
num[len-i]=arr[i]-'0';
}
}//将字符数组逆序储存在整型数组中,低位在前,高位在后
//个位数为num[1],十位数num[2] ……
void multiply(int a[],int b[],int c[],int maxlen)
{
int i=0,j=0;
for(i=1;i<=maxlen;i++)
{
for(j=1;j<=maxlen;j++)
{
c[i+j]+=a[i]*b[j];
}
}//将两个数组的每一位相乘,相加的结果保存到同一个位置
for(i=2;i<2*maxlen+1;i++)
{
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}//计算进位,数组中的每个元素大于10的向高位进一位
}
int main()
{
int i=0,j=0;
char longNuma[100],longNumb[100];
printf("请输入两个长整数:\n");
scanf("%s %s",&longNuma,&longNumb);
//输入两个长整数 ,用字符数组储存
int temp1=0,temp2=0;
if(longNuma[0]=='-')
{
temp1=1;
for(i=0;i<strlen(longNuma);i++)
{
longNuma[i]=longNuma[i+1];
}
}//判断longNuma中的数是否为负数,如果是则去掉负号,长度减一
if(longNumb[0]=='-')
{
temp2=1;
for(i=0;i<strlen(longNumb);i++)
{
longNumb[i]=longNumb[i+1];
}
}//判断longNumb中的数是否为负数,如果是则去掉负号,长度减一
int maxlen=strlen(longNuma)>strlen(longNumb)?strlen(longNuma):strlen(longNumb);
//求出两个字符数组中的最大长度
int a[110]={0};
int b[110]={0};
CharToNum(a,longNuma);
CharToNum(b,longNumb);
//将字符转化成整数 并逆序储存
int res[201]={0};
multiply(a,b,res,maxlen);//对两个整数进行相乘 得到逆序的结果
printf("长整数乘积为:") ;
if(temp1==1&&temp2==0||temp1==0&&temp2==1)
{
printf("-");
}//若两个数异号则加负号
int flag=1;
for(i=2*maxlen+1;i>=2;i--)
{
if(res[i]==0&&flag==1)
{
continue;
}
printf("%d",res[i]);
flag=0;
}//将逆序的元素正序,同时把正序后首位的0去掉
printf("\n");
return 0;
}
更多推荐


所有评论(0)