无限大数加、减、乘、除C语言程序

合集下载

c语言大数运算

c语言大数运算

c语言大数运算摘要:1.C 语言大数运算的背景和需求2.C 语言大数运算的方法和技巧3.C 语言大数运算的实际应用案例4.C 语言大数运算的优缺点分析正文:一、C 语言大数运算的背景和需求在计算机科学领域,大数运算是指对非常大的数字进行加、减、乘、除等数学运算。

随着各种复杂数学问题和实际应用场景的出现,对大数运算的需求越来越高。

C 语言作为一种广泛应用的编程语言,也需要提供对大数运算的支持。

二、C 语言大数运算的方法和技巧1.使用数组存储大数为了实现大数运算,首先需要解决数字的存储问题。

C 语言可以使用数组来存储大数,将每一位数字存储在数组的不同下标中。

这样,在实现大数运算时,可以对数组中的每一位数字进行操作。

2.定义大数运算函数C 语言中可以自定义大数运算函数,例如加法、减法、乘法、除法等。

这些函数可以接收数组作为参数,对数组中的数字进行运算。

在实现这些函数时,需要注意数字的位数和进制,以及可能出现的溢出问题。

3.优化大数运算效率为了提高大数运算的效率,可以采用一些优化技巧,例如使用位运算、分治法等。

这些技巧可以减少运算次数,提高程序运行速度。

三、C 语言大数运算的实际应用案例C 语言大数运算在许多实际应用场景中都有广泛的应用,例如密码学、计算机图形学、数值计算等。

以下是一个简单的密码学应用案例:假设需要对两个大整数进行模运算,可以使用C 语言大数运算方法实现:```c#include <stdio.h>int mod_exp(int a, int b, int m) {int result[1000];result[0] = 1;for (int i = 1; i < 1000; i++) {for (int j = 0; j < 1000; j++) {result[i * 1000 + j] = (result[i * 1000 + j] + (long long)a * result[j * 1000 + b]) % m;}}return result[0];}int main() {int a, b, m;scanf("%d %d %d", &a, &b, &m);int result = mod_exp(a, b, m);printf("%d", result);return 0;}```四、C 语言大数运算的优缺点分析C 语言大数运算的优点是可以处理非常大的数字,且运算速度快。

大数乘法的C代码实现

大数乘法的C代码实现

⼤数乘法的C代码实现在C语⾔中,宽度最⼤的⽆符号整数类型是unsigned long long, 占8个字节。

那么,如果整数超过8个字节,如何进⾏⼤数乘法呢?例如:$ pythonPython 2.7.6 (default, Oct 26 2016, 20:32:47)...<snip>....>>> a = 0x123456781234567812345678>>> b = 0x876543211234567887654321>>> print"a * b = 0x%x" % (a * b)a *b = 0x9a0cd057ba4c159a33a669f0a522711984e32bd70b88d78⽤C语⾔实现⼤数乘法,跟⼗进制的多位数乘法类似,基本思路是采⽤分⽽治之的策略,难点就是进位处理相对⽐较复杂。

本⽂尝试给出C 代码实现(基于⼩端),并使⽤Python脚本验证计算结果。

