大整数的四则运算高质量C语言程序文件

合集下载

四则运算器(C语言)

四则运算器(C语言)

#include<stdio.h>#include <stdlib.h> //需要用到的头文件#include <time.h> //包含日期时间处理头文件*/void main(){int x,y,all=0,r=0,e=0,result;char z;int m;printf("welcome caculator !\ninput q to end the caculator!\n");printf("1.addtest\n");printf("2.minustest\n");printf("3.multiplytest\n");printf("4.dividetest\n");printf("Please input the number from 1 to 4:\n"); //任意键进入scanf("%d",&m);srand( (unsigned)time( NULL ) ); /*随机数播种函数(产生一个以当前时间开始的随机种子)*/while ((z=getchar())!='q') //按q键(quit)退出{all++;x=rand()%50;y=rand()%50;if(m==1){printf("%d+%d=",x,y); //加法scanf("%d",&z);if (x+y==z) r++;else e++;}else if(m==2){ //减法printf("%d-%d=",x,y);scanf("%d",&z);if (x-y==z) r++;else e++;}else if(m==3){ //乘法printf("%d*%d=",x,y);scanf("%d",&z);if (x*y==z) r++;else e++;}else if(m==4){ //除法printf("%d/%d=",x,y);scanf("%d",&z);if (x/y==z) r++;else e++;}else//输入非法数字,输出错误printf("Errror!\n");result=100*r/all;//得分}printf("Y our grade is:%d\n",result);printf("all question number is %d,right is %d,error is %d\n",all,r,e); }#include<stdio.h>#include <stdlib.h>void main(){int a,b,x,y,all=0,r=0,e=0,g;char z;int m;printf("welcome !\ninput h to end the yunsuan!\n");printf("1.addtest\n");printf("2.minustest\n");printf("3.multiplytest\n");printf("4.dividetest\n");printf("请输入一个一到四的一个整数:\n"); //任意键进入scanf("%d",&m);while ((z=getchar())!='h') //按h键退出{all++;a=rand();b=rand();x=a%50;y=b%50;switch(m){case 1:{printf("%d+%d=",x,y); //加法scanf("%d",&z);if (x+y==z) r++;else e++;break;}case2:{ //减法printf("%d-%d=",x,y);scanf("%d",&z);if (x-y==z) r++;else e++;break;}case3:{ //乘法printf("%d*%d=",x,y);scanf("%d",&z);if (x*y==z) r++;else e++;break;}case4:{ //除法printf("%d/%d=",x,y);scanf("%d",&z);if (x/y==z) r++;else e++;break;}}g=100*r/all; //得分}printf("Y our grade is:%d\n",g);printf("all question number is %d,right is %d,error is %d\n",all,r,e);}。

c实现任意长整数的四则运算

c实现任意长整数的四则运算

实验题目:设计一数据结构可处理任意长度的整数概要设计1.数据结构的定义采用双向链表存储任意长整数。

