C语言编程之大整数加法

这篇博客探讨了在C语言中如何处理大整数的加法运算。由于C语言的标准整数类型存在范围限制,作者建议使用字符数组来表示大整数,并通过字符到数值的转换进行运算。文章详细解释了字符运算的原理,包括ASCII码值的使用,以及如何处理字符相加的进位问题。最后,给出了针对多字符相加的解决方案,涉及字符串的翻转和遍历操作。

1. C语言整数运算

C语言的整数类型有:
int,short,long 三种,同时可以冠以unsigned,signed来标识无符号整数及有符号整数。
针对不同的环境,每种类型的长度不同,因此,在不同的机器上,虽然其表征的数值大小由差异,但都有一个区间,只有在此区间的数值,才能用相应的变量继续表示。

如果跨越该数值区间的数据,则系统无法进行运算。
如何在C语言中实现大数据的运算,则需要借助其他方法(数据类型)实现。

C语言的数据类型主要由两类:数值型、字符(串/数组)型。显然如果数值型不能进行处理,只能借助字符型类型进行处理。
在C语言中,单个字符采用char ,多个字符则须采用字符串进行处理,C语言中的字符串则是通过字符数组实现的。
为了便于说明,本例只就整数加法进行示例讲解。

2. 字符运算

char ch=’a’;
ch++; // 字符’a’ 的ascii码值加1,变为’b’的 ascii码
此时,字符变量ch中的字符为’b’;

char ch=’8’;
int val;
val=ch – ’0’; // 此时val的数值为8,字符’8’的ascii码值 - ’0’的ascii码值

int val=1;
char ch;
ch= val +’0’; // ch 的ASCII码值 = 1+’0’的ascii码值 =’1’的ascii码值
// 所以ch 为字符’1’

3. 解决方法

#include “stdio.h”
main()
{
   int ival=1234;
   char sval=1234;
printf(“val=%d\n”, ival);
printf(“val=%s\n”, sval);
}

上述代码,对于1234,采用两种数据类型进行表征,从数据显示而言,没有区别。
从数据展示及存储上,采用字符数组存放数值字符串是可行的,由于字符串没有基于数值的算术运算,因此我们只需要解决两个数字字符串的算术运算即可。

字符相加
针对两个字符’3’,’4’, 其数值对应加法 3+4 ==》7 ,因此我们需要构造’3’+’4’ ==》’7’ 即可
需要进行 :字符 ==》数值 ,数值相加 ,数值 ==》字符
步骤组合 :(字符 - ’0’ + 字符 - ’0’) + ’0’ ==》字符 ,
同时针对字符相加,需要考虑进位问题。

多字符相加
采用字符串表征整数数值,如何2个数值进行加法,则需要对相应的两个数值字符串进行位置对应的数值相加,生成和字符串。
对于字符串的操作,通常情况下,需要进行遍历,按照代码习惯,对于字符数组的遍历是从字符数组下标0开始,逐步递增,这对于标识数值的字符串,是从高位到低位,数值的加法是从低位到高位进行运算。为了符合数值运算规律,我们将数值字符串进行串翻转,低位高位转换,待进行数值运算后,将结果进行翻转即时实际求和结果。

4. 代码示例

#include “string.h”
#include “stdio.h”
#define MAX 100

// c语言中提供了翻转函数strrev
void AddFun(char *val1, char *val2, char *sum)
{
  int len1=strlen(val1);
  int len2=strlen(val1);
  int sign=0; // 进位函数
  int tmpval=0;
  int idx=0;

  val1=strrev(val1);  //字符串翻转
  val2=strrev(val2);  //字符串翻转
  
//按照最短的数值字符串进行数值字符求和
  for (idx=0;idx<len1 && idx<len2;idx++)
   {
     tmpval= val1[idx]-0+ val2[idx]-0+ sign;  //字符转数值与进位求和
     sum[idx]= tmpval %10+0;  // 取除10余数(个位数)转字符
     sign= tmpval /10;  // 取除10整数(高位数)
   }

// 如果第一个字符串长度长,对于后面的数值字符求和
  while(idx<len1)
    {
      tmpval= val1[idx]-0+ sign;
      sum[idx]= tmpval %10+0;
      sign= tmpval /10;
      idx++;
    }
 
// 如果第二个字符串长度长,对于后面的数值字符求和
  while(idx<len2)
    {
      tmpval= val2[idx]-0+ sign;
      sum[idx]= tmpval %10+0;
      sign= tmpval /10;
     idx++;
    }

//全部字符计算结束后,如果进位不为0,添加高位数
 if (sign)
  {
      sum[idx]= sign +0;
    idx++;
  }

 sum[idx]=’\0;  //字符串结束符

 strrev(sum); // 求和结果翻转
}

main()
{
   char val1[MAX];
   char val2[MAX];
   char sum[MAX];
   scanf(%s”,val1);
   scanf(%s”,val2);

 // 两参数,返回结果
 // sum = AddFun(val1, val2) ; 字符串不能直接赋值
 // strcpy(sum,AddFun(val1, val2);

  // 本例采用三参数函数调用
  AddFun(val1, val2, sum);

  printf(%s + %s  =  %s”,val1,val2,sum);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值