1. foo.c1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>45 typedef unsigned char byte; /* 1 byte */6 typedef unsigned short word; /* 2 bytes */7 typedef unsigned int dword; /* 4 bytes */8 typedef unsigned long long qword; /* 8 bytes */910 typedef struct big_number_s {11 dword *data;12 dword size;13 } big_number_t;1415static void16 dump(char *tag, big_number_t *p)17 {18if (p == NULL)19return;2021 printf("%s : data=%p : size=%d:\t", tag, p, p->size);22for (dword i = 0; i < p->size; i++)23 printf("0x%08x ", (p->data)[i]);24 printf("\n");25 }2627/*28 * Add 64-bit number (8 bytes) to a[] whose element is 32-bit int (4 bytes)29 *30 * e.g.31 * a[] = {0x12345678,0x87654321,0x0}; n = 3;32 * n64 = 0xffffffff1234567833 *34 * The whole process of add64() looks like:35 *36 * 0x12345678 0x87654321 0x0000000037 * + 0x12345678 0xffffffff38 * -----------------------------------39 * = 0x2468acf0 0x87654321 0x0000000040 * + 0xffffffff41 * -----------------------------------42 * = 0x2468acf0 0x87654320 0x0000000143 *44 * Finally,45 * a[] = {0x2468acf0,0x87654320,0x00000001}46*/47static void48 add64(dword a[], dword n, qword n64)49 {50 dword carry = 0;5152 carry = n64 & 0xFFFFFFFF; /* low 32 bits of n64 */53for (dword i = 0; i < n; i++) {54if (carry == 0x0)55break;5657 qword t = (qword)a[i] + (qword)carry;58 a[i] = t & 0xFFFFFFFF;59 carry = (dword)(t >> 32); /* next carry */60 }6162 carry = (dword)(n64 >> 32); /* high 32 bits of n64 */63for (dword i = 1; i < n; i++) {64if (carry == 0x0)65break;6667 qword t = (qword)a[i] + (qword)carry;68 a[i] = t & 0xFFFFFFFF;69 carry = (dword)(t >> 32); /* next carry */70 }71 }7273static big_number_t *74 big_number_mul(big_number_t *a, big_number_t *b)75 {76 big_number_t *c = (big_number_t *)malloc(sizeof(big_number_t));77if (c == NULL) /* malloc error */78return NULL;7980 c->size = a->size + b->size;81 c->data = (dword *)malloc(sizeof(dword) * c->size);82if (c->data == NULL) /* malloc error */83return NULL;8485 memset(c->data, 0, sizeof(dword) * c->size);8687 dword *adp = a->data;88 dword *bdp = b->data;89 dword *cdp = c->data;90for (dword i = 0; i < a->size; i++) {91if (adp[i] == 0x0)92continue;9394for (dword j = 0; j < b->size; j++) {95if (bdp[j] == 0x0)96continue;9798 qword n64 = (qword)adp[i] * (qword)bdp[j];99 dword *dst = cdp + i + j;100 add64(dst, c->size - (i + j), n64);101 }102 }103104return c;105 }106107static void108 free_big_number(big_number_t *p)109 {110if (p == NULL)111return;112113if (p->data != NULL)114free(p->data);115116free(p);117 }118119int120 main(int argc, char *argv[])121 {122 dword a_data[] = {0x12345678, 0x9abcdef0, 0xffffffff, 0x9abcdefa, 0x0}; 123 dword b_data[] = {0xfedcba98, 0x76543210, 0x76543210, 0xfedcba98, 0x0}; 124125 big_number_t a;126 a.data = (dword *)a_data;127 a.size = sizeof(a_data) / sizeof(dword);128129 big_number_t b;130 b.data = (dword *)b_data;131 b.size = sizeof(b_data) / sizeof(dword);132133 dump("BigNumber A", &a);134 dump("BigNumber B", &b);135 big_number_t *c = big_number_mul(&a, &b);136 dump(" C = A * B", c);137 free_big_number(c);138139return0;140 }2. bar.py1#!/usr/bin/python23import sys45def str2hex(s):6 l = s.split('')78 i = len(l)9 out = ""10while i > 0:11 i -= 112 e = l[i]13if e.startswith("0x"):14 e = e[2:]15 out += e1617 out = "0x%s" % out18 n = eval("%s * %d" % (out, 0x1))19return n2021def hex2str(n):22 s_hex = "%x" % n23if s_hex.startswith("0x"):24 s_hex = s_hex[2:]2526 n = len(s_hex)27 m = n % 828if m != 0:29 s_hex = '0' * (8 - m) + s_hex30 n += (8 - m)31 i = n32 l = []33while i >= 8:34 l.append('0x' + s_hex[i-8:i])35 i -= 836return"%s" % ''.join(l)3738def main(argc, argv):39if argc != 4:40 sys.stderr.write("Usage: %s <a> <b> <c>\n" % argv[0]) 41return 14243 a = argv[1]44 b = argv[2]45 c = argv[3]46 ax = str2hex(a)47 bx = str2hex(b)48 cx = str2hex(c)4950 axbx = ax * bx51if axbx != cx:52print"0x%x * 0x%x = " % (ax, bx)53print"got: 0x%x" % axbx54print"exp: 0x%x" % cx55print"res: FAIL"56return 15758print"got: %s" % hex2str(axbx)59print"exp: %s" % c60print"res: PASS"61return 06263if__name__ == '__main__':64 argv = sys.argv65 argc = len(argv)66 sys.exit(main(argc, argv))3. MakefileCC = gccCFLAGS = -g -Wall -m32 -std=c99TARGETS = foo barall: $(TARGETS)foo: foo.c$(CC) $(CFLAGS) -o $@ $<bar: bar.pycp $< $@ && chmod +x $@clean:rm -f *.oclobber: cleanrm -f $(TARGETS)cl: clobber4. 编译并测试$ makegcc -g -Wall -m32 -std=c99 -o foo foo.ccp bar.py bar && chmod +x bar$ ./fooBigNumber A : data=0xbfc2a7c8 : size=5: 0x123456780x9abcdef00xffffffff0x9abcdefa0x00000000BigNumber B : data=0xbfc2a7d0 : size=5: 0xfedcba980x765432100x765432100xfedcba980x00000000C = A * B : data=0x8967008 : size=10: 0x350687400xee07360a0x053bd8c90x2895f6cd0xb973e57e0x4e6cfe660x0b60b60b0x9a0cd0560x000000000x00000000 $ A="0x12345678 0x9abcdef0 0xffffffff 0x9abcdefa 0x00000000"$ B="0xfedcba98 0x76543210 0x76543210 0xfedcba98 0x00000000"$ C="0x35068740 0xee07360a 0x053bd8c9 0x2895f6cd 0xb973e57e 0x4e6cfe66 0x0b60b60b 0x9a0cd056 0x00000000 0x00000000"$$ ./bar "$A""$B""$C"got: 0x350687400xee07360a0x053bd8c90x2895f6cd0xb973e57e0x4e6cfe660x0b60b60b0x9a0cd056exp: 0x350687400xee07360a0x053bd8c90x2895f6cd0xb973e57e0x4e6cfe660x0b60b60b0x9a0cd0560x000000000x00000000res: PASS$结束语:本⽂给出的是串⾏化的⼤数乘法实现⽅法。

复数四则运算c语言(加减乘除)

复数四则运算c语言(加减乘除)

# include "stdio.h"# include "stdlib.h"struct complex{float real;float imaginary;};void InitComplex(complex &c,float r1,float r2){c.real=r1;c.imaginary=r2;}void AddComplex(complex &c,complex c1,complex c2){c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;}void SubComplex(complex &c,complex c1,complex c2){c.real=c1.real-c2.real;c.imaginary=c1.imaginary-c2.imaginary;}void multiplyComplex (complex &c,complex c1,complex c2){c.real=(c1.real*c2.real)-(c1.imaginary*c2.imaginary);c.imaginary=(c1.real*c2.imaginary)+(c2.real*c1.imaginary);}Void divideComplex(complex &c,complex c1,complex c2){c.real=(c1.real*c2.real+c1.imaginary*c2.imaginary)/(c2.real*c2.real+c2.imaginary*c2.imaginary);c.imaginary=(c1.imaginary*c2.real-c1.real*c2.imaginary)/(c2.real*c2.real+c2.imaginary*c2.imagi nary);}void main(){complex c,c1,c2;float r,r1,r2,r11,r12,r21,r22;int node;printf("qing shu ru xu hao:\n");printf("1:Read complex number;2: Print the complex number;3: Calculates the sum \n");printf("4: Calculates the difference;5: Calculates the product;6: Calculates the division \n");scanf("%d",&node);while(node!=0){switch(node){case 1: printf("please input the real part and the imaginary part \n");scanf("%f%f",&r1,&r2);InitComplex(c,r1,r2);printf("the complex number:c=%f+i%f\n",c.real,c.imaginary);break;case 2: printf("the complex number:c=%f+i%f\n",c.real,c.imaginary);break;case 3: printf("please input the real part and the imaginary part of number 1\n");scanf("%f%f",&r11,&r12);InitComplex(c1,r11,r12);printf("please input the real part and the imaginary part of number 2\n");scanf("%f%f",&r21,&r22);InitComplex(c2,r21,r22);AddComplex(c,c1,c2);printf("Sum:c=%f+i%f\n",c.real,c.imaginary);break;case 4: printf("please input the real part and the imaginary part of number 1\n");scanf("%f%f",&r11,&r12);InitComplex(c1,r11,r12);printf("please input the real part and the imaginary part of number 2\n");scanf("%f%f",&r21,&r22);InitComplex(c2,r21,r22);SubComplex(c,c1,c2);printf("Difference:c=%f+i%f\n",c.real,c.imaginary);break;case 5: printf("please input the real part and the imaginary part of number 1\n");scanf("%f%f",&r11,&r12);InitComplex(c1,r11,r12);printf("please input the real part and the imaginary part of number 2\n");scanf("%f%f",&r21,&r22);InitComplex(c2,r21,r22);multiplyComplex (c,c1,c2);printf("Product:c=%f+i%f\n",c.real,c.imaginary);break;case 6: printf("please input the real part and the imaginary part of number 1\n");scanf("%f%f",&r11,&r12);InitComplex(c1,r11,r12);printf("please input the real part and the imaginary part of number 2\n");scanf("%f%f",&r21,&r22);InitComplex(c2,r21,r22);divideComplex(c,c1,c2);printf("Division:c=%f+i%f\n",c.real,c.imaginary);break;default:printf("Over");}scanf("%d",&node);}}。