双向链表的定义如下:class DblList {private:DblNode *head, *tail;DblNode *current;int sign;public:DblList(); //构造函数~DblList(); //析构函数bool CreatList(string); //生成一个双向链表,存储整数int GetCount(); //获取整数的长度void Insert(DblNode *); //从表尾插入一个结点void InsertFront(DblNode *); //从表头插入void Clear(); //清除该链表void operator+(DblList &); //实现两个任意整数的加法void operator*(DblList &); //实现两个任意整数的乘法DblList & operator=(DblList &); //重载赋值运算符int Compare(DblList &); //两个整数的绝对值比较void Display(); //任意长度整数的标准化输出};说明:数据的存储,无外乎顺序或者链表。

顺序存储时,定义数组无法实现任意长度,而且需要预设一个maxsize,不是特别的方便。

所以采用链式存储方式。

而且任意长数据通过字符串输入。

在链表的每一个结点中,数据域是在该数位上的数字大小。

2.主要功能模块的功能◆任意长整数的输入◆任意长整数的标准化输出◆两个整数的加法◆两个整数的乘法三.详细设计(主模块流程图)五、使用说明及测试结果1.使用说明:点击打开应用程序pro1.exe。

依次输入任意两个整数(例如123456,+1234567),按回车,会出现菜单,如下图:按‘1’则实现两整数的加法按‘2’则实现两整数的乘法按‘#’结束注:菜单可重复出现直至‘#’退出。

大数四则运算之减法运算-----c语言版

大数四则运算之减法运算-----c语言版

⼤数四则运算之减法运算-----c语⾔版/*分三种情况:1.减数长度⼤于被减数交换减数与被减数,输出负号,⽅便减2.减数长度等于被减数(分三种情况)a.减数⼤于被减数,类似1情况1b.减数等于被减数,两数相等,直接输出0,完成。

c.减数⼩于被减数3.减数长度⼩于被减数*/#include<stdio.h>#include<string.h>int main() {char ch1[1000], ch2[1000];int num1[1000], num2[1000], num[1000];int i, j, flag1 = 1, max, flag2 = 0;scanf("%s", ch1);scanf("%s", ch2);max = strlen(ch1);if (strlen(ch1)<strlen(ch2)) {//减数长度⼤于被减数,必定为负数flag1 = -1;max = strlen(ch2);printf("-");}if (strlen(ch1) == strlen(ch2))flag1 = 0;//确定输⼊数字的长度⽐较结果。

便于采⽤合理的运算⽅式for (i = 0; i<max; i++) {//初始化num[i] = 0;num1[i] = 0;num2[i] = 0;}for (i = strlen(ch1) - 1, j = 0; i >= 0; i--)num1[j++] = ch1[i] - '0';//将字符数组元素所对应数字存⼊整形数组for (i = strlen(ch2) - 1, j = 0; i >= 0; i--)num2[j++] = ch2[i] - '0';//分情况对数字进⾏减法运算if (flag1 == 1) {//第三种情况for (i = 0; i<strlen(ch1); i++) {num[i] = num1[i] - num2[i];if (num[i]<0) {num[i] += 10;num1[i + 1]--;}}}else if (flag1 == 0) {//第⼆种情况for (i = strlen(ch1) - 1; i <= 0; i--) {//循环结束的情况有两种 1.ch1[i]!=ch2[i] 2.遍历完数组中所有元素if (ch1[i] != ch2[i])break;}if (ch1[i]>ch2[i]) {//ch1[i]>ch2[i],⾃然相减for (i = 0; i<strlen(ch1); i++) {num[i] = num1[i] - num2[i];if (num[i]<0) {num[i] += 10;num1[i + 1]--;}}}else if (ch1[i] == ch2[i]) {//相等为0printf("0");}else {//输出负号,交换减数被减数printf("-");for (i = 0; i<strlen(ch1); i++) {num[i] = num2[i] - num1[i];if (num[i]<0) {num[i] += 10;num2[i + 1]--;}}}}else {//第⼀种情况for (i = 0; i<strlen(ch2); i++) {num[i] = num2[i] - num1[i];if (num[i]<0) {num[i] += 10;num2[i + 1]--;}}}for (i = max; i >= 0; i--) {if (num[i] <= 0 && flag2 == 0)continue;flag2 = 1;printf("%d", num[i]);}return0;}。

大数四则运算c语言 stm32f10

大数四则运算c语言 stm32f10

大数四则运算C语言(stm32f10)今天,我们来探讨一下在C语言中如何实现大数的四则运算。

大数指的是超出了计算机所能表示的范围的数,例如超过了int或long的表示范围。

在嵌入式系统中,我们常常会遇到需要进行大数运算的情况,比如在STM32F10系列的开发中。

实现大数的四则运算是一个非常有实际意义的问题。

在本文中,我们将首先介绍大数的表示方法,然后讨论在C语言中如何实现大数的加减乘除运算。

我们将以STM32F10系列的单片机为例,给出具体的代码实现并进行性能测试。

一、大数的表示方法大数可以通过数组或链表来表示。

在本文中,我们将使用数组来表示大数。

假设我们要表示一个非负整数,那么可以用一个数组来存储该整数的每一位数字,其中数组的每一位对应该整数的一位数字。

要表示xxx,我们可以用一个数组a[10]来存储这个数,即a[9]=1,a[8]=2, ..., a[0]=9。

这样,我们就可以很方便地对这个大数进行各种运算操作。

二、加法大数的加法实现起来比较简单。

我们只需要按照十进制加法的规则,从低位到高位依次相加,并且处理进位即可。

具体来说,我们可以按照以下步骤来实现大数的加法:1. 定义一个数组sum来存储相加的结果,数组大小为max(m,n)+1,其中m和n分别为两个加数的位数。

2. 从低位到高位依次相加,并且处理进位。

3. 将结果存入数组sum中,注意最高位可能还需要进位,因此需要判断并且处理这种情况。

4. 将数组sum转换为我们需要的形式,如字符串、数组等。

三、减法大数的减法实现方法与加法类似,只不过在计算过程中需要注意借位的处理。

具体来说,我们可以按照以下步骤来实现大数的减法:1. 定义一个数组diff来存储相减的结果,数组大小为max(m,n),其中m和n分别为被减数和减数的位数。

2. 从低位到高位依次相减,并且处理借位。

3. 将结果存入数组diff中,注意可能会出现负数的情况,需要做相应的处理。

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

用C语言实现超长整数的加减乘除四则运算
链表结点定义为: struct nodc{ in t node; struct node 3 nex t; } 具体处理步骤如下: ①以字符串形式输入两长整数。 ②将各字符串转换成数字链表, 链表每一结点存 储字符串中的一位数字, 转化后低位在前, 高位在后。 ③将链表 ha、hb 从前至后, 即低位至高位对应结 点相加, 并将结果存至结果链表 hc 对应结点中, 有进位 要保留记入一位, 结果链表 hc 边使用边增加新结点。 如: 输入字符串数据 1234、4567, 生成的链表 ha、 hb 及相加结果 hc 为:
转, 高位在前低位在后, 然后是取被除数的前几位和除 数作循环减法, 不够减时加一位继续减直到被除数结 束, 即化除法为减法。 除法函数中, 循环相减最后剩下 的 s 串为相除余数。
2 程序实现
2. 1 加法 char 3 add (char 3 a, char 3 b)
加法函数, 传入加数、被加数, 返回加和结果。 如传入 ab 字串为 1234、5678, 则返回加和结果为 6912 { in t i= 0, 1a= strlen (a) , lb= strlen (b) , lc= la> lb? la: lb; cha r 3 s= m a lloc (1c+ 2) ; struct node 3 ha = in itlink ( ) , 3 hb = in itlink ( ) , 3 hc = in itlink () , 3 p , 3 q, 3 h; strto link (ha, a) ; strto link (hb, b) ; 将数字字符串 a、b 转化为链表, 低 位在前高位在后 p = ha > ; nex t; q hb > nex t; p、q 分别指向加数、被加数个位结点 w h ile (p ! = NU LL && q! = NU LL ) { h m alloc (sizcof (struct node) ) ; 申请相加和结点 h > data= p = > data+ q > data+ i; 结点相加, i 为进位 i= h > data 10; 取相加进位, 加和大于 10 时为 1, 否 则为 0 h > data= h > data&10; 加和大于 10 时, 和结点只 取个位 h nex t= hc ?nex t; hc > nex t h; 将和结点 h, 插入 和链表 hc p = p > nex t; q q > nex t; 加数、被加数下移一位 } w h ile (p ! = NU LL ) 加数已结束, 被加数还有数据 { h= m a lloc (sizeof (struct node) ) ; h > da ta= p > da ta+ i; i= h > da ta 10; h > da ta= h > da ta% 10; h > nex t= hc > nex t; hc > nex t= h; p = p > nex t; } w h ilc (q! = NU LL ) 被加数已结束, 加数还有数据 { h= m a lloc (sizeof (struct node) ) ; h > da ta= q > da ta+ i; i= h > da ta 10;

C语言编写四则运算

C语言编写四则运算

C语言编写四则运算#include<stdio.h>//计算器#include<malloc.h>#define STACK_SIZE100 //max size of the stack#define STACK_INCREMENT10 //realloc sizetypedef struct FStack//stack of int{float* base;float* top;int stacksize;}FStack;void Init(FStack* s){s->base = (float*)malloc(STACK_SIZE * sizeof(FStack));if (!s->base){printf("overflow!\n");return;}s->top = s->base;s->stacksize = STACK_SIZE;}bool isEmpty(FStack* s){if (s->top == s->base){return true;}else{return false;}}void Push(FStack* s, float e){if (s->top - s->base >= s->stacksize){printf("stack is full!\nrealloc %d\n", STACK_INCREMENT);s->base = (float*)realloc(s->base, (s->stacksize +sizeof(FStack)));if (!s->base){printf("overflow!\n");return;}s->top = s->base + s->stacksize;s->stacksize += STACK_INCREMENT;}*(s->top) = e;(s->top)++;}float GetTop(FStack* s){if (s->top == s->base){printf("stack is empty!\n");return 0;}float e = *(s->top - 1);return e;}void Pop(FStack* s){if (s->top == s->base){printf("stack is empty!\n");return;}s->top--;}typedef struct CStack//stack of char{char* base;char* top;int stacksize;}CStack;void Init(CStack* s){s->base = (char*)malloc(STACK_SIZE * sizeof(CStack));if (!s->base){printf("overflow!\n");return;}s->top = s->base;s->stacksize = STACK_SIZE;}bool isEmpty(CStack* s){if (s->top == s->base){return true;}else{return false;}}void Push(CStack* s, int e){if (s->top - s->base >= s->stacksize){printf("stack is full!\nrealloc %d\n", STACK_INCREMENT);s->base = (char*)realloc(s->base, (s->stacksize +sizeof(CStack)));if (!s->base){printf("overflow!\n");return;}s->top = s->base + s->stacksize;s->stacksize += STACK_INCREMENT;}*(s->top) = e;(s->top)++;}char GetTop(CStack* s){if (s->top == s->base){printf("stack is empty!\n");return 0;}char e = *(s->top - 1);return e;}void Pop(CStack* s){if (s->top == s->base){printf("stack is empty!\n");return;}s->top--;}bool isOper(char ch){if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%') {return true;}else{return false;}}int Priority(char ch){int p;switch(ch){case'(':p = 0;break;case'+':case'-':p = 1;break;case'*':case'/':case'%':p = 2;break;}return p;}float Calculate(float f1, float f2, char oper) {float f3;switch(oper){case'+':f3 = f1 + f2;break;case'-':f3 = f1 - f2;break;case'*':f3 = f1 * f2;break;case'%':f3 = (float)((int)f1 % (int)f2);break;case'/':if (f2 == 0){printf("\nDevided by zero!");exit(1);}else{f3 = f1 / f2;}break;}return f3;}float StrtoFloat(char* str, int* pos){float fRes;int i = *pos;int k;char n[50];for(k= 0; str[i] >= '0'&& str[i] <= '9'|| str[i] == '.'; i++, k++) {n[k] = str[i];}n[k] = '\0';*pos = i;fRes = atof(n);return fRes;}bool Check(char* str){int i = 0;while (str[i] != '\0'){if (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/' && str[i] != '%' && str[i] != '.' && str[i] != '(' && str[i] != ')' && (str[i] < '0' || str[i] > '9')){return false;}i++;}return true;}void main(){char exp[100];int i;float f, f1, f2;char oper;FStack fstack;CStack cstack;Init(&fstack);Init(&cstack);printf("The expression is:");gets(exp);if (!Check(exp)){printf("input error! exit now!\n");exit(1);}for (i = 0; exp[i] != '\0' && exp[i] != -52; i++){if (!isOper(exp[i])){f = StrtoFloat(exp, &i);Push(&fstack, f);}if (isOper(exp[i])){if (!isEmpty(&cstack)){while (!isEmpty(&cstack) && Priority(exp[i]) <= Priority(GetTop(&cstack))){oper = GetTop(&cstack);Pop(&cstack);f2 = GetTop(&fstack);Pop(&fstack);f1 = GetTop(&fstack);Pop(&fstack);f = Calculate(f1, f2, oper);Push(&fstack, f);}Push(&cstack, exp[i]);}else{Push(&cstack, exp[i]);}}else if (exp[i] == '('){Push(&cstack, exp[i]);}else if (exp[i] == ')'){while (GetTop(&cstack) != '(' && !isEmpty(&cstack)){oper = GetTop(&cstack);Pop(&cstack);f2 = GetTop(&fstack);Pop(&fstack);f1 = GetTop(&fstack);Pop(&fstack);f = Calculate(f1, f2, oper);Push(&fstack, f);}Pop(&cstack);}}while (!isEmpty(&cstack)){oper = GetTop(&cstack);Pop(&cstack);f2 = GetTop(&fstack);Pop(&fstack);f1 = GetTop(&fstack);Pop(&fstack);f = Calculate(f1, f2, oper);Push(&fstack, f);}printf("\nThe result is:%f\n", GetTop(&fstack));Pop(&fstack);}。

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 }。

大整数四则运算number.cpp

大整数四则运算number.cpp
t=8;
flag=1;
}
for (i=0;a[i];i++){
mul[i]=(a[i]-'0')*t+'0';
}
mul[i]=0;
jinwei(mul);
if (flag){
char tempn[MN];
strcpy (tempn,mul);
}
else break;
}
strcpy(t1,a);
strcpy(t2,b);
numadd(t1,t2,c);
printf ("%s+%s=%s\n\n",a,b,c);
strcpy(t1,a);
strcpy(t2,b);
numsub(t1,t2,c);
int lab=la-lb;
if (comp==0){
strcpy(sub,"0");
}
else if (comp>0){
sub[la--]=0;
for (i=lb-1;i>=0;i--){
if (a[i+lab]>=b[i]){
sub[la--]=a[i+lab]-b[i]+'0';
numadd(tempn,a,mul);
}
jinwei(mul);
int len=strlen(b);
i=strlen(mul);
while (--len){
mul[i++]='0';
}
mul[i++]=0;

C语言四则运算代码

C语言四则运算代码
int right=getRand(min,max);
char sign=getRandsign();
if(sign=='-')getRightErase(&left,&right);
int answer=getAnswer(left,right,sign);
leftData[n]=left;rightData[n]=right;signData[n]=sign;answerData[n]=answer;
if(s=='/')return left/right;
}
void printSta(int r,int w,int n){
cout<<"你做对了:"<<r<<endl;
cout<<"你做错了:"<<w<<endl;
cout<<"得分"<<(float)r/n*100<<endl;
}
void printAllProblem(int l[],int r[],char s[],int a[],int n){
return rand()%(max-min+1)+min;
}
char getRandsign(){
int n=getRand(1,4);
if(n==1) return'+';
if(n==2) return'-';
if(n==3) return'*';
if(n==4) return'/';
}

c语言程序设计报告超大数据的运算

c语言程序设计报告超大数据的运算

C语言课程设计报告题目: #1 超大数据的运算学院:班级:学生: tax学号:提交日期:目录一、需求分析 (3)1.题目要求 (3)2.限制条件及具体目标 (3)二、总体设计 (3)1.完成过程 (3)2.问题与解决方法 (3)3.程序设计思想 (4)三、详细设计 (5)1.函数列表 (5)2.函数关系调用图 (5)四、程序运行结果测试与分析 (5)五、结论与心得 (9)附源代码 (9)一、需求分析1.题目要求对超大型数据(考虑负数和小数)进行存储、运算和输出打印。

运算具体要求如下:1)进行四则运算;2)整数型超大数据的阶乘;3)超大型数据某范围内孪生质数的判断输出;4)超大型数据文件的存储和读取。

