扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
要实现超长整数的加法运算,可以使用字符串来存储这些数,然后按位进行加法运算。下面是使用C语言实现超长整数加法的示例代码:
站在用户的角度思考问题,与客户深入沟通,找到饶平网站设计与饶平网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站建设、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广、国际域名空间、雅安服务器托管、企业邮箱。业务覆盖饶平地区。
c
#include stdio.h
#include string.h
#define MAX_LEN 100000
void reverse(char *str) {
int i, j;
char temp;
for (i = 0, j = strlen(str) - 1; i j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
void add(char *num1, char *num2, char *result) {
int carry = 0;
int i = 0;
int len1 = strlen(num1);
int len2 = strlen(num2);
reverse(num1);
reverse(num2);
while (i len1 || i len2 || carry != 0) {
int n1 = (i len1) ? (num1[i] - '0') : 0;
int n2 = (i len2) ? (num2[i] - '0') : 0;
int sum = n1 + n2 + carry;
result[i] = (sum % 10) + '0';
carry = sum / 10;
i++;
}
result[i] = '\0';
reverse(result);
}
int main() {
char num1[MAX_LEN], num2[MAX_LEN], result[MAX_LEN];
printf("请输入第一个整数:");
scanf("%s", num1);
printf("请输入第二个整数:");
scanf("%s", num2);
add(num1, num2, result);
printf("两个整数的和为:%s\n", result);
return 0;
}
在上面的代码中,reverse函数用于将一个字符串反转。add函数用于将两个字符串表示的超长整数相加,结果存储在result字符串中。在add函数中,我们首先将两个字符串反转,然后按位进行加法运算,将结果存储在result字符串中。最后,我们将result字符串再次反转,以得到正确的结果。
需要注意的是,在进行加法运算时,需要考虑到进位的情况。当两个数的位数不同时,需要在较短的数前面补0,以便按位相加。
要实现任意大小两个整数相加,那么就不能存在溢出情况。所以无法使用任何系统类型,唯一的方式是用数组模拟整数存储,并自行实现加法操作算法。
需要注意以下几点:
1 大数如何存储及输出;
2 计算时进位的处理;
3 两个计算数长度不同时的处理;
4 当达到最高位仍有进位的处理,即结果的长度大于任意一个操作数。
以下是一个比较简单的代码:
#include stdio.h
#include stdlib.h
char s[101];
int sum[101];
int main()
{
int i, j;
while (gets(s), strcmp(s, "0")) {//巧妙化解开多少个数组 算多少个数的和的局面
j=strlen(s);
for (i=j-1; i=0; --i) {
sum[j-i-1]+=(s[i]-'0');//s[i]-'0'表示字符数字转化成int数字 倒序加到sum中 sum第一个数是s的最后一个数的和
}
}
j=101; while(!sum[j])--j; //重新赋值j 使j为目前sum的总位数
for (i=0;ij;++i) { //如果s[i]加成两位数 将十位数加给前一位数
sum[i+1]+=sum[i]/10;
sum[i]=sum[i]%10;
}
for (i=j; i=0; --i) {
printf("%d", sum[i]);
}
}
这个问题你可以写两个小函数来实现 , 一个是atoi()函数,就是把字符串转化成int型,另一个是itoa(),就是把int型的数字转化成字符串。刚开始时用atoi()把str1,str2转化成整形数,然后相加,再把相加后的结果用itoa()函数转化成字符串,再赋值给result。这是个思路,那两个函数也不太难,自己尝试实现一下。
#include string.h
#include stdio.h
#include stdlib.h
#define N 100
int main(int argc, char const *argv[])
{
char arr[N] = {};
gets(arr);
char brr[N] = {};
gets(brr);
int len1,len2,i = 0,j = 0;
len1 = strlen(arr);
len2 = strlen(brr);
int len = len1len2?len1:len2;
/* c99之后数组初始化支持整型表达式,称为可变长数组,但按照c89的标准是不对的
int num1[len]; //将字符串转换成翻转的整型数组
int num2[len];
*/
int* num1 = (int*)malloc(len*sizeof(int));
int* num2 = (int*)malloc(len*sizeof(int));
for (i = 0; i len; i++)
{
num1[i] = ilen1 ? arr[len1-i-1]-'0':0;
}
for (j = 0; j len; j++)
{
num2[j] = jlen2 ? brr[len2-j-1]-'0':0;
}
//int sum[len]; //定义和数组
int* sum = (int*)malloc(len*sizeof(int));
int flag=0; //设进位符
for (i = 0; i len; i++)
{
sum[len-1-i] = (num1[i]+num2[i]+flag)%10;
flag = (num1[i]+num2[i]+flag)/10;
}
if (flag == 1) printf("1"); //如果最高位有进位 则输出一个1
for (i = 0; i len; i++)
{
printf("%d",sum[i]);
}
printf("\n");
free(num1);
free(num2);
free(sum);
num1 = NULL;
num2 = NULL;
sum = NULL;
return 0;
}
扩展资料:
gets()函数用法
gets是从标准输入设备读字符串函数。
函数原型:char*gets(char*str);
功能为:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
注意:不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。使用时需要包含stdio.h头文件
参数
str为字符串指针,用来存放读取到的数据。
返回值
读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流