c语言函数加减乘除运算编程

c语言函数加减乘除运算编程

c语言函数加减乘除运算编程1.介绍在计算机科学中,函数是大多数编程语言中的基本组件之一,它是一段被封装起来的可重用代码。

在C语言中,函数的定义形式如下:返回类型函数名(参数列表){函数体}其中,返回类型指定函数返回值的类型,函数名用于调用函数,参数列表传递给函数的值用于函数计算中。

本文将介绍如何在C语言中实现基本的加减乘除运算函数。

2.实现加法函数加法是最基本的运算之一,在C语言中,我们可以定义一个函数来执行两个参数的加法。

下面是一个基本的加法函数:int add(int a, int b) {return a + b;}在此函数中,我们通过返回a和b的和来实现加法运算。

我们可以通过调用函数来获得相加的结果。

例如,下面的代码将调用add函数并将其结果打印到屏幕上:int main() {int num1 = 2;int num2 = 4;int sum = add(num1, num2);printf("The sum of %d and %d is %d\n", num1, num2, sum);return 0;}3.实现减法函数减法是另一个基本运算,我们可以通过类似的方法定义减法函数。

下面是一个基本的减法函数:int subtract(int a, int b) {return a - b;}在此函数中,我们通过a和b的差值返回减法结果。

的代码将调用subtract函数并将其结果打印到屏幕上:int main() {int num1 = 10;int num2 = 5;int difference = subtract(num1, num2);printf("The difference between %d and %d is %d\n",num1, num2, difference);return 0;}4.实现乘法函数乘法是另一个基本运算,我们可以通过类似的方法定义乘法函数。

c语言超大整数除法

c语言超大整数除法

c语言超大整数除法C语言是一门广泛应用于计算机科学领域的编程语言,其强大的数值计算能力使其成为大型整数计算的首选语言。

在实际应用中,我们有时需要进行超大整数的除法运算,即将一个超大的整数除以另一个超大的整数,得到精确的商和余数。

本文将介绍如何使用C语言进行超大整数除法运算。

在C语言中,由于整数的位数限制,无法直接处理超大整数的运算。

因此,我们需要使用数组或字符串来表示超大整数,并通过模拟手工除法的方式进行计算。

具体步骤如下:1. 将超大整数表示为数组或字符串:由于C语言中整数的位数限制,我们可以使用数组或字符串来表示超大整数。

例如,将一个100位的整数表示为一个长度为100的整型数组或长度为100的字符数组。

2. 实现除法运算的核心算法:将超大整数除以一个普通整数的过程可以看作是模拟手工除法的过程。

我们从被除数的最高位开始,逐位进行除法运算。

具体步骤如下:- 初始化商和余数为0。

- 从被除数的最高位开始,逐位进行除法运算。

- 将当前位的值与余数相加,得到除数。

- 将除数除以除数,并将商和余数更新。

- 将商的最低位放入商的结果数组中。

- 将余数作为下一位的被除数继续运算,直到被除数的所有位数都处理完毕。

- 最终得到的商就是除法的结果。

3. 处理特殊情况:在进行超大整数除法运算时,需要注意以下几个特殊情况:- 被除数为0的情况:如果被除数为0,除法运算无法进行,需要进行错误处理。

- 除数为0的情况:如果除数为0,除法运算也无法进行,需要进行错误处理。

- 被除数小于除数的情况:如果被除数小于除数,商为0,余数为被除数本身。

4. 处理边界情况:在进行超大整数除法运算时,还需要考虑边界情况,例如除数为1或被除数为1的情况。

在这种情况下,商和余数的计算可以简化为数组或字符串的复制操作。

5. 实现输入和输出:为了方便用户输入和查看运算结果,我们可以实现输入和输出函数。

输入函数用于将用户输入的超大整数存储到数组或字符串中,输出函数用于将计算结果打印到屏幕上。

C语言加减乘除运算

C语言加减乘除运算

C语言加减乘除运算C语言也可以进行加减乘除运算,但是运算符号与数学中的略有不同。

下面一起来看看!加号、减号与数学中的一样,乘号、除号不同,另外C语言还多了一个求余数的运算符。

我们先来看一段代码:#include#includeint main(){ int a=12; int b=100; float c=8.5; int m=a+b; float n=b*c; double p=a/c; int q=b%a; printf("m=%d, n=%f, p=%lf, q=%d ", m, n, p, q); system("pause"); return 0;} 输出结果:m=112, n=850.000000, p=1.411765, q=4你也可以让数字直接参与运算:#include#includeint main(){ int a=12; int b=100; float c=8.9; int m=a-b; // 变量参与运算 int n=a+239; // 有变量也有数字 double p=12.7*34.3; // 数字直接参与运算 printf("m=%d, n=%d, p=%lf ", m, n, p); printf("m*2=%d, 6/3=%d, m*n=%ld ", m*2, 6/3, m*n); system("pause"); return 0;}输出结果:m=-88, n=251, p=435.610000m*2=-176, 6/3=2, m*n=-22088对于除法,需要注意的是除数不能为 0,所以诸如int a=3/0;这样的语句是错误的。