2.限制条件及具体目标1)将数据要求为超大型且考虑负数与小数,即各种数据类型都要考虑,并处理超出各种数据类型所能表示范围的数据;2)运算要求包括四则运算、阶乘、孪生质数的判断;3)程序要求支持文件的存储和读取。

二、总体设计1.完成过程本程序的目标是完成超大数据(以下简称大数)的运算,考虑负数和小数意味着数据类型要带符号并且包括浮点数据,所谓超大,即超出数据类型所能保存的范围,会发生溢出的情况,其次是大数的正常显示也无法通过一般数据类型实现,主要思想是利用字符串对大数进行保存,然后分析各种要求的四则运算,阶乘运算,孪生质数判断的过程,接下来模拟运算过程编写算法即可。

在各个算法的编写过程中插入文件的创建打开与写入,从而实现文件的存储和读取。

至此本程序的功能基本编写完成。

2.问题与解决方法运算过程分析与模拟算法的编写本身比较复杂。

因为考虑负数的要求,就必须有判断符号的过程,体现在加减法的运算中,就要求程序要能根据符号的正负来选择运算方式,从而得出正确的结果,体现在乘除法的运算中,则判断是否异号进而决定计算结果的符号,并且在余数的计算中还有更复杂的进位分析,再加上考虑小数的要求,问题的复杂度就又提高一层,在乘除运算中,可以通过将浮点大数转换为整数,记录两数小数位数,计算得到的基础上再加上相应小数点即可。

