超大型数据加减法问题
背景:计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。
你现在接受了一个任务,要编写一个高精度计算器的核心部分。所谓高精度计算器,就是可以计算很大很大的数据的计算器。
输入:
输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。
输出:
对应着输入的每一行数据,输出计算的结果,每个结果占一行。
用例1:
输入:
2(回车)
213914+23466123(回车)
32862934-23481243(回车)
输出:
23680037(回车)
9381691(回车)
用例2:
输入:
3(回车)
483291674192731231+1236187236812735123(回车)
123129678463287562378-28935687264871236(回车)
999999999+1(回车)
输出:
1719478911005466354(回车)
123100742776022691142(回车)
1000000000(回车)
感谢各位大佬!!!!!!! 题目也没有说不能调用库函数,所以这里我就调用库函数算了
#include <stdio.h>
#include <mpfr.h>
#include <ctype.h>
void output(void) {
char buff; fgets(buff, 8192, stdin);
mpfr_t a, b, c;
char *op = NULL;
mpfr_inits2(8192, a, b, c, NULL);
for(size_t i = 0; buff; ++i) {
if(!isdigit(buff)) {
op = &buff;
break;
}
}
mpfr_strtofr(a, buff, &op, 10, MPFR_RNDD);
mpfr_set_str(b, op + 1, 10, MPFR_RNDD);
if(*op == '-') mpfr_neg(b, b, MPFR_RNDD);
mpfr_add(c, a, b, MPFR_RNDD);
mpfr_printf("%.0Rf\n", c);
mpfr_clears(a, b, c, NULL);
mpfr_free_cache();
}
int main(void) {
size_t count; scanf("%lu", &count);
getchar();
for(size_t i = 0; i < count; ++i) {
output();
}
return 0;
}
人造人 发表于 2021-11-8 22:47
题目也没有说不能调用库函数,所以这里我就调用库函数算了
不允许调用库函数{:5_96:} 宸宸城堡 发表于 2021-11-9 11:33
不允许调用库函数
为什么? 要不去参考一下Python底层对超长整型的实现? 本帖最后由 jhq999 于 2021-11-9 16:59 编辑
我这个思路,不知道有多少BUG{:5_103:} ,目前知道一个,就是减法时数位相同前面小于后面,我懒得调换了。
int DivStr(char* inch,char* valch1,char* valch2,char *sg);
int Bigoperation(char* valch1,char* valch2,char sg,char* valch3);
int main()
{
char invalch={0},valch={0},sg=0;
int i=0,j=0,sgd=0;
scanf("%s",invalch);
if(!(sgd=DivStr(invalch,valch,valch,&sg)))return 0;
if(sgd)
{
if (-1==sgd)
{
if(Bigoperation(valch,valch,sg,valch))
{
if('-'==sg)printf("-");
while (valch[++i]);
for (; i>=0; i--)
{
printf("%c",valch);
}
}
}
else if (1==sgd)
{
if(Bigoperation(valch,valch,sg,valch))
{
while (valch[++i]);
for (; i>=0; i--)
{
printf("%c",valch);
}
}
}
}
return 0;
}
int Bigoperation(char* valch1,char* valch2,char sg,char* valch3)
{
int i=0,j=0,k=0;
if ('+'==sg)
{
for (i = 0,j=0;valch1||valch2; i++,j++)
{
if ('\0'==valch1)
{
i--;
}
if ('\0'==valch2)
{
j--;
}
if (i==j)
{
valch3+=valch1+valch2-'0';
}
else if (i>j)
{
valch3+=valch1;
}
else
{
valch3+=valch2;
}
int k=i;
if (k<j)k=j;
if (valch3>'9')
{
valch3-=0xa;
valch3++;
}
}
i=i>j?i:j;
while(valch3)i++;
i--;
if (valch3>'9')
{
valch3-=0xa;
}
else if(valch3<'0')
{
valch3+='0';
}
return 1;
}
if ('-'==sg)
{
for (i = 0,j=0;valch1||valch2; i++,j++)
{
if ('\0'==valch1)
{
i--;
}
if ('\0'==valch2)
{
j--;
}
if (i==j)
{
valch3+=valch1-valch2+'0';
}
else if (i>j)
{
valch3+=valch1;
}
else
{
valch3+=valch2;
}
k=i;
if (k<j)k=j;
if (valch3<'0')
{
valch3=0x3a-'0'+valch3;
valch3--;
}
}
if (valch3=='0')
{
valch3='\0';
}
return 1;
}
return 0;
}
int DivStr(char* inch,char* valch1,char* valch2,char *sg)
{
int i=0,j=0,sgd=1;
while ('+'!=inch&&'-'!=inch)j++;
for (i = 0; i < j; i++)
{
valch1=inch;
if ('0'>inch||'9'<inch)
{
return 0;
}
}
*sg=inch;
sgd=i;
inch='\0';
j=i+1;
while (inch)j++;
if ((sgd-1)<(j-sgd))sgd=-1;//就是这里
else
sgd=1;
for (i=0,j--; inch; j--,i++)
{
valch2=inch;
if ('0'>inch||'9'<inch)
{
return 0;
}
}
return sgd;
}
页:
[1]