加减乘除的`简写先来看一个例子:#include#includeint main(){ int a=12; int b=10; printf("a=%d ", a); a=a+8; printf("a=%d ", a); a=a*b; printf("a=%d ", a); system("pause"); return 0;}输出结果:a=12a=20a=200第一次输出 a 原来的值;a=a+8;相当于用a+8的值替换原来 a 的值,所以第二次输出20;第三次用a*b的值替换第二次的值,所以是200。

大整数的加减乘除实现代码总结

大整数的加减乘除实现代码总结

大整数的加减乘除实现代码总结大整数的加减乘除实现代码总结1)大正整数的加法具体思路就是模仿手算的加法,我在这里先将输入的字符串reverse便于操作,最后去掉结果的前置0即可。

注意:如果答案就是0,那么需要特殊处理。

大量的测试数据可以上交至hdu 1002[cpp]view plaincopy1.#include2.#include3.#include/doc/2c6095273.html,ing namespace std;5.int main()6.{7.int n;8. cin>>n;9.int m=0;10.int l=0;11.for(int i=1;i<=n;i++)12. {13. string s1,s2,s(10000,'0');14. cin>>s1>>s2;15. m++;16. cout<<(l++?"\n":"");17. reverse(s1.begin(),s1.end());18. reverse(s2.begin(),s2.end());19.for(int j=0;j<s1.length();j++)< bdsfid="90" p=""></s1.length();j++)<>20. s[j]=s1[j];21.int temp=0;22.for(int k=0;k<s2.length();k++)< bdsfid="94" p=""></s2.length();k++)<>23. {24. temp+=s[k]-48+s2[k]-48;25. s[k]=temp%10+'0';26. temp/=10;27. }28. s[s2.length()]=s[s2.length()]-48+temp+48;29. reverse(s.begin(),s.end());30. reverse(s1.begin(),s1.end());31. reverse(s2.begin(),s2.end());32. cout<<"Case "<<m<<":"<<endl;< bdsfid="105" p=""></m<<":"<<endl;<>33. cout<<s1<<" "<<s2<<"="<<s.substr(s.find_first_not_of('0'))<<endl</p><p>; </p><p>34.</p><p>35. }</p><p>36.return 0;</p><p>37.}</p><p>(2)大正整数的减法</p><p>同样是模拟手算,处理借位。

C语言实现大数四则运算

C语言实现大数四则运算

C语⾔实现⼤数四则运算⼀、简介众所周知,C语⾔中INT类型是有限制,不能进⾏超过其范围的运算,⽽如果采⽤float类型进⾏运算,由于float在内存中特殊的存储形式,⼜失去了计算的进度。

要解决整个问题,⼀种解决⽅法是通过字符串数组实现数据的存储,然后实现它们之间四则运算的函数。

⼆、数据结构为了实现字符数组之间的运算,要考虑数值的正负性,数字的长度以及具体存储的数字typedef struct num{int len; //数值长度char symbol; //数字正负形int number[LEN]; //数组}NUM,*SNUM;三、函数整个程序使⽤了⼀下的函数SNUM expToNum(char exp[]);//将输⼊字符串转换为对应结构体void reverse(int a[],int len);//数组逆序int compareAbs(SNUM left,SNUM right);//⽐较两数绝对值⼤⼩SNUM anti_add(SNUM left,SNUM right);//元加法SNUM anti_sub(SNUM left,SNUM right);//元减法SNUM add(SNUM left,SNUM right); //加法SNUM sub(SNUM left,SNUM right); //减法SNUM multiply(SNUM left,SNUM right); //乘法SNUM divide(SNUM left,SNUM right); //除法SNUM mod(SNUM left,SNUM right);//求摸运算函数的定义1 SNUM multiply(SNUM left,SNUM right){2//left作为被乘数,right作为乘数3 SNUM mul = (struct num*)malloc(sizeof(struct num));4int i,j;5for(i=0;i<LEN;i++){6 mul->number[i]=0;7 }89if(left->symbol==right->symbol){10 mul->symbol='+';11 }else{12 mul->symbol='-';13 }14151617for(i=0;i<right->len;i++){18for(j=0;j<left->len;j++){19 mul->number[i+j]+=left->number[j]*right->number[i];20 }21 }22232425////进位化简26int len = left->len+right->len-1; //长度2728//29for(i=0;i<len;i++){30 mul->number[i+1]+=mul->number[i]/10;31 mul->number[i]%=10;3233if(i==len-1){34if(mul->number[i+1]!=0){ //还存在⾼位35 len++;36 }else{ //进位完毕,退出37break;38 }39 }40 }4145for(i=len-1;i>=0;i--){46if(mul->number[i]==0){47 len--;48 }else{49break;50 }51 }52if(len==0){53 len=1;54 }5556 mul->len=len;5758free(left);59free(right);60return mul;61 }62636465//减⼀个数等于加上⼀个数的相反数66 SNUM sub(SNUM left,SNUM right){67 right->symbol=(right->symbol=='+'?'-':'+');68return add(left,right);69 }7071//⽐较两数绝对值⼤⼩72int compareAbs(SNUM left,SNUM right){73if(left->len>right->len){ //left的位数更多74return1;75 }else if(left->len<right->len){ //right的位数更多76return -1;77 }else{78int i=left->len-1;79while(i>=0){ //从⾼位开始⽐较80if(left->number[i]>right->number[i]){81return1;82 }83if(left->number[i]<right->number[i]){84return -1;85 }86 i--;87 }88return0; //两者绝对值相等89 }90 }919293 SNUM expToNum(char exp[]){9495 SNUM temp=(struct num*)malloc(sizeof(struct num)); 9697int locan=0;98//确定正负号99if(exp[0]=='+'||exp[0]=='-'){100 temp->symbol=exp[0];101 locan++;102 }else{103 temp->symbol='+';104 }105106//输⼊到数组107int count=0;108while(exp[locan]!='\0'){109 temp->number[count]=exp[locan]-'0';110 locan++;111 count++;112 }113114int i=count;115for(i=count;i<LEN-1;i++){116 temp->number[i]=0;117 }118119 temp->len=count;120121122//数组逆序从个位开始计算123 reverse(temp->number,temp->len);124125return temp;129void reverse(int a[],int len){130int i,temp;131for(i=0;i<len/2;i++){132 temp = a[i];133 a[i] = a[len-1-i];134 a[len-1-i] = temp;135 }136 }137138139140//元加法,假设left和right都为正数或0141 SNUM anti_add(SNUM left,SNUM right){142int i=0;143144while(i<left->len||i<right->len){145int sum=0;146 sum=left->number[i]+right->number[i]; 147if(sum>=10){148 left->number[i]=sum%10;149 left->number[i+1]+=sum/10; //进位150 }else{151 left->number[i]=sum; //不进位152 }153154 i++;155 }156157if(left->number[i]!=0){158 i+=1;159 }160161 left->len=i;162return left;163 }164165//实现正数或负数的加法166 SNUM add(SNUM left,SNUM right){167 SNUM temp;168if(left->symbol==right->symbol){169 temp = anti_add(left,right);170 }else{171if(compareAbs(left,right)>=0){172 temp = anti_sub(left,right);173174 }else{175 temp = anti_sub(right,left);176 }177 }178return temp;179 }180181//元减法,假设left>=right,left和right均为正数或0 182 SNUM anti_sub(SNUM left,SNUM right){183int i=0;184int count=0;185while(i<left->len){186int temp = left->number[i]-right->number[i]; 187if(temp<0){188 left->number[i+1]-=1;189 left->number[i]=temp+10; //退位190 }else{191 left->number[i]=temp;192 }193194 count+=1;195196 i++;197 }198199200201202//舍掉多余的0203for(i=count-1;i>=0;i--){204if(left->number[i]==0){205 count--;206 }else{207break;208 }213 }214215 left->len=count; 216return left;217218 }。

c语言大数加法、阶乘和乘法

c语言大数加法、阶乘和乘法

c语⾔⼤数加法、阶乘和乘法⼀.⼤数加法定义两个⾜够⼤的数字,其数值远超过long的取值范围,设该⼤数的位数有两百位,求其相加所得⼤数加法的核⼼思想详见此链接,内有详细的动画演⽰,这⾥不再赘述直接上代码:#include<string.h>#include<stdio.h>#define N 10//定义当前⼀个⾜够⼤的数字为10位,可任意更改void print_num(int a[],int n){int i=n-1;//从逆序数组的最后⼀项开始查找,进⾏反逆序while(a[i]==0)//由于规定的数组⽐真实计算的数字⼤,所以数组最后⼏位必定存在0的情况--i;//这种情况下⼀定要将0舍去,否则会抬⾼数组的位数for(;i>=0;i--)//找到⾮零的数组,进⾏反逆序输出printf("%d",a[i]);}void plus(int num1[],int num2[],int n){//尤其注意!由于数组是逆序的,所以num[0]是个位,num[1]是⼗位,num[2]是百位for(int i=0,up=0;i<n;i++)//算法参考⼩学加法,这⾥定义⼀个up进位标记{int temp=num1[i]+num2[i]+up;//up最开始设为0,因为在个位⽆法获取进位num1[i]=temp%10;//若产⽣进位⾏为,则选取个位部分赋给num1up=temp/10;//在个位上,若个位相加产⽣进位,则⽤temp/10取整加到下⼀次的⼗位上}print_num(num1, n);}int main(){char buffer1[]="123456";//缓冲数组,将当前数组倒序写⼊num1中char buffer2[]="78951234";//同上,写⼊num2中int num1[N]={0};//将num1,2全部置为0,⽤来将缓冲数组写⼊到num数组当中int num2[N]={0};int n=N;//定义上述两个数组的长度为10for(int i=0,temp=(int)strlen(buffer1)-1;temp>=0;temp--)num1[i++]=buffer1[temp]-'0';//⽤倒序的⽅式将缓冲数组写⼊num中,意味着num的第⼀位是个位,第⼆位是⼗位,三是百位...for(int i=0,temp=(int)strlen(buffer2)-1;temp>=0;temp--)num2[i++]=buffer2[temp]-'0';plus(num1, num2, n);//将两数字相加printf("\n");}⼆.⼤数阶乘⼤数阶乘的中⼼思想参考上述视频和⼀篇博客,博客详情:但是,这⾥需要说明⼀个点:1*2=2,将2存到a[0]中,接下来是⽤a[0]*3;2*3=6,将6储存在a[0]中,接下来是⽤a[0]*4;6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,接下来是⽤a[0]*5;a[1]*5+num(如果前⼀位相乘结果位数是两位数,那么num就等于⼗位上的那个数字;如果是⼀位数,num==0)24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中由于上述博客存在某些地⽅没有说清楚的情况,这⾥解释⼀下关于上述博客的Q&A:1.这⾥的num指的是什么?答:这⾥的num指的是前⾯两数值相乘后进位数位多少:例如6*4得24,这⾥的num值的是24/10=2,进位数为2,num=22.下⾯代码为什么要充i=2开始?答:如果这⾥看懂了代码其实理解2不是很难,但是没有看懂是真的难懂:⾸先明确⼀点:5的阶乘是1*2*3*4*5,我定义的value数组的第⼀位为1,⽽我的i是从2起的,这样以来不就直接凑出了1*2了吗?当我的i⾃增到3,我直接在value数组中找出1*2的值,拿他们去和3相乘,也就凑成了1*2*3了3.如何在代码当中表现出进位的思想?答:我们以5!为例,当计算到1*2*3*4的时候,value当中的表现形式是42000000,从左到右依次是个位,⼗位,百位,千位...etc(value表⽰的是24这个数字)我们在关于j的循环当中拿i=5去和value数组求乘积:5先和位于个位的4求积得20:20%10得0,0放⼊个位中;20/10得2,进位为2,up=2。

计算器c语言代码

计算器c语言代码

计算器c语言代码计算器C语言代码计算器是一种常见的工具,用于进行数值计算和数学运算。

计算器通常具有基本的四则运算功能,可以执行加法、减法、乘法和除法运算,同时还可以进行其他高级计算,比如开方、求幂、取余等。

在本文中,我们将介绍如何使用C语言编写一个简单的计算器。

我们需要定义计算器的基本功能。

我们可以使用函数来实现不同的计算操作。

下面是一个示例代码,实现了加法、减法、乘法和除法四种功能:```c#include <stdio.h>// 加法函数double add(double a, double b) {return a + b;}// 减法函数double subtract(double a, double b) {return a - b;}// 乘法函数double multiply(double a, double b) { return a * b;}// 除法函数double divide(double a, double b) { if (b == 0) {printf("除数不能为零!\n"); return 0;}return a / b;}int main() {double num1, num2;char operator;printf("请输入两个操作数:");scanf("%lf %lf", &num1, &num2); printf("请输入操作符:");scanf(" %c", &operator);switch (operator) {case '+':printf("结果:%lf\n", add(num1, num2));break;case '-':printf("结果:%lf\n", subtract(num1, num2));break;case '*':printf("结果:%lf\n", multiply(num1, num2));break;case '/':printf("结果:%lf\n", divide(num1, num2));break;default:printf("无效的操作符!\n");break;}return 0;}```在上面的代码中,我们使用了四个函数来实现不同的计算操作。