c语言四则运算程序

c语言四则运算程序

c语言四则运算程序本文将介绍一个简单的C语言程序,它可以实现四则运算。

四则运算是数学学科中最基础的计算方法之一,包括加、减、乘、除四个运算符。

通过本程序,您可以输入两个数和运算符,程序将自动计算并输出结果。

具体实现方法如下:1.首先,我们需要定义三个变量,分别代表输入的两个数和运算符。

这里我们使用float类型,以支持小数计算。

2.接着,我们需要使用scanf函数从键盘读入这三个变量的值。

scanf函数可以将输入的字符转换为相应的数据类型,这里我们可以使用“%f”读取浮点数,使用“%c”读取字符。

3.接下来,我们使用switch语句对输入的运算符进行判断。

根据不同的运算符,我们执行相应的计算,最终将结果输出到屏幕上。

4.在程序的结尾,我们可以使用return 0;语句来结束程序的执行。

下面是完整的C语言四则运算程序代码:#include <stdio.h>int main() {float num1, num2, result;char op;printf('请输入两个数和运算符,用空格隔开:');scanf('%f %f %c', &num1, &num2, &op); switch (op) {case '+':result = num1 + num2;printf('%.2f + %.2f = %.2f', num1, num2, result);break;case '-':result = num1 - num2;printf('%.2f - %.2f = %.2f', num1, num2, result);break;case '*':result = num1 * num2;printf('%.2f * %.2f = %.2f', num1, num2, result);break;case '/':if (num2 == 0) {printf('除数不能为0!');} else {result = num1 / num2;printf('%.2f / %.2f = %.2f', num1, num2, result);}break;default:printf('运算符错误!');}return 0;}通过以上程序,您可以轻松地进行四则运算,提高计算效率。

C语言大数四则运算

