实现两个数同位对齐的加减位运算实现加减乘除 c程序

> c语言^ 运算
热门文章热门标签
02月08日 |
02月08日 |
02月08日 |
02月08日 |
02月07日 |
02月08日 |
02月08日 |
02月07日 |欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 9212 人关注过本帖
标题:C语言中怎么实现两个超大整数的相加减乘除?
等 级:论坛游民
帖 子:43
专家分:37
&&已结贴√
&&问题点数:20&&回复次数:7&&&
C语言中怎么实现两个超大整数的相加减乘除?
C语言中怎么实现两个超大整数的相加减乘除?
搜索更多相关主题的帖子:
等 级:职业侠客
帖 子:147
专家分:302
#include&stdio.h&
&&& double a=9E100,b=1E100,&&& //9*10的100次方够不够
&&& sum=a*b;
&&& printf(&%.1lf\n&,sum);
有什么样的付出,就有什么样的收获!!
等 级:论坛游侠
帖 子:159
专家分:174
回复 2楼 freedgun
这个运行结果正确吗?
非计算机专业自学新手向大家请教
等 级:论坛游民
帖 子:43
专家分:37
期待正确的解答
等 级:小飞侠
帖 子:348
专家分:2026
unsigned int 数组
考虑下进位
等 级:论坛游侠
帖 子:159
专家分:174
运行一下这个
&&& double a=10E100,b=10E100,&&&
&&& sum=a*b;
&&& printf(&%.1lf\n&,sum);
可以看出得出的结果是错误的
非计算机专业自学新手向大家请教
等 级:青峰侠
帖 子:1160
专家分:1797
以下是引用freedgun在 21:26:04的发言:
#include&stdio.h&
&&& double a=9E100,b=1E100,&&& //9*10的100次方够不够
&&& sum=a*b;
&&& printf(&%.1lf\n&,sum);
傻不傻??
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
帖 子:370
专家分:1374
程序代码:#include &stdio.h&
#define MAXINT 1000
int compare(int a[],int b[]);
int bigplus(int a[],int b[],int c[]);
int bigsub(int a[],int b[],int c[]);
int bigmult(int a[],unsigned int b,int c[]);
int bigmult2(int a[],int b[],int c[]);
int bigdiv(int a[],unsigned int b,int c[],int *d);
int bigdiv2(int a[],int b[],int c[],int d[]);
int main(int argc, char *argv[])
&&int a[MAXINT]={<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#};&&&&&//被乘数或被除数
&&int b[MAXINT]={<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#};&&&&&&&&&&&& //乘数或除数
&&int c[MAXINT],d[MAXINT];&&&&&&&&&&&&&&&&&&&&//c[]存放商,d[]存放余数
&&int div=<font color=#4;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //小乘数或小除数
&&int k=<font color=#;
&&int *res=&k;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//小余数整数指针
&&bigplus(a,b,c);
&&bigsub(a,b,c);
&&bigmult(a,div,c);
&&bigmult2(a,b,c);
&&bigdiv(a,div,c,res);
&&bigdiv2(a,b,c,d);
&&getchar();
&&return <font color=#;
int compare(int a[],int b[])&&&&&&&&& //比较大整数的大小
&&& if (a[<font color=#]&b[<font color=#]) return <font color=#;&&&&&&&&& //比较a,b的位数确定返回值
&&& else if (a[<font color=#]&b[<font color=#]) return -<font color=#;
&&& else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//位数相等时的比较
&&&&&&&&i=a[<font color=#];
&&&&&&&&while (a[i]==b[i])&&&&&&&&&&&&//逐位比较
&&&&&&&&&&&i--;
&&&&&&&&if (i==<font color=#) return <font color=#;
&&&&&&&&else if (a[i]&b[i]) return <font color=#;
&&&&&&&&else return -<font color=#;
int bigplus(int a[],int b[],int c[])&&//大整数加法
&&& int i,
&&& len=(a[<font color=#]&b[<font color=#]?a[<font color=#]:b[<font color=#]);&&//a[0] b[0]保存数组长度,len为较长的一个
&&& for(i=<font color=#;i&MAXINT;i++)&&&&&& //将数组清0
&&&&&&&&c[i]=<font color=#;
&&& for (i=<font color=#;i&=i++)&&&&&&&&//计算每一位的值
&&&&&&&&c[i]+=(a[i]+b[i]);
&&&&&&&&if (c[i]&=<font color=#)
&&&&&&&&&&&c[i]-=<font color=#;&&&&&&&&&&&&//大于10的取个位
&&&&&&&&&&&c[i+<font color=#]++;&&&&&&&&&&&&//高位加1
&&& if (c[i+<font color=#]&<font color=#) len++;
&&&&&&&&c[<font color=#]=&&&&&&&&&&&&&&& //c[0]保存结果数组实际长度
&&& printf(&Big integers add: &;
&&& for (i=i&=<font color=#;i--)
&&&&&&&&&&&&&&& printf(&%d&,c[i]); //打印结果
&&&&&&&&printf(&\n&;
&&& return <font color=#;
int bigsub(int a[],int b[],int c[]) //大整数减法
&&& int i,
&&& len=(a[<font color=#]&b[<font color=#]?a[<font color=#]:b[<font color=#]);&&//a[0]保存数字长度,len为较长的一个
&&& for(i=<font color=#;i&MAXINT;i++)&&&&&& //将数组清0
&&&&&&&&c[i]=<font color=#;
&&& if (compare(a,b)==<font color=#)&&&&&&&&//比较a,b大小
&&&&&& printf(&Result:0&;
&&&&&& return <font color=#;
&&& else if (compare(a,b)&<font color=#)
&&& for (i=<font color=#;i&=i++)&&&&&&&&//计算每一位的值
&&&&&&&&c[i]+=(a[i]-b[i]);
&&&&&&&&if (c[i]&<font color=#)
&&&&&&&&&&&c[i]+=<font color=#;&&&&&&&&&&&&//小于0的原位加10
&&&&&&&&&&&c[i+<font color=#]--;&&&&&&&&&&&&//高位减1
&&&&&&&&for (i=<font color=#;i&=i++)&&&&&&&&//计算每一位的值
&&&&&&&&c[i]+=(b[i]-a[i]);
&&&&&&&&if (c[i]&<font color=#)
&&&&&&&&&&&c[i]+=<font color=#;&&&&&&&&&&&&//小于0原位加10
&&&&&&&&&&&c[i+<font color=#]--;&&&&&&&&&&&&//高位减1
&&& while (len&<font color=# && c[len]==<font color=#)&&//去掉高位的0
&&&&&&&&len--;
&&& c[<font color=#]=
&&& printf(&Big integers sub= &;
&&& if (a[<font color=#]&b[<font color=#]) printf(&-&;
&&& for(i=i&=<font color=#;i--)&&&&&&&&&//打印结果
&&&&&&&&printf(&%d&,c[i]);
&&& printf(&\n&;
&&& return <font color=#;
int bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度
&&& int len,i;
&&& for (i=<font color=#;i&MAXINT;i++)&&&&&&&&&&&&&&&&&&//数组清0
&&&&&&c[i]=<font color=#;
&&& len=a[<font color=#];
&&& for(i=<font color=#;i&=i++)&&&&&&&&&&&&&&&&&&&&&//对每一位计算
&&&&&& c[i]+=a[i]*b;
&&&&&& c[i+<font color=#]+=c[i]/<font color=#;
&&&&&& c[i]%=<font color=#;
&&& while (c[++len]&=<font color=#)&&&&&&&&&&&&&&&&&&&&//处理高位
&&&&&& c[len+<font color=#]=c[len]/<font color=#;
&&&&&& c[len]%=<font color=#;
&&& if (c[len]==<font color=#) len--;&&&&&&&&&&&&&&&&&& //处理高进位为0情况
&&& printf(&Big integrs multi small integer: &;
&&& for (i=i&=<font color=#;i--)
&&&&&&&&printf(&%d&,c[i]);
&&& printf(&\n&;
int bigmult2(int a[],int b[],int c[])&&&&&&//高精度乘以高精度
&&& int i,j,
&&& for (i=<font color=#;i&MAXINT;i++)&&&&&&&&&&&&&&&&&&//数组清0
&&&&&&&&c[i]=<font color=#;
&&& for (i=<font color=#;i&=a[<font color=#];i++)&&&&&&&&&&&&&&&&&&//被乘数循环
&&&&&&for (j=<font color=#;j&=b[<font color=#];j++)&&&&&&&&&&&&&&& //乘数循环
&&&&&&&&&c[i+j-<font color=#]+=a[i]*b[j];&&&&&&&&&&&&&&//将每一位计算累加
&&&&&&&&&c[i+j]+=c[i+j-<font color=#]/<font color=#;&&&&&&&&&&&&&&//将每一次结果累加到高一位
&&&&&&&&&c[i+j-<font color=#]%=<font color=#;&&&&&&&&&&&&&&&&&&&&&//计算每一次的个位
&&&len=a[<font color=#]+b[<font color=#];&&&&&&&&&&&&&&&&&&&&&&&&&&//取最大长度
&&&while (len&<font color=# && c[len]==<font color=#)&&&&&&&&&&&&&&//去掉高位0
&&&&&&len--;
&&&c[<font color=#]=
&&&printf(&Big integers multi: &;
&&&for (i=i&=<font color=#;i--)&&&&&&&&&&&&&&&&&&&&//打印结果
&&&&&&printf(&%d&,c[i]);
&&&printf(&\n&;
int bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //a[] 为被乘数,b为除数,c[]为结果,d为余数
&&& int i,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&& len=a[<font color=#];&&&&&&&&&&&&&&&&&&&&&&&&&&//len为a[0]的数组长度
&&& for (i=i&=<font color=#;i--)
&&&&&& (*d)=<font color=#*(*d)+a[i];&&&&&&&&&&&&&&&&&&&&&&&&//计算每一步余数
&&&&&& c[i]=(*d)/b;&&&&&&&&&&&&&&&&&&&&&&&&&&&//计算每一步结果
&&&&&& (*d)=(*d)%b;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//求模余数
&&& while (len&<font color=# && c[len]==<font color=#) len--;&&&&&&&&//去高位0
&&& printf(&Big integer div small integer: &;
&&& for (i=i&=<font color=#;i--)&&&&&&&&&&&&&&&&&&&&//打印结果
&&&&&&printf(&%d&,c[i]);
&&& printf(&\tArithmetic compliment:%d&,*d);
&&& printf(&\n&;
int bigdiv2(int a[],int b[],int c[],int d[])&&//高精度除以高精度
&&&int i,j,
&&&if (compare(a,b)&<font color=#)&&&&&&&&&&&&&&&&&&&&&&&&//被除数较小直接打印结果
&&&&&printf(&Result:0&;
&&&&&printf(&Arithmetic compliment:&;
&&&&&for (i=a[<font color=#];i&=<font color=#;i--) printf(&%d&,a[i]);
&&&&&printf(&\n&;
&&&&&return -<font color=#;&&&&&&&&&&&
&&&for (i=<font color=#;i&MAXINT;i++)&&&&&&&&&&&&&&&&&&&&&//商和余数清0
&&&&&&c[i]=<font color=#;
&&&&&&d[i]=<font color=#;
&&&len=a[<font color=#];d[<font color=#]=<font color=#;
&&&for (i=i&=<font color=#;i--)&&&&&&&&&&&&&&&&&&&&&&&//逐位相除
&&&&&&for (j=d[<font color=#];j&=<font color=#;j--)
&&&&&&&&d[j+<font color=#]=d[j];
&&&&&&d[<font color=#]=a[i];&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//高位*10+各位
&&&&&&d[<font color=#]++;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//数组d长度增1
&&&&&&while (compare(d,b)&=<font color=#)&&&&&&&&&&&&&&&&&//比较d,b大小
&&&&&&&&&&&&for (j=<font color=#;j&=d[<font color=#];j++)&&&&&&&&&&&&&&//做减法d-b
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& d[j]-=b[j];
&&&&&&&&&&&&&&& if (d[j]&<font color=#)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&& d[j]+=<font color=#;
&&&&&&&&&&&&&&&&&& d[j+<font color=#]--;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&}
&&&&&&&&&&&&&&& while (j&<font color=# && d[j]==<font color=#)&&&&&&&&//去掉高位0
&&&&&&&&&&&&&&&&&&&&& j--;
&&&&&&&&&&&&&&& d[<font color=#]=j;
&&&&&&&&&&&&c[i]++;&&&&&&&&&&&&&&&&&&&&&&&&&&&//商所在位值加1
&&&j=b[<font color=#];
&&&while (c[j]==<font color=# && j&<font color=#) j--;&&&&&&&&&&&&&&& //求商数组c长度
&&&&&c[<font color=#]=j;
&&&printf(&Big integers div result: &;
&&&for (i=c[<font color=#];i&=<font color=#;i--)&&&&&&&&&&&&&&&&&&&&& //打印商
&&&&&printf(&%d&,c[i]);
&&&printf(&\tArithmetic compliment: &;&&&&&& //打印余数
&&&for (i=d[<font color=#];i&=<font color=#;i--)
&&&&&printf(&%d&,d[i]);
&&&printf(&\n&);
有一种落差是,你配不上自己的野心,也辜负了所受的苦难。
版权所有,并保留所有权利。
Powered by , Processed in 0.362217 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reservedvolcanol ----View OF Linux Can Appreciate Nature OF Linux。
C语言学习趣事_大数运算_之加法1、引子&& 在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并且由于计算机的运算的特殊性: 按位进行计算的,这样还带来了一个问题,存在数的丢失,就是通常说的溢出。&& 为了在C中进行大数运算,不能简单的用C中预定义的数据类型和运算方法进行,因此必须寻求一种新的方法。本文讨论怎样来设计一种方法来计算各种大数运算。2、加法&& 我们知道,实际上计算机通过位运算来实现数学运算,我们通过一个简单的例子来说明这个问题。Exp:&&&& 100&& &&&&&&& & (为了简单的表示运算我们假设运算量是占用一个Byte的)&&&&& 50&& &&&&&&& &&& +&&&&&&&&&&&&&& +&&&&&&&&&&&&&&&&&&&&&&&& 150&&&&&&&&&&&&& 通过上面的例子我们可以看到,其实我们就可以得到启发,我们在进行数学运算的时候,是否也可以&按位&进行处理呢? 是否可行,我现在也不知道,但是这给了我们一个思路。3、大数加法的思路& 在进行加法的时候,我们不需要关注本身数字的大小,而只需要关心组成数字的每一个数学符号就行, 例如我们有两个数, 13和12, 我们不必要关心13表示距离0的距离为13这个基本的意义, 我们只需要关注这里有两个数符占据了个位、十位就行,同样12一样处理,当我们进行数学运算的时候我们就按照每个位进行计算就行,Exp:&&&& 13& &&&&&&&& 1&&&&& 3&&&& 12& &&&&&&&& 1&&&&& 2&& +&&&&&&&&&&&&&& +&&&&&&&&&&&&&&&&&&&&&&&& 25&&&&&&&&&&&&& 2&&&&&& 5我们最终将: 2和5& 分别放到对应的基位占位符上就行, 把2 放到十位, 把5放到个位,结果可以得到: 25。对于更多或者任意位的数学加法运算我们都可以按照这样的思路处理。4、设计数据结构&& 我们知道在计算机世界里面有一个经典的说法,我忘记是否是冯若-依曼说的了,那就是:&&&&&&&&&&&&&& 程序=数据结构+算法&& 为了实现这样的运算我们需要进行设计一个特殊的数据结构,很显然用结构体比较合适,因为我们不知道到底会输入多少位的数字,因此为了实现任意位的数学运算我们需要用到基本的数据组织形态,就是链表。(在计算机存储能力最大限度之内的运算均可通过这种方法实现)。定义数据结构:Exp:&typedef& struct& Node_Sum&&& {&&&&&&& char& chI&&&&&&&&&&&&&&& //用来存储每一位的输入字符&&&&&&& unsigned int cF&&&&&&&&&& //用来表示每一位相加是否有进位&&&&&&& struct Node_Sum&& *N&&&&& //用来指向输入的下一个节点&&& } NODESUM;5、申请存储空间& 既然没有办法预定义用户的输入长度,那么我们只能是动态申请内存了。我们可以用下面的函数实现动态内存申请:Exp:& NODESUM *get_memory(void)& {&&&&& return (NODESUM *)malloc(sizeof(NODESUM));& }6、保存用户输入& 可以利用循环读入字符的原则来实现用户的输入;&&&&& char chI&&&& NODESUM& *&&&& while((chInput=getchar()) != ' '|| chInput != 0x0D )&&&&&&& {&&&&&&&&&&&& nodesum-&next=get_memory();&&&&&&&&&&&& nodesum-&chInput=chI&&&&&&& }& 7、转换数据的& 因为我们输入的数字是按照高进制位从左到有输入的,这里我们输入也是由左往右输入的,正好与数字相对称,但是这里会引起一个问题,那就是当我们输入的加数和被加数的位数不一致的情况,将会影响到我们两个数的相加运算。这里有三个方法来处理这种情况:&&& 1、是将两个链表都倒置一下,然后进行相加,相加后再将结果倒置输出&&& 2、就是将短的那个进行从左开始补零,直到两个数的位数一致。
&&& 3、就是将输入的字符串进行右对齐,然后进行操作。Exp:&&& &&& +&&&&&&&&&&&&从算法的简单性和运算的时间上来看,我们知道用第二种方法更加简单。8、计算&& 最后一步进行计算,这个就简单了,我们可以用字符进行计算,也没有必要转换成十进制的数据进行计算。这里需要用到一点关于ASCII码的知识,需要一张ASCII码表进行对照。&& 查表知道:&&&&&&&&&&& 字符0 &&&& 0x30&&&&&&&&&&& 字符9 &&&& 0x39因此如果两个字符相加大于0x69就表示相加的位有进位,我们设置我们的进位标志位为1;否则就不置位进位标志位,使其为0;当进行下一个计算的时候我们将进位标志位同时将进位标志位也进行相加,加完后清楚进位标志位就可以实现我们的整个相加的过程。9、实例代码& 这里我们设计一个最多可以实现100位数的加法运算程序,如果更多的数据位,我们就不讨论了。留待有兴趣的进行讨论。这里给出一个简单数组实现的代码,如果将代
码进行修改就可以实现想要的数据长度的计算。
程序实例演示100位大数加法的运算
#include &stdio.h&
#include &ctype.h&
#define LENGTH 100
#define NUL
int main(int argc,char **argv)
char aug_end[LENGTH],
add_end[LENGTH],
int cFlags,
//进位标志位
i_aug_len,
//加数的位数
i_add_len,
//被加数的位数
ch_2_i_aug,
//初始化数组
while(i&100)
aug_end[i]=NUL;
add_end[i]=NUL;
sum[i]=NUL;
//输入加数
i_aug_len=0;
printf("Please input the augend:");
while(isdigit(temp=getc(stdin)))
aug_end[i]=
i_aug_len++;
if(i&=100)
fflush(stdin);
//数据对齐,将输入数据右对齐
for(i=100-i_aug_i&0;i--)
for(j=100-i;j&=0;j--)
aug_end[j+1]=aug_end[j];
i=100-i_aug_
while(i&=0)
aug_end[i-1]=0x30;
//输入被加数
i_add_len=0;
printf("Please input the augend:");
while(isdigit(temp=getc(stdin)))
add_end[i]=
i_add_len++;
if(i&=100)
fflush(stdin);
//数据对齐,将输入数据右对齐
for(i=100-i_add_i&0;i--)
for(j=100-i;j&=0;j--)
add_end[j+1]=add_end[j];
i=100-i_add_
while(i&=0)
add_end[i-1]=0x30;
//进行加法运算,按照位置进行计算,从右向左运算
//首次运算置位进位标志位为0
for(i=99;i&=0;i--)
ch_2_i_aug=aug_end[i]-48;
// char &&》 int
ch_2_i_add=add_end[i]-48;
temp=ch_2_i_aug+ch_2_i_add+cF
if(temp &=10)
//如果进位了,就应该将个位数取出来,同时将进位标志位置1
sum[i]=temp+48;
// int &&》 char
//输出运算结果
puts("\nThe sum of the augadd and addend is:");
if(cFlags==1)
putc('1',stdout);
for(i=0;i&100;i++)
if(isdigit(sum[i]))
putc(sum[i],stdout);
putc('\n',stdout);"c语言不允许混合类型数据间进行运算"的糗事
你可能感兴趣:
糗事百科为大家收集了很多的c语言不允许混合类型数据间进行运算的糗事,各种关于c语言不允许混合类型数据间进行运算的爆笑经历、尴尬时刻和开心视频,想持续关注c语言不允许混合类型数据间进行运算的糗事就收藏本页吧.
扫码下载糗事百科app即5的二进制右移一位得原本末尾的1被移走,高位补0;左移同理注意:因右边是数据的最低位,所以当右移出去后,再左移是不能恢复到原来的数字的,但左移不同,左边剩下的高位都为0,都是存在的,当你的数字不足够大时,左移之后是还可以通过右移恢复原数的当想使用位运算交换两个数的时,应先对每个数实际二进制位数做简单估测,再确定所移动位数,下面为交换两个数的实例注:上述代码中的&运算符运算原理和亦或相似,这个是如果两个都为1,则为1,否则为0;当用此方法进行交换两个数时,一是两个数的大小比第三种方法还受限制,而且所移的位数不好确定,不推荐使用学习编程(C语言/C++),并不难各位可以加下群(群公告有大量学习资料和工具及教学视频),一起交流提升,编程不要觉得很难,虽说也有难度,但是学好了对以后的帮助是非常大。我知道肯定毛病颇多,望各位大佬口下留情,手下留情,多多指点;谢过谢过本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。金融发展百家号最近更新:简介:分享各种牛理财,为您理财保驾护航作者最新文章相关文章

我要回帖

更多关于 浮点数加减运算 的文章

 

随机推荐