c语言中加减乘除

c语言中加减乘除

c语言中加减乘除加、减、乘、除是C语言中常用的四则运算操作符。

它们在C语言中具有重要的作用,用于对数值进行加减乘除运算。

下面将分别介绍这四个运算符的用法和特点。

一、加法运算符(+):加法运算符用于将两个数值相加,并返回它们的和。

例如,表达式a + b表示将变量a和b的值相加,并将结果赋给另一个变量或用于其他计算。

加法运算符还可用于字符串的连接。

例如,通过表达式strcat(str1, str2)可以将字符串str2连接到字符串str1的末尾。

二、减法运算符(-):减法运算符用于将一个数值减去另一个数值,并返回它们的差。

例如,表达式a - b表示将变量b的值从变量a中减去,并将结果赋给另一个变量或用于其他计算。

减法运算符也可用于指针的运算。

例如,通过表达式ptr2 = ptr1 - 3可以将指针ptr1向前移动3个位置,并将结果赋给ptr2。

三、乘法运算符(*):乘法运算符用于将两个数值相乘,并返回它们的积。

例如,表达式a * b表示将变量a和b的值相乘,并将结果赋给另一个变量或用于其他计算。

乘法运算符还可用于指针的运算。

例如,通过表达式ptr2 = ptr1 * 2可以将指针ptr1的值乘以2,并将结果赋给ptr2。

