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

被折叠的 条评论
为什么被折叠?



