关于C语言的一道题目C中的long int所能表示的数据范围有限,现要求编程完成超过long int所能表示的数据范围以上(如32位以上)的十进制正的长整数的C语言;提示:两个参与运算的长整数可用
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/27 12:41:09
关于C语言的一道题目C中的long int所能表示的数据范围有限,现要求编程完成超过long int所能表示的数据范围以上(如32位以上)的十进制正的长整数的C语言;提示:两个参与运算的长整数可用
关于C语言的一道题目
C中的long int所能表示的数据范围有限,现要求编程完成超过long int所能表示的数据范围以上(如32位以上)的十进制正的长整数的C语言;
提示:两个参与运算的长整数可用char a[256],b[256]表示,整个程序中要求完成以下几个函数的编写:
1) int readlongint(char * x); 此函数用于读入一个正的长整数到x中,函数返回长整数的实际长度;要求输入时检查所读入的字符串是否是合法的长整数,如不是提示用户直到输入合法的长整数为止;
2) char *addition(char *x,char *y); 此函数用于实现用字符串表示的长整数的加法运算,其计算结果保存在一个动态申请的字符数组空间(其长度为参与加法运算的两个长整数中较长的一个的长度加1)中,函数返回该数组的指针.
3) char *multiplacation(char * x,char *y);此函数用于实现用字符串表示的两个长整数的乘法运算,可考虑先将乘数的从个位到最高位的每一位与被乘数相乘(这一步可利用addition函数实现),再进行向左偏移后相加完成;
注意此程序设计最关键的问题是对字符数组的下标定位和动态申请恰当的内存空间以保存计算结果,注意在乘法运算中回收不再使用的内存空间.
关于C语言的一道题目C中的long int所能表示的数据范围有限,现要求编程完成超过long int所能表示的数据范围以上(如32位以上)的十进制正的长整数的C语言;提示:两个参与运算的长整数可用
#include
#include
#include
#define IN const
#define OUT
char* del_zero(char* r)
{
int i;
if(r[0] == '0') {
for(i = 0; r[i] != '\0'; i++)
r[i] = r[i + 1];
r[i] = '\0';
}
return r;
}
int readlongint(OUT char* x)
{
int length;
char c = getchar();
x[0] = '0'; x[1] = '\0'; /*变x为"0"*/
for(length = 1; c != '\n' && c != EOF; length++) {
if(c < '0' || c > '9')
break;
x[length - 1] = c;
c = getchar();
}
x[length > 1 length - 1 :1] = '\0';
while(c != '\n' && c != EOF)
c = getchar(); /*缓冲区清空*/
return length;
}
char* addition(IN char* x,IN char* y)
{
int x_len = strlen(x),y_len = strlen(y);
int r_len = (x_len > y_len x_len :y_len) + 1; /*添加最高位*/
char* r = (char *)malloc(r_len + 1); /*添加空字符*/
int carry = 0; /*进位*/
int i;/*十进制位*/
if(!r) return NULL;
for(i = 1; i x_len '0' :x[x_len - i],
num_y = i > y_len '0' :y[y_len - i];
r[r_len - i] = num_x + num_y + carry;
r[r_len - i] -= '0';
if(r[r_len - i] > '9') {
r[r_len - i] -= 10;
carry = 1;
}
else
carry = 0;
}
r[r_len] = '\0';
return del_zero(r);
}
char* multiplacation(IN char* x,IN char* y)
{
int x_len = strlen(x),y_len = strlen(y);
int r_len = x_len + y_len;
char* r = (char*)malloc(r_len + 1),* final_r; /*添加空字符*/
int i,carry = 0; /*十进制位,进位*/
/*y的首位与x相乘*/
for(i = 1; i x_len 0 :(x[x_len - i] - '0');
r[r_len - i] = num_x * (y[0] - '0') + carry;
if(r[r_len - i] > 9) {
carry = (int)r[r_len - i] / (int)10;
r[r_len - i] -= carry * 10;
}
else
carry = 0;
r[r_len - i] += '0';
}
r[r_len] = '\0';
if(y_len == 1)
return del_zero(r); /*检查是否已经是最后一位*/
/*偏移*/
for(i = 0; i < r_len; i++)
r[i] = (i + y_len - 1 >= r_len)
'0' :r[i + y_len - 1];
final_r = addition(r,multiplacation(x,y + 1)); /*递归乘法*/
free(r);
return del_zero(final_r);
}
int main()
{
char num1[100],
num2[100];
char* sum,*mul;
readlongint(num1);
readlongint(num2);
sum = addition(num1,num2);
mul = multiplacation(num1,num2);
putchar('\n');
printf("%s + %s = %s\n",num1,num2,sum);
printf("%s x %s = %s\n",num1,num2,mul);
free(sum);
free(mul);
return 0;
}
总共114行代码,也不是很复杂.有问题,或者发现BUG,在评论里继续问,不要紧的