四、除法运算符(/):除法运算符用于将一个数值除以另一个数值,并返回它们的商。

例如,表达式a / b表示将变量a的值除以变量b的值,并将结果赋给另一个变量或用于其他计算。

除法运算符还可用于求余数。

例如,通过表达式remainder = a % b可以将变量a除以变量b的余数赋给变量remainder。

总结:加、减、乘、除是C语言中常用的四则运算操作符。

它们分别用于数值的相加、相减、相乘和相除。

除法运算符还可用于求余数。

这些运算符在C语言中使用广泛,能够实现各种数值计算和操作。

在编写程序时,合理使用这些运算符可以提高程序的效率和准确性。

因此,熟练掌握加、减、乘、除的使用方法对于C语言程序员来说是非常重要的。

c语言编程加减乘除运算

c语言编程加减乘除运算

c语言编程加减乘除运算《C语言编程:加减乘除运算》导言:C语言作为一门功能强大的编程语言,广泛应用于软件开发和系统编程中。

在C语言中,加减乘除运算是最基本也是最常用的运算符。

本文将以中括号内的内容为主题,详细介绍C语言中的加减乘除运算,包括使用方法、运算规则以及注意事项。

通过本文的学习,读者将能够理解和掌握C语言中的加减乘除运算,为进一步学习C语言编程打下坚实的基础。

第一部分:加法运算1.1 加法运算符(+)在C语言中,加法运算使用加法运算符(+)进行,例如:a + b。

其中,a和b为运算数,可以是整数或浮点数。

1.2 加法运算的规则在C语言中,加法运算的规则如下:- 如果两个运算数都是整数,则进行整数加法运算;- 如果两个运算数中有一个或两个都是浮点数,则进行浮点数加法运算;- 如果运算数中有一个或两个是字符型,则根据ASCII码进行加法运算。

1.3 实例演示下面通过一个实例来演示C语言中的加法运算。

c#include <stdio.h>int main() {int a = 5;int b = 3;int result = a + b;printf("加法运算结果:d\n", result);return 0;}输出结果为:加法运算结果:8。

第二部分:减法运算2.1 减法运算符(-)在C语言中,减法运算使用减法运算符(-)进行,例如:a - b。

其中,a 和b为运算数,可以是整数或浮点数。

2.2 减法运算的规则在C语言中,减法运算的规则如下:- 如果两个运算数都是整数,则进行整数减法运算;- 如果两个运算数中有一个或两个都是浮点数,则进行浮点数减法运算;- 如果运算数中有一个或两个是字符型,则根据ASCII码进行减法运算。

2.3 实例演示下面通过一个实例来演示C语言中的减法运算。

c#include <stdio.h>int main() {int a = 5;int b = 3;int result = a - b;printf("减法运算结果:d\n", result);return 0;}输出结果为:减法运算结果:2。

用C语言实现超长整数的加减乘除四则运算