C语言大数四则运算
char *p;
if(scmp(r, u)<0)
return NULL;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
}
return (strcmp(r, u));
}//end scmp()
//两个串表示数的减法
char *ssub(char *r, char *u)
{
unsigned int i,lr, lu, lp,c=0;
char h,hc;
for(i=0; i<lr+lu; ++i)
p[i]='0';
p[lr+lu]='\0';
for(i=lr-1; i>=0; --i)
{
c=0;
for(j=lu-1; j>=0; --j)
r[i]='\0';
for(iw=0; iw<lu+n+2; ++iw)
{
if(iw<lu)
{
cdel0(r);
lr=strlen(r);
r[lr]=u[iw];
f[lu]='.';
continue;
}
kh=0;
while(scmp(r, v)>=0)
{
p=r;
r=ssub(p, v);
{
h=r[lr-i-1]-'0'+c;
if(h>9)

C语言 大数四则运算

C语言 大数四则运算

乘法运算的实现 首先说一下乘法计算的算法,从低位向高 位乘,在竖式计算中,我们是将乘数第一 位与被乘数的每一位相乘,记录结果,之 后,用第二位相乘,记录结果并且左移一 位,以此类推,直到计算完最后一位,再 将各项结果相加。得出最后结果。
计算的过程基本上和小学生列竖式做乘法相同。 为编程方便,并不急于处理进位,而将进位问题 留待最后统一处理。 ans[i+j] = a[i]*b[j];
for (i = M-1; (i >= 0)&&(num1[i] == 0); i --) ;//找到第一个不是 0的数的位置 if (i >= 0) //从高位到低位输出每个数 for (; i >= 0; i --) printf ("%d",num1[i]); else printf ("0\n"); }
大数除法
幂运算的实现
幂的实现是最为简单的了,国为有了前面 的算法做铺垫,就是调用乘法函数,来循 环去自乘,幂指数相应减1,直到幂指数变 为0时结束。
下标
0 1
1 6
2 6
3 4
4 4
5 3
6 4
7 3
8 1
9 8
加法运算的实现
+
加数
9
9
6
8
6
7
4
6
4
5
3
4
4
3
3
2
0
0
0
被加数 1
0
1、进位为1 初始化进位为0,各对应 6 2、进位为1 位相加后再加上进位数
5
3、进位为1
2
4、进位为1
由低位向高位相加计算,直至所有运算结束

C语言课程设计报告-长整数四则运算

C语言课程设计报告-长整数四则运算
{
case '1':InputNumber(a,1);flag_n1=1;break;//输入第1个长整数
case '2':InputNumber(b,2);flag_n2=1;break;//输入第2个长整数
case 'O':
case 'o':opt=InputOperator();flag_opt=1;break;//输入运算符
void ClearPromptLine();//清除提示行的显示
void ClearWorkSpace();//清除工作区的显示
void InputNumberBox(int OneOrTwo);//指定两个输入数的输入窗口,如果超过这个范围文字将自动流动
void ResultBox();//指定计算结果的显示窗口,如果超过这个范围文字将自动流动
//将双向循环链表L复制到双向循环链表C中。
2、长整数的数据类型和和操作定义为:
typedef struct DuCiLinkNode LongIntNode,*LongInt;//采用双向循环链表为实际的存储结构
void OutputNumber(LongInt a);//输出一个长整型数
void InputNumber(LongInt a,int OneOrTwo);//输入一个长整型数
1)、输入长整数1;2)、输入长整数2;3)、输入执行的运算符;4)、计算并输出结果;5)、结束。
4、测试数据:(以加法为例)
(1)、0;0;+;应输出“0”。
(2)、-2345,6789;-7654,3211;+;应输出“-1,0000,0000”。
(3)、-9999,9999;1,0000,0000,0000;+;应输出“9999,0000,0001”.

高精度四则运算(万进制)C++

高精度四则运算(万进制)C++

压位高精(万进制)//头文件:thp.h#ifndef _cstring_#define _cstring_#include <cstring>#endif#ifndef _cstdlib_#define _cstdlib_#include <cstdlib>#endifconst int THP_MAXLEN=1000;const int THP_MAXSTRLEN=4040;const int L0=10000;class thp{friend const thp operator-(const thp&,const thp&);friend const thp operator+(const thp&,const thp&);friend const thp operator*(const thp&,const thp&);friend const thp operator/(const thp&,const thp&);friend void thpdiv(const thp&,const thp&,thp&,thp&);friend const thp operator%(const thp&,const thp&);public:const thp& operator=(const thp&);const thp& operator=(const char*);bool operator==(const thp&)const;bool operator>=(const thp&)const;bool operator<=(const thp&)const;inline bool operator!=(const thp&)const;bool operator>(const thp&)const;bool operator<(const thp&)const;inline void shl(const int);const thp& operator ++ ();inline void makeempty();const char *tostr()const;inline thp& operator-=(const thp&);thp();thp(const char*);const int thpstd();protected:int _data[THP_MAXLEN],_high,_sign;private:};// 源代码 thp.cpp#include "thp.h"const int thp::thpstd(){ int i;for(i=0;i<=_high;i++){ while(_data[i]<0){ _data[i]+=L0;_data[i+1]--;}}return(0);}const thp operator % (const thp &a,const thp &b) { thp re1,re2;thpdiv(a,b,re1,re2);return(re2);}const thp& thp::operator ++ (){ _data[0]++;if(_data[0]>=L0)this->thpstd();return(*this);}void thp::shl(const int n){ int i;for(i=_high;i>=0;i--){ _data[i+n]=_data[i];}_high+=n;if(_data[_high]==0)_high=0;}thp& thp::operator -= (const thp &o){ int tint,i,len;for(i=0;i<=_high;i++){ tint=_data[i]-o._data[i];if(tint<0){ tint+=L0;_data[i+1]--;}_data[i]=tint;}for(len=this->_high;len>=0;len--){ if(_data[len]!=0)break;if(len==0)break;}_high=len;return(*this);}void thpdiv(const thp &a,const thp &b,thp &c,thp &d) { int i;d.makeempty();c.makeempty();for(i=a._high;i>=0;i--){ d.shl(1);d._data[0]=a._data[i];while(b<=d){ d-=b;c._data[i]++;}if(i==0)break;}c._high=0;for(i=a._high;i>0;i--){ if(c._data[i]!=0){ c._high=i;break;}}}inline bool thp::operator != (const thp &o)const{ return(!(0==memcmp(this,&o,sizeof(thp))));}bool thp::operator == (const thp &o)const{ return(0==memcmp(this,&o,sizeof(thp)));}inline bool thp::operator < (const thp &o)const{ int i;if(*this==o)return(false);{ if(this->_high!=o._high)return(this->_high<o._high);for(i=this->_high;i>=0;i--){ if(this->_data[i]!=o._data[i])return(this->_data[i]<o._data[i]);if(i==0)break;}}return(false);}bool thp::operator > (const thp &o)const{ if(*this==o)return(false);return(!(*this<o));}bool thp::operator <= (const thp &o)const{ return(*this<o||*this==o);}bool thp::operator >= (const thp &o)const{ return(!(*this<o));}inline int max(int a,int b){ return(a>b?a:b);}thp::thp(){ makeempty();}thp::thp(const char *s){ *this=s;}const thp operator-(const thp &a,const thp &b){ int i,len,tint;thp re;len=max(a._high,b._high);for(i=0;i<=len;i++){ tint=a._data[i]-b._data[i]+re._data[i];if(tint<0){ tint+=L0;re._data[i+1]--;}re._data[i]=tint;}while(len>0&&re._data[len]<1)len--;re._high=len;return(re);}const thp operator/(const thp &a,const thp &b){ thp re1,re2;thpdiv(a,b,re1,re2);return(re1);}const thp operator*(const thp &a,const thp &b){ int i,j,tint,len;thp re;for(i=0;i<=a._high;i++)for(j=0;j<=b._high;j++){ tint=a._data[i]*b._data[j]+re._data[i+j];re._data[i+j]=tint%L0;re._data[i+j+1]+=tint/L0;}len=i+j;if(re._data[len+1]!=0)len++;re._high=len;return(re);}const thp operator+(const thp &a,const thp &b){ int i,len,tint;thp re;len=max(a._high,b._high);for(i=0;i<=len;i++){ tint=a._data[i]+b._data[i]+re._data[i];re._data[i]=tint%L0;re._data[i+1]=tint/L0;}if(re._data[len+1]!=0)len++;re._high=len;return(re);}const char *thp::tostr()const{ char *re;char ts[5];int i,j,tint;re=(char *)malloc(THP_MAXSTRLEN);memset(ts,0,sizeof(ts));memset(re,0,THP_MAXSTRLEN);for(i=_high;i>=0;i--){ tint=_data[i];for(j=0;j<4;j++){ ts[3-j]=tint%10+'0';tint/=10;}strcat(re,ts);}while(strlen(re)>1&&*re=='0')re++;return(re);}inline void thp::makeempty(){ memset(this,0,sizeof(thp));}const thp& thp::operator = (const char *s) { char ts[5];memset(ts,0,sizeof(ts));int len,i;makeempty();len=strlen(s);_high=(len-1)/4;i=(len-1)%4+1;strncpy(ts,s,i);s+=i;_data[_high]=atoi(ts);i=_high;while(i>0){ i--;memset(ts,0,sizeof(ts));strncpy(ts,s,4);s+=4;_data[i]=atoi(ts);}return(*this);}const thp& thp::operator = (const thp &hp) { memcpy(this,&hp,sizeof(thp));return(*this);//测试代码cpp.cpp#ifndef _iostream_#define _iostream_#include <iostream>#endif#ifndef _ctime_#define _ctime_#include <ctime>#endif#ifndef _conio_h_#define _conio_h_#include <conio.h>#endif#include "thp.h"using std::cout;using std::endl;int main(){ clock_t t1=clock();thpa="123123122344444444444234444444444444411222222333333333333333333333 333333333333333333333\ 342342333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333\235234534563452342342344444987724352345234234234000000000000000000000 00000000000000000000000000\ 666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 6\ 342342333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333\ 235234534563452342342344444987724352345234234234000000000000000000000 00000000000000000000000000\ 666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666 6\3423423333333333333333333333333333333333333333333333333333333333333 333333333333333333333333\ 235234534563452342342344444987724352345234234234000000000000000000000 00000000000000000000000000\ 666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666 6\3423423333333333333333333333333333333333333333333333333333333333333 333333333333333333333333\ 235234534563452342342344444987724352345234234234000000000000000000000 00000000000000000000000000\ 666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666 6\3423423333333333333333333333333333333333333333333333333333333333333 333333333333333333333333\ 235234534563452342342344444987724352345234234234000000000000000000000 00000000000000000000000000\ 666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666 6\ 444444444444444444444444444444444444444444444443423452234234342";thp b="23423433444444444444444444444444444444444423423423423423\ 342342333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333\ 235234534563452342342344444987724352345234234234000000000000000000000 00000000000000000000000000\ 666666666666666666666666666666666666666666666666666666666666666666666 666666666666666666666666666666666666666666666666666666666666666666666 6\3333333333323423";thp c=a/b;thp d=c*b;thp e=d+a%b;cout<<e.tostr()<<endl;cout<<"Run time="<<(clock()-t1)<<"ms"<<endl;getch();return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计题目:大整数的四则运算1. 功能简介:编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。

课程设计要求:采用模块化程序设计源程序中应有足够的注释必须上机调试通过注重算法运用,优化存储效率与运算效率需提交源程序(含有注释)及相关文件(数据或数据库文件);提交设计报告书。

2.总体结构:数据初判断运算符号加法正整数非正整转变为减法转变为乘法除法转变为退出流程图:3 .概要设计:1)加法运算利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。

