高精度数求和,求积
【题目描述】
求两个不超过100位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
void PrecisionSum()
{
char num1[100]=""; /*输入精度小于100位*/
char num2[100]="";
char sum[100]="";
scanf("%s%s",&num1,&num2);
int len1=strlen(num1);
int len2=strlen(num2);
char tmp=0; //储存向高位进的数
int k=len1>len2?len1:len2;
int lenth=k+1; //保存输出数组的总长度
//计算
for(int i=len1-1,j=len2-1; i>=0||j>=0 ; i--,j--)
{
//统一转化为ascall计算
if(num1[i]!=0 && i>=0) num1[i]-='0';
if(num2[j]!=0 && j>=0) num2[j]-='0';
sum[k]=tmp; //加上低位满10后进的数
if(i>=0) //若:数组1没有遍历完
{
sum[k]+=num1[i];
}
if(j>=0) //若:数组2没有遍历完
{
sum[k]+=num2[j];
}
tmp=sum[k]/10; //是否有进位
sum[k]%=10; //十进制每一位均小于10
--k;
}
sum[k]+=tmp;
//首位不为0
if (sum[0] == 0)
{
for (int i=0; i<lenth-1; i++)
{
sum[i] = sum[i+1] + '0';
}
sum[lenth-1] = 0;
}
else
{
for (int i=0; i<lenth; i++)
{
sum[i] += '0';
}
}
puts(sum);
}
直接调用即可,可以修改首行的数组大小修改精度
【题目描述】
输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。
【输入】
输入两个高精度正整数M和N。
【输出】
求这两个高精度数的积。
void PrecisionMul()//没有释放
{
char num1[100]="";
char num2[100]="";
char mul[200]=""; //乘积位数小于两个因数位数之和
scanf("%s%s",&num1,&num2);
if (num1[0] == '0' || num2[0] == '0')
{
putchar('0');
}
int len1 = strlen(num1);
int len2 = strlen(num2);
int len = len1+len2;
//char *mul = (char*)malloc(sizeof(char)*(len+1));
///memset(mul, 0, sizeof(char)*(len+1));
for (int i=0; i<len1; i++)
{
for (int j=0; j<len2; j++)
{
//len1数组循环遍历len2数组做乘积
int x = (num1[i]-'0') * (num2[j]-'0');
//len1-i-1表示数组len1当前下标,len2-j-1表示数组len2当前下标,p表示乘积下标相同的元素
//下标和相同的数最终会相加到一起
/**********************************************************************
i0 i1 i2
* j0 ji j2
---------------------------
j2i0 j2i1 j2i2
j1i0 j1i1 j1i2
j0i0 j0i1 j0i2
---------------------------
ji(0)ji(1)ji(2)ji(3)ji(4)
乘法有如上规律,则可通过乘机项的下标分类计算
****************************************************************************/
int p = len-1 - (len1-i-1) - (len2-j-1);
mul[p] += x % 10;
mul[p-1] += x / 10;
while (p>0 && mul[p] >= 10)
{
mul[p-1] += mul[p] / 10;
mul[p] %= 10;
p--;
}
}
}
//进位取余
for (int i=len-1; i>0; i--)
{
if (mul[i] >= 10)
{
mul[i-1] += mul[i] / 10;
mul[i] %= 10;
}
}
//消首位的0
if (mul[0] == 0)
{
for (int i=0; i<len-1; i++) mul[i] = mul[i+1] + '0';
mul[len-1] = 0;
}
else
{
for (int i=0; i<len; i++) mul[i] += '0';
}
puts(mul);
}