用C语言实现超长整数的加减乘除四则运算
ABSTRACT B y app lying C language cha in tab les and cha racter string s, the an tho r dea ls w ith the p rob lem abou t sto rage sp ace in advanced p rog ram design p rocessing sto rage sp ace, im p lem en ting very long in teger, h igh p recision a rithm etic, add ition sub traction, m u ltip lica tion and d ivision, w h ich can no t be im p lem en ted w ith advanced language da ta typ e, and g ives sim p le ana lysis and in tro2 duction abou t im p lem en ta tion a lgo rithm. KEYWO RD S p rog ram design language, cha in list, cha racter string, sto rage sp ace, long in teger, a rthem a tic
q= q > nex t;
}
© 1995-2005 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
·3 8· (总 284) 用 C 语言实现超长整数的加减乘除四则运算 2003 年
} if (i 1) 加数、被加数均已结束, 最高位有进位 { h= m a lloc (sizeof (struct node) ) ; h > data= 1; h > nex t= hc > nex t; hc > nex t= h; q= q > nex t; } link to str (hc, s) ; 将加和链表转换为字符串 delink (ha) ; delink (hb) ; delink (hc) ; retu rn s;

大数的加减乘除

大数的加减乘除

大数的加减乘除整数型,长整数型不能存储超过10位数的数,因此要利用数组来存储数据,实现对大数的加减乘除,#include <iostream>#include <cstring>#include <cstdio>using namespace std;int a[1010];int b[1010];char c[1010];char d[1010];int s[10010];//存结果int i,lenc,lend,len;void sub(char c[],char d[])//1000位以内正大数相减{lenc=strlen(c);lend=strlen(d);for(i=0; i<lenc; i++)//转化为数字存入a数组a[i]=c[lenc-i-1]-'0';for(i=0; i<lend; i++)b[i]=d[lend-i-1]-'0';int flag=0;if(lend>lenc) //判断两数长度大小{len=lend;flag=1;}else len=lenc;if(lenc==lend)for(i=0; i<len; i++)//判断长度相同时大小if(c[i]<d[i])//被减数小{flag=1;break;}if(flag==0)//c-d{for(i=0; i<len; i++){s[i]=a[i]-b[i]+s[i];//相减if(s[i]<0){s[i]=s[i]+10;s[i+1]--;//借位}}}else if(flag==1)//d-c{for(i=0; i<len; i++){s[i]=b[i]-a[i]+s[i];//相减if(s[i]<0){s[i]=s[i]+10;s[i+1]--;//借位}}}printf("%s - %s = ",c,d);//输出,型如a + b = cfor(i=len-1; i>=0; i--)if(s[i]!=0)break;if(i<0)//结果为0时cout<<"0";if(flag==1)cout<<"-";//结果为负for(; i>=0; i--)cout<<s[i];cout<<endl;}void div(char c[],int n)//被除数c,除数n,n不能太大,d存结果{long div=0;int k=0,flag=0;len=strlen(c);for(i=0; i<len; i++){div=div*10+c[i]-'0';if(div>=n&&flag==0)//div大于除数n时,开始进行整除,略过商最前边的0{d[k++]=div/n+'0';div=div%n; //余数*10加下一位的数字便是新的被除数flag=1;}else if(flag){d[k++]=div/n+'0';div=div%n;}}if(k==0) d[k++]='0';d[k]='\0';cout<<"商"<<d<<"余"<<div<<endl;}int main(){int T,n;char e[2];cout<<"输入测试的次数:";cin>>T;while(T--){memset(a,0,sizeof(a));//初始化为0memset(b,0,sizeof(b));memset(c,0,sizeof(c));memset(d,0,sizeof(d));memset(s,0,sizeof(s));cout<<"输入运算的符号(-,/):";cin>>e;cout<<"输入两个正数(若是除数,不超过int范围)"<<endl;if(e[0]=='-'){cin>>c>>d;sub(c,d);}else if(e[0]=='/'){cin>>c>>n;div(c,n);}}return 0;}。

大整数加减运算的C语言实现

大整数加减运算的C语言实现

大整数加减运算的C语言实现一. 问题提出培训老师给出一个题目:用C语言实现一个大整数计算器。

初步要求支持大整数的加、减运算,例如8888888888888+1112=8888888890000或1000000000000-999999999999=1。

C语言中,整型变量所能存储的最宽数据为0xFFFF FFFF,对应的无符号数为4294967295,即无法保存超过10位的整数。

注意,此处'10位'指数学中的10个数字,并非计算机科学中的10比特。

浮点类型double虽然可以存储更多位数的整数,但一方面常数字面量宽度受编译器限制,另一方面通过浮点方式处理整数精度较低。

例如:double a = 1377083362513770833626.0,b=1585054852315850548524.0; printf('res = %.0f\n', a+b);输出为res = 2962138214829621510144,而正确值应为2962138214829621382150。

既然基本数据类型无法表示大整数,那么只能自己设计存储方式来实现大整数的表示和运算。

通常,输入的大整数为字符串形式。

因此,常见的思路是将大整数字符串转化为数组,再用数组模拟大整数的运算。

具体而言,先将字符串中的数字字符顺序存入一个较大的整型数组,其元素代表整数的某一位或某几位(如万进制);然后根据运算规则操作数组元素,以模拟整数运算;最后,将数组元素顺序输出。

数组方式操作方便,实现简单,缺点是空间利用率和执行效率不高。

也可直接操作大整数字符串,从字符串末尾逆向计算。

本文实现就采用这种方式。

二. 代码实现首先,给出几个宏定义和运算结构:#include#include#include#define ADD_THRES (sizeof('4294967295')-2) //两个9位整数相加不会溢出#define MUL_THRES (sizeof('65535')-2) //两个4位整数相乘不会溢出#define OTH_THRES (sizeof('4294967295')-1) //两个10位整数相减或相除不会溢出typedef struct{ char*leftVal; char *rightVal; char operator;}MATH_OPER;基于上述定义,以下将依次给出运算代码的实现。

c语言大数处理

c语言大数处理

c语言大数处理C语言是一种广泛应用于计算机编程的高级编程语言,它具有简洁、高效、灵活等特点,被广泛应用于各个领域。

然而,C语言在处理大数时存在一些限制,因为它的基本数据类型的范围有限。

在处理大数时,我们需要采取一些特殊的方法来克服这些限制。

在C语言中,整数类型的范围通常是有限的,例如int类型的范围是-32768到32767,而long类型的范围是-2147483648到2147483647。

当我们需要处理超出这些范围的大数时,就需要使用特殊的方法。