如果a 和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。

如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。

2)减法运算可将减法运算转化为加法运算,只要将被减数的符号改变即可。

3)乘法运算符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c 的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。

4)除法运算利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。

4.函数功能:1.void init(int a[],int b[],int *p1,int *p2)2.功能说明:读入所要计算的数值,数据初始化3.i nt plus(int a[],int b[],int c[],int m,int n)4.功能说明:两个正整数相加3. void change(int a[],int b[],int m,int n)功能说明:当两异号数相加时,改变其符号以符合加法运算5.i nt minus(int a[],int b[],int d[],int m,int n)6.功能说明:两个正整数相减5. void minusfun(int a[],int b[],int d[],int m,int n)功能说明:判断两个异号数的相加方式7.i nt multi(int a[],int b[],int c[],int m,int n)8.功能说明:两个正整数相乘7. void print(long c[],int flag)功能说明:打印带符号flag(1为负)的long c[]数组8. int write(long a[],int flag)功能说明:将键盘敲入的数字按4位一组放入long a[],且将符号放入flag9. void mul(long a[],int first,int last,long b[],long c[])10. int compara(long a[],int first,int last,long b[])功能说明:比较数组a,b大小,first last分别为a的最高最低位11. int minusd(long a[],int first,int last,long b[],long c[],int flag)功能说明:a为被减数,first last为a最高最低位,b为减数,c为差,flag为符号12. void div(long a[],long b[],long c[],int fa)功能说明:除法,a除以b的值放入c,fa为a符号13. void menu()功能说明:打印菜单函数14. void main()功能说明:主函数,调用其余函数,计算相应功能的值并输出。