一种常见的处理大数的方法是使用字符串来表示大数。

我们可以将大数存储在一个字符数组中,每个字符表示大数的一位。

通过使用字符串,我们可以处理任意长度的大数,而不受C语言整数类型范围的限制。

在处理大数时,我们需要实现一些基本的运算操作,例如加法、减法、乘法和除法。

下面是一个简单的例子,展示了如何使用字符串来实现大数的加法运算:```c#include <stdio.h>#include <string.h>void add(char* num1, char* num2, char* result) {int len1 = strlen(num1);int len2 = strlen(num2);int carry = 0;int i, j, k = 0;for (i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) { int digit1 = (i >= 0) ? num1[i] - '0' : 0;int digit2 = (j >= 0) ? num2[j] - '0' : 0;int sum = digit1 + digit2 + carry;result[k++] = sum % 10 + '0';carry = sum / 10;}if (carry > 0) {result[k++] = carry + '0';}result[k] = '\0';// Reverse the resultint len = strlen(result);for (i = 0, j = len - 1; i < j; i++, j--) {char temp = result[i];result[i] = result[j];result[j] = temp;}}int main() {char num1[] = "12345678901234567890";char num2[] = "98765432109876543210";char result[100];add(num1, num2, result);printf("The sum is: %s\n", result);return 0;}```在上面的例子中,我们定义了一个add函数,它接受两个大数字符串和一个结果字符串作为参数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
mid[j + i] = '\0';
mid[j + i + 1] = '\0';
if(carry != '0')
mid[j + i] = carry;
return tmp;
}
static char as_mul(char a,char b,char *c)
{
char c2,tmp;
c2 = ((a - '0') * (b - '0') + (*c - '0')) / 10 + '0';
{
char carry = '0';
char * c = 0;
char *a;
char *b;
int i = 0;
int len_a;
int len_b;
int index;
revers(a);
revers(b);
c = (char *)malloc(index + 3);
for( ; i < bindex ; i++ )
c[i] = as_sub(maxer(a,b,maxflag)[i],miner(a,b,maxflag)[i],&carry);
int len_a;
int len_b;
int index;
int bindex;
int maxflag = 0;
len_a = strlen(ca);
len_b = strlen(cb);
strcpy(a,ca);
strcpy(a,b) > 0 ? len_a : len_b;
bindex = max(a,b) > 0 ? len_b : len_a;
maxflag = max(a,b);
for( ; i < index ; i++) {
c[i] = as_sub(maxer(a,b,maxflag)[i],'0',&carry);
}
if(c[i-1] == '0') i--;
a = (char *)malloc(len_a + 2);
b = (char *)malloc(len_b + 2);
strcpy(a,ca);
strcpy(b,cb);
index = max(a,b) > 0 ? len_a : len_b;
char * c = 0;
char *a;
char *b;
int i = 0;
int index;
int bindex;
int len_a;
int len_b;
bindex = max(a,b) > 0 ? len_b : len_a;
maxflag = max(a,b);
revers(a);
revers(b);
c = (char *)malloc(index * 3);
carry = '0';
revers(mid);
cmid = add(c,mid);
strcpy(c,cmid);
#define maxer(a,b,flag) ((flag > 0) ? a : b)
#define miner(a,b,flag) ((flag > 0) ? b : a)
int max(char* a,char* b)
{
int i,len_a = strlen(a),len_b = strlen(b);
for(j = 0;j < index; j ++) {
mid[j + i] = as_mul(miner(a,b,maxflag)[i],maxer(a,b,maxflag)[j],&carry);
tmp = ((a - '0') * (b - '0') + (*c - '0')) % 10 + '0';
*c = c2;
return tmp;
}
static char* revers(char* a)
{
char* p;
else if(a[i] < b[i]) return -1;
}
return 0;
}
}
static char as_add(char a,char b,char *c)
*q = tmp;
p++;
q--;
}
return 0;
}
static char* add(char* ca,char* cb)
{
char carry = '0';
int bindex;
int maxflag = 0;
len_a = strlen(ca);
len_b = strlen(cb);
a = (char *)malloc(len_a + 2);
b = (char *)malloc(len_b + 2);
for( ; i < index ; i++) {
c[i] = as_add(maxer(a,b,maxflag)[i],'0',&carry);
}
if(carry != '0')
if (len_a > len_b) return 1;
else if (len_a < len_b) return -1;
else {
for( i = 0; i < len_a; i++) {
if(a[i] > b[i]) return 1;
mid = (char *)malloc(index * 3);
bzero(c,sizeof(c));
bzero(mid,sizeof(mid));
for(i = 0;i < bindex; i ++) {
memset(mid,'0',index * 3 - 1);
char* q;
char tmp;
p = a;
q = p + strlen(a) - 1;
while(q>p) {
tmp = *p;
*p = *q;
{
char c2,tmp;
c2 = ((a - '0') + (b - '0') + (*c - '0')) / 10 + '0';
tmp = ((a - '0') + (b - '0') + (*c - '0')) % 10 + '0';
*c = c2;
c[i++] = carry;
c[i] = '\0';
revers(c);
free(a);
free(b);
return c;
}
static char* sub(char* ca,char* cb)
if(maxflag < 0)
c[i++] = '-';
c[i] = '\0';
revers(c);
free(a);
free(b);
return c;
}
int maxflag;
len_a = strlen(ca);
len_b = strlen(cb);
a = (char *)malloc(len_a + 2);
b = (char *)malloc(len_b + 2);
strcpy(a,ca);
strcpy(b,cb);
index = max(a,b) > 0 ? len_a : len_b;
bindex = max(a,b) > 0 ? len_b : len_a;
maxflag = max(a,b);
06-4-26 14:32 天色已晚
[原创]无限大数加、减、乘、除C语言程序。
没有内存泄露,不过除法慎用。
[code]
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include "BigInt.h"
revers(a);
revers(b);
c = (char *)malloc(index + 3);
for( ; i < bindex ; i++ )
c[i] = as_add(a[i],b[i],&carry);
c2 = '1';
}
else
c2 = '0';
tmp = ((a - '0') - (b - '0') - (*c - '0')) + '0';
相关文档
最新文档