5.源程序:#include<iostream.h>#include<math.h>#include<stdio.h>#define MAX 40 //可以修改,此时最大运算位数为四十位#define N 10 //此处应为最大位数除以4void init(int a[],int b[],int *p1,int *p2) //输入{int i,j;char r,s;for(i=0;i<MAX;i++){a[i]=0;b[i]=0;}printf("请输入处理的第一个数的值:");r=getchar();if(r==45){a[0]=r;for(i=1;(r=getchar())!='\n';i++)a[i]=r-48;}else{a[1]=r-48;for(i=2;(r=getchar())!='\n';i++)a[i]=r-48;}printf("请输入处理的第二个数的值:");s=getchar();if(s==45){b[0]=s;for(j=1;(s=getchar())!='\n';j++)b[j]=s-48;}else{b[1]=s-48;for(j=2;(s=getchar())!='\n';j++)b[j]=s-48;}*p2=j;}int plus(int a[],int b[],int c[],int m,int n) //加法运算{int d[MAX]={0},i,j,k;for(i=0;i<MAX;i++) c[i]=0;if(a[1]==0){for(i=0;i<n;i++) c[i]=b[i];return(i);}if(b[1]==0){for(i=0;i<m;i++) c[i]=a[i];return(i);}for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++){d[k]=a[i]+b[j]+d[k];if(d[k]>9){d[k+1]++;d[k]=d[k]-10;}}while(i>0){d[k]=d[k]+a[i];if(d[k]>9){d[k+1]++;d[k]=d[k]-10;}i--;}while(j>0){d[k]=d[k]+b[j];if(d[k]>9){d[k+1]++;d[k]=d[k]-10;}k++;j--;}d[0]=a[0]+b[0];c[0]=d[0];if(d[k]==0)k--;for(i=1;k>0;i++,k--)c[i]=d[k];return(i);}void change(int a[],int b[],int m,int n) //变号运算{int i,j;int c[MAX];if(m<=n&&b[0]==45){for(i=1;i<m;i++)c[i]=a[i];for(i=1,j=1;j<n;i++,j++)a[i]=b[j];for(i=1,j=1;j<n;i++,j++)b[i]=c[j];for(j=i;j<MAX;j++)b[j]=0;return;}if(m>=n&&a[0]==45){a[0]=0;b[0]=45;return;}}{int c[MAX]={0},i,j,k;for(i=0;i<MAX;i++)d[i]=0;for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++){if(c[k]<0||a[i]<b[j]){c[k]=c[k]+a[i]-b[j];if(c[k]<0){c[k]+=10;c[k+1]--;}}else c[k]=a[i]-b[j];}while(i>0){c[k]=c[k]+a[i];if(c[k]<0){c[k]+=10;c[k+1]--;}k++;i--;}c[k]=a[i]+c[k];while(c[k]<=0&&k>0)k--;for(i=1;k>0;i++)d[i]=c[k--];return(i);}void minusfun(int a[],int b[],int d[],int m,int n) //判断是否两异号数相加{int i,j,f=0,g=0;if(a[1]==0){if(b[0]!=0) printf("-");for(i=1;i<n;i++)printf("%d",b[i]);printf("\n");return;if(b[1]==0){if(a[0]!=0)printf("-");for(i=1;i<m;i++)printf("%d",a[i]);printf("\n");return;}if(m==n){for(i=1;i<m;i++){if((a[i]<b[i]&&b[0]==45)||(a[i]>b[i]&&a[0]==45)) g=1;if(a[i]!=b[i]) f=1;}if(f==0){printf("0\n");return;}if(g==1){change(a,b,m,n);printf("-");j=minus(a,b,d,n,m);for(i=1;i<j;i++) printf("%d",d[i]);printf("\n");return;}else if(a[0]==45&&b[0]==0){j=minus(b,a,d,n,m);for(i=1;i<j;i++)printf("%d",d[i]);printf("\n");return;}else{j=minus(a,b,d,m,n);for(i=1;i<j;i++)printf("%d",d[i]);printf("\n");return;}if(m>n&&b[0]==45){j=minus(a,b,d,m,n);for(i=1;i<j;i++) printf("%d",d[i]);printf("\n");return;}if(m<n&&b[0]==45){change(a,b,m,n);printf("-");j=minus(a,b,d,n,m);for(i=1;i<j;i++)printf("%d",d[i]);printf("\n");return;}if(m>n&&a[0]==45){change(a,b,m,n);printf("-");j=minus(a,b,d,m,n);for(i=1;i<j;i++)printf("%d",d[i]);printf("\n");return;}if(m<n&&a[0]==45){j=minus(b,a,d,n,m);for(i=1;i<j;i++)printf("%d",d[i]);printf("\n");return;}}int multi(int a[],int b[],int c[],int m,int n) //正整数乘法运算{int d[MAX]={0},e[MAX]={0},i,j,k,r,s,x,y;for(i=0;i<MAX;i++)c[i]=0;if(m<=n){{for(r=0;r<MAX;r++){d[r]=0;e[r]=0;}for(j=n-1,k=1*s;j>0;j--,k++){d[k]=a[i]*b[j]+d[k];if(d[k]>9) {d[k+1]=d[k+1]+d[k]/10;d[k]=d[k]%10;} }if(d[k]==0)k--;y=k;for(r=1;k>0;r++,k--)e[r]=d[k];for(r=1;r<MAX;r++)d[r]=e[r];if(s==1)x=plus(c,d,e,0,y+1);elsex=plus(c,d,e,y,y+1);for(r=0;r<MAX;r++)c[r]=e[r];}}else if(m>n){for(j=n-1,s=1;j>0;j--,s++){for(r=0;r<MAX;r++){d[r]=0;e[r]=0;}for(i=m-1,k=1*s;i>0;i--,k++){d[k]=a[i]*b[j]+d[k];if(d[k]>9){d[k+1]=d[k+1]+d[k]/10;d[k]=d[k]%10;}}if(d[k]==0)k--;y=k;for(r=1;k>0;r++,k--)e[r]=d[k];if(s==1)x=plus(c,d,e,0,y+1);elsex=plus(c,d,e,y,y+1);for(r=0;r<MAX;r++)c[r]=e[r];}}return(x);}void print(long c[],int flag) //输出{int i;for(i=N-1;i>=0;i--)if(c[i])break;if(flag)printf("-");printf("%4d",c[i--]);for(;i>=0;i--){if(c[i]/1000)printf(" %4ld",c[i]);else if(c[i]/100)printf(" 0%3ld",c[i]);else if(c[i]/10)printf(" 00%2ld",c[i]);elseprintf(" 000%1ld",c[i]);}}int write(long a[],int flag) //将键盘敲入的数字按4位一组放入long a[],且将符号放入flag{char num[N*4];char temp;int i,j,k;for(i=0;i<N*4;i++){num[i]=getchar();if(num[i]==10){}if(num[i]==45){flag=(flag+1)%2;i--;}}k=0;for(j=0;j<=i/2;j++){temp=num[j];num[j]=num[i-k];num[i-k]=temp;k++;}k=1;for(j=0;j<=i;j++)switch(k){case 1:a[j/4]+=(long)(num[j]-48);k++; break;case 2:a[j/4]+=(long)(num[j]-48)*10;k++; break;case 3:a[j/4]+=(long)(num[j]-48)*100;k++; break;case 4:a[j/4]+=(long)(num[j]-48)*1000;k=1; break;}return flag;}void mul(long a[],int first,int last,long b[],long c[]) //乘法{int i,j;int max_i;long temp;for(max_i=N-1;max_i>=0;max_i--)if(b[max_i])break;for(i=0;i<=max_i;i++)if(b[i])for(j=first;j<=last;j++){temp=a[j]*b[i];c[i+j-first+1]+=((temp/10000)+(c[i+j-first]/10000));c[i+j-first]=c[i+j-first]%10000;}}int compara(long a[],int first,int last,long b[]) //比较数组a,b大小{int flag=2;int i;int k=0;int len;for(len=N-1;len>=0;len--)if(b[len])break;if((first-last)>=len){if((first-last)>len)flag=1;elsefor(i=len;i>=0;i--){if(a[first-k]>b[i]){flag=1;break;}if(a[first-k]<b[i]){flag=0;break;}k++;}}elseflag=0;returnflag;}int minusd(long a[],int first,int last,long b[],long c[],int flag) {int notchange;int i,k=0;int max;notchange=compara(a,first,last,b);{for(i=last;i<=first;i++){if(a[i]<b[k]){a[i]+=10000;a[i+1]--;}c[i]=a[i]-b[k];k++;}}else{flag=(flag+1)%2;for(max=N-1;max>=0;max--)if(b[max])break;for(i=0;i<=max;i++){if(b[i]<a[last+k]){b[i]+=10000;b[i+1]--;}c[i]=b[i]-a[last+k];k++;}}return flag;}void div(long a[],long b[],long c[],int fa) //除法{long result[N+1]={0};int len_a;int k;int i;printf("\n");print(a,fa);for(len_a=N-1;len_a>=0;len_a--)if(a[len_a])break;k=len_a;while(compara(a,len_a,0,b))while(!compara(a,len_a,k,b))k--;c[k]=1;mul(c,k,k,b,result);while(compara(a,len_a,k,result)){c[k]++;for(i=N-1;i>=0;i--)result[i]=0;mul(c,k,k,b,result);}c[k]--;for(i=N-1;i>=0;i--)result[i]=0;mul(c,k,k,b,result);minusd(a,len_a,k,result,a,0);for(i=N-1;i>=0;i--)result[i]=0;for(len_a=N-1;len_a>=0;len_a--)if(a[len_a])break;k=len_a;}}void menu() //菜单{printf("==================================大整数计算器==================================");printf("1.加法 2.减法 3.乘法 4.除法0.退出\n");printf("请从1~4中选择:");return;}void main() //主函数{int flag;int max;int fa;int fb;long ad[N],bd[N],cd[2*N];int a[MAX]={0},b[MAX]={0},c[MAX]={0},d[MAX]={0};char s;int m,n,i,j;int *p1,*p2;p1=&m;menu();s=getchar();getchar();while(1){switch(s){case '0':return;case '1':printf("格式为:a+b\n"); init(a,b,p1,p2);if(a[1]==0&&b[1]==0){printf("结果是:a+b=0\n");break;}if(a[0]==b[0]){j=plus(a,b,c,m,n);printf("结果是:a+b=");if(c[0]!=0)printf("-");for(i=1;i<j;i++)printf("%d",c[i]);}else{printf("结果是:a+b=");minusfun(a,b,d,m,n);}printf("\n");break;case '2':printf("格式为:a-b\n");init(a,b,p1,p2);if(b[0]==0)b[0]=45;else if(b[0]==45)b[0]=0;if(a[1]==0&&b[1]==0){printf("结果是:a-b=0\n");break;if(a[0]==b[0]){j=plus(a,b,c,m,n);printf("结果是:a-b=");if(c[0]!=0)printf("-");for(i=1;i<j;i++)printf("%d",c[i]);}else{printf("结果是:a-b=");minusfun(a,b,d,m,n);}printf("\n");break;case '3':init(a,b,p1,p2);if(a[1]==0||b[1]==0){printf("结果是:0\n");break;}j=multi(a,b,c,m,n);printf("结果是:");if((a[0]==45&&b[0]==0)||(b[0]==45&&a[0]==0)) printf("-");for(i=1;i<j;i++)printf("%d",c[i]);printf("\n");break;case '4':flag=fa=fb=0;for(max=0;max<N;max++)ad[max]=bd[max]=cd[max]=0;printf("请输入被除数:");fa=write(cd,fa);printf("\n请输入除数:");fb=write(bd,fb);div(cd,bd,ad,fa);flag=(fa+fb)%2;printf(" / ");print(bd,fb);printf(" = ");printf("(");print(cd,0);printf(")\n");break;}menu();s=getchar();getchar();}}6.调试结果程序的调试是指对程序的差错和排错,为了便于差错、阅读,在设计该程序的过程中添加了尽可能多的注释,这就为接下来的调试过程带来了很多方便。

相关文档
最新文档