c语言课程设计实验报告长整数四则运算
⑴ 长整数四则运算,急..C语言版
问问同学老师什么的,也比在这等强啊
⑵ 用c语言编写大整数的四则运算,求大神
你可以找一下加密库的源文件来研究下,里面就有大数四则运算,曾经试着写2048位的大数四则运算,结果就写了加法,减法,和简单的没有优化的乘法就没信心写了。。。大数是用数组表示的,没有用结构体,复制来的,不知能不能运行。。
#defineMAX400
voidmy_read(int*a)
{
intlen,i,flag=0;
chars[MAX];
aa:
while(1)
{
scanf("%s",&s);
len=strlen(s);
if(s[0]=='-')flag=1;
for(i=len-flag;i>=1;i--)
{
if((s[len-i]-'0')<0||(s[len-i]-'0')>9)
{
printf(" 你输入的第%d位不合法,按任意键重新输!!",len-i+1);
getch();
gotoaa;
}
else
a[i]=s[len-i]-'0';
}
if(flag)
a[0]=-(len-1);
else
a[0]=len;
break;
}
return;
}
voidmy_print(int*a)
{
inti;
if(a[0]<0)printf("-");
if(a[0]==0)
{
printf("0");
return;
}
for(i=abs(a[0]);i>=1;i--)
printf("%d",a[i]);
printf(" ");
}
voidformat(int*a)
{
intp;
for(p=1;p<a[0]||a[p]>=10;p++)
{
if(p>=a[0])a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if(p>=a[0])a[0]=p;
return;
}
voidadd(int*a,int*b,int*c)
{
intlen,i;
if(a[0]<b[0])len=a[0];
elselen=b[0];
for(i=1;i<=len;i++)
c[i]=a[i]+b[i];
if(len<a[0])
{
for(;i<=a[0];i++)
c[i]=a[i];
c[0]=a[0];
}
else
{
for(;i<=b[0];i++)
{
c[i]=b[i];
}
c[0]=b[0];
}
format(c);
}
voidcommaltiply(int*a,intx,int*b)
{
inti;
for(i=1;i<=a[0];i++)
b[i]=a[i]*x;
b[0]=a[0];
format(b);
return;
}
voidmatiply(int*a,int*b,int*c)
{
inti,temp[MAX],j;
commaltiply(a,b[1],c);
for(i=2;i<=b[0];i++)
{
if(b[i]==0)
{
c[0]++;
for(j=c[0];j>1;j--)
c[1]=0;
}
else
{
commaltiply(a,b[i],temp);
for(j=1;j<i;j++)
commaltiply(temp,10,temp);
add(c,temp,c);
}
}
}
voiddectobin(int*a,int*b)
{
intp;
b[0]=0;
while(a[0]>0)
{
b[0]++;
b[b[0]]=a[1]%2;
p=a[0];
while(p>0)
{
if(a[p]%2&&p>1)a[p-1]+=10;
a[p]/=2;
if(a[a[0]]==0)a[0]--;
p--;
}
}
}
format1(int*a)
{
inti;
for(i=1;i<=a[0];i++)
if(a[i]<0)
{a[i]+=10;
a[i+1]-=1;
}
}
voidsub_1(int*a,int*b,int*c)
{
inti;
for(i=1;i<=b[0];i++)
c[i]=a[i]-b[i];
if(a[0]==b[0])gotoloop;
for(;i<=a[0];i++)
c[i]=a[i];
loop:
c[0]=a[0];
format1(c);
i=c[0];
while(1)
if(c[i]==0)i--;
elsebreak;
c[0]=i;
return;
}
voidsub(int*a,int*b,int*c)
{
inti,flag=0;
for(i=1;i<=a[0];i++)
if(a[i]!=b[i]){flag=1;break;}
if(flag==0)
{
c[0]=0;
return;
}
flag=0;
if(a[0]==b[0])
{
i=a[0];
while(i>0)
{
if(a[i]>b[i])
{
sub_1(a,b,c);
break;
}
if(a[i]<b[i])
{
flag=1;
sub_1(b,a,c);
break;
}
i--;
}
}
if(a[0]>b[0])
sub_1(a,b,c);
else
if(a[0]<b[0])
{
flag=1;
sub_1(b,a,c);
}
if(flag)
c[0]=-c[0];
else
c[0]=c[0];
}
voidmain()
{
inti,a[MAX],b[MAX],c[MAX];
charyn;
strat:
while(1)
{
clrscr();
printf(" ");
printf(" ************************************** ");
printf(" ** ");
printf(" *1.大整数的加法* ");
printf(" *2.大整数的减法* ");
printf(" *3.大整数的乘法* ");
printf(" *4.大整数进制转换* ");
printf(" *5.帮助?* ");
printf(" *6.退出* ");
printf(" ** ");
printf(" ************************************** ");
printf(" 请选择(1-6):");
yn=getch();
if(yn=='1'||yn=='2'||yn=='3'||yn=='4'||yn=='5'||yn=='6')break;
else
{
printf(" 输入不合法!按任意键重新输入!!!!");getch();
}
}
clrscr();
if(yn=='6')return;
if(yn=='4')
{
printf("请输入待转换的大整数:");
printf(" ");
my_read(a);
for(i=1;i<=abs(a[0]);i++)
b[i]=a[i];
b[0]=a[0];
if(a[0]<0){a[0]=-a[0];dectobin(a,c);a[0]=-a[0];c[0]=-c[0];gotoe;}
dectobin(a,c);
e:
printf("十进制:");
my_print(b);
printf("二进制:");
my_print(c);
gotoloop;
}
printf("请输入大整数A:");
my_read(a);
printf("请输入大整数B:");
my_read(b);
if(yn=='1')
{
if(a[0]<0&&b[0]<0){a[0]=-a[0];b[0]=-b[0];add(a,b,c);c[0]=-c[0];a[0]=-a[0];b[0]=-b[0];gotoc;}
if(a[0]>0&&b[0]<0){b[0]=-b[0];sub(a,b,c);b[0]=-b[0];gotoc;}
if(a[0]>0&&b[0]>0){add(a,b,c);gotoc;}
if(a[0]<0&&b[0]>0){a[0]=-a[0];sub(b,a,c);a[0]=-a[0];gotoc;}
c:
printf(" ");
printf("A=");
my_print(a);
printf(" ");
printf("B=");
my_print(b);
printf(" ");
printf("C=A+B=");
my_print(c);
gotoloop;
}
if(yn=='2')
{
if(a[0]<0&&b[0]<0){a[0]=-a[0];b[0]=-b[0];sub(b,a,c);a[0]=-a[0];b[0]=-b[0];}
if(a[0]<0&&b[0]>0){a[0]=-a[0];add(a,b,c);a[0]=-a[0];c[0]=-c[0];}
if(a[0]>0&&b[0]<0){b[0]=-b[0];add(a,b,c);b[0]=-b[0];}
if(a[0]>0&&b[0]>0)sub(a,b,c);
printf("A=");
my_print(a);
printf(" B=");
my_print(b);
printf(" C=A-B=");
my_print(c);
gotoloop;
}
if(yn=='3')
{
if(a[0]<0&&b[0]>0){a[0]=-a[0];matiply(a,b,c);a[0]=-a[0];c[0]=-c[0];gotod;}
if(a[0]>0&&b[0]<0){b[0]=-b[0];matiply(a,b,c);b[0]=-b[0];c[0]=-c[0];gotod;}
if(a[0]<0&&b[0]<0){a[0]=-a[0];b[0]=-b[0];matiply(a,b,c);a[0]=-a[0];b[0]=-b[0];gotod;}
matiply(a,b,c);
d:
printf(" A=");
my_print(a);
printf(" B=");
my_print(b);
printf(" C=A*B=");
my_print(c);
gotoloop;
}
loop:
while(1)
{
printf(" 继续计算吗?(y/n)");
yn=getch();
if(yn=='y')gotostrat;
if(yn=='n')return;
}
}
⑶ 用c语言实现长整数四则运算 高分!!!!!!
我贴个找的自己调试修改,win-tc调试成功
输入:4+(6+8)/2
输出:11.000000
中文显示乱码,我英语不行,呵呵
楼主可以根据需要适当修改
---------------------------------------------
#include<stdio.h>
#include<malloc.h>
union nuionnum
{
double num1;
char num2;
};
struct lianbiao
{
struct lianbiao *p;
union nuionnum num;
int flage;/* 标志是数字还是符号 */
};
void main()
{
char c;
struct lianbiao lianhe;
struct lianbiao *next;
printf("请输入一个计算机能识别的四则运算表达式,如:a+b*(c+d)/e\n");
while(1)
{
first:
next=&lianhe;
while((int)(c=getchar())!=10)
{
loop:
/* 将表达式放入复合链表中 */
if (c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
{
next->num.num2=c;
if (c== '+' || c== '-' )
next->flage =1;
else if(c== '*' ||c== '/' )
next->flage =2;
else if(c== '(' )
next->flage =3;
else if(c== ')' )
next->flage =4;
next->p=calloc(1,sizeof(struct lianbiao));
next=next->p;
next->p=NULL;
}
else if(c>='0'&&c<='9')
{ long int t=1;
int flag=0;
next->num.num1=c-48;
while(((c=getchar())>='0'&&c<='9')||c=='.')
{
if (flag==1 && c!='.')
{
t=t*10;
next->num.num1=next->num.num1+(c-48.0)/t;
}
else if(c>='0'&&c<='9')
next->num.num1=next->num.num1*10+c-48;
if (c=='.')
{
flag=1;
}
}
next->flage =0;
next->p=calloc(1,sizeof(struct lianbiao));
next=next->p;
next->p=NULL;
if (c=='\n')break;
goto loop;
}
else
{
printf("不是合法的算术表达式!!!\n请重新输入:\n");
while(getchar()!='\n') ;/* 设置重新输入 */
goto first;
}
}
/* 将链表中的数字和符号分别入栈 */
next=&lianhe;
{
int i=0,j=0;/* 用来标记栈的顶点 */
double arrd[100];
char arrc[2][100];
while(next->p!=NULL)
{
if (next->flage !=0&&next->num.num2==')')/* 括号的外理 */
{
while(arrc[0][i-1]!='(')/* 出栈 */
{
if (arrc[0][i-1]=='+')
{
arrd[j-2]=arrd[j-2]+arrd[j-1];
i=i-1;
j=j-1;
}
else if(arrc[0][i-1]=='-')
{
arrd[j-2]=arrd[j-2]-arrd[j-1];
i=i-1;
j=j-1;
}
else if(arrc[0][i-1]=='*')
{
arrd[j-2]=arrd[j-2]*arrd[j-1];
i=i-1;
j=j-1;
}
else if(arrc[0][i-1]=='/')
{
arrd[j-2]=arrd[j-2]/arrd[j-1];
i=i-1;
j=j-1;
}
}
i=i-1;
}
else if (next->num.num2 =='(')/* 入栈 */
{
arrc[1][i]=next->flage;
arrc[0][i]=next->num.num2;
i++;
}
else if (next->flage !=0)/* 对运算复符的理 */
{
front:
if (i>0&&next->flage<arrc[1][i-1]&&arrc[1][i-1]!=3)
{
if (arrc[0][i-1]=='*')
{
arrd[j-2]=arrd[j-2]*arrd[j-1];
i=i-1;
j=j-1;
}
else if(arrc[0][i-1]=='/')
{
arrd[j-2]=arrd[j-2]/arrd[j-1];
i=i-1;
j=j-1;
}
goto front;
}
arrc[1][i]=next->flage;
arrc[0][i]=next->num.num2;
i++;
}
else
{
arrd[j]=next->num.num1; /* 对数字的理 */
j++;
}
next=next->p;
}
while(i!=0)/* 全部入栈之后对椎的外理 */
{
if (arrc[0][i-1]=='+')
{
arrd[j-2]=arrd[j-2]+arrd[j-1];
i=i-1;
j=j-1;
}
else if (arrc[0][i-1]=='-')
{
arrd[j-2]=arrd[j-2]-arrd[j-1];
i=i-1;
j=j-1;
}
else if (arrc[0][i-1]=='*')
{
arrd[j-2]=arrd[j-2]*arrd[j-1];
i=i-1;
j=j-1;
}
else if(arrc[0][i-1]=='/')
{
arrd[j-2]=arrd[j-2]/arrd[j-1];/* 1+2*3/4+5 5 ++ 1 1.5 */
i=i-1;
j=j-1;
}
}
printf("%lf\n",arrd[0]);
}
}
}
⑷ 谁知道怎么做:长整数的四则运算
我这只有加法运算的(减法运算相当于加负数)
头文件(SLNODE.H)
#include<stdlib.h>
typedef int DataType;
typedef struct DoubleNode //定义链表元素
{
DataType data;
struct DoubleNode *prior;
struct DoubleNode *next;
}DLNode;
void InitNode(DLNode **head) //初始化链表
{
if((*head=(DLNode*)malloc(sizeof(DLNode)))==NULL)
exit(1);
(*head)->prior=*head;
(*head)->next=*head;
}
int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素X
{
DLNode *p,*nt;
int i=0;
p=head->next;
while(p!=head&&i<n)
{
p=p->next;
i++;
}
if(i!=n)
{
printf("插入位置错误\n");
return 0;
}
if((nt=(DLNode *)malloc(sizeof(DLNode)))==NULL)
exit(1);
nt->data=x;
nt->prior=p->prior;
nt->prior->next=nt;
nt->next=p;
p->prior=nt;
return 1;
}
int digit(int n) //判断整数N有几位
{
int i;
for(i=1;;n/=10,i++)
{
if(n/10==0)
return i;
}
}
void PrintNode(DLNode *head) //打印链表
{
DLNode *p=head->next;
int i;
while(p->data==0) //去掉前面的一串0
{
p=p->next;
if(p==head)
{
printf("0\n");
return;
}
}
printf("%d",p->data); //最前面的一个数进行特殊处理,不用补零
p=p->next;
while(p!=head) //打印后面的数字
{
printf(",");
if(p->data==0)
{
printf("0000");
p=p->next;
continue;
}
for(i=0;i<4-digit(p->data);i++) //补零
printf("0");
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
void DestroyNode(DLNode **head)
{
DLNode *p,*p1;
p=(*head)->next;
while(p!=*head)
{
p1=p;
p=p->next;
free(p1);
}
free(p);
head=NULL;
}
CPP文件
⑸ 高分: C语言 数据结构之长整数四则运算,要求用链表...
#include<iostream>
#include<list>
#include<string>
#include<stdexcept>
#include<sstream>
#include<iomanip>
usingnamespacestd;
structlong_int_t{
//arg_value只能包含正负号和数字
long_int_t(stringconst&arg_value):m_positive(true){
string::size_typerest=arg_value.size();
if(rest){
string::size_typepos=0;
//处理符号位,如果有的话
if(arg_value[pos]=='-'){
m_positive=false;
++pos;
--rest;
}
elseif(arg_value[pos]=='+'){
++pos;
--rest;
}
//读取数据,每次to_read位
while(rest){
string::size_typeto_read=rest%4;
to_read=to_read?to_read:4;
stringfour_digits=arg_value.substr(pos,to_read);
istringstreamtmp_stream(four_digits);
unsignedshorttmp;
if(!(tmp_stream>>tmp)){//读取失败
throwinvalid_argument(four_digits+"");
}
m_data.push_back(tmp);
pos+=to_read;
rest-=to_read;
}
}
normalize();
}
long_int_toperator-()const{
long_int_tresult(*this);
result.m_positive=!result.m_positive;
returnresult;
}
boolpositive()const{
returnm_positive;
}
private:
boolm_positive;
typedeflist<unsignedshort>data_t;
data_tm_data;
staticunsignedshortconstmolus=10000;
long_int_t(){}
voidnormalize(){
while(!m_data.empty()&&!m_data.front())m_data.pop_front();
if(m_data.empty()){
m_data.push_back(0);
}
}
friendostream&operator<<(ostream&arg_ostream,long_int_tconst&arg_value){
if(!arg_value.positive())arg_ostream<<"-";
data_t::const_iteratorit=arg_value.m_data.begin();
if(it!=arg_value.m_data.end()){
arg_ostream<<*it;
for(;++it!=arg_value.m_data.end();){
arg_ostream<<","<<setw(4)<<setfill('0')<<*it;
}
}
returnarg_ostream;
}
friendlong_int_toperator+(long_int_tconst&arg_a,long_int_tconst&arg_b){
if(arg_a.m_positive==arg_b.m_positive){//同号
if(arg_a.m_data.size()<arg_b.m_data.size()){
returnarg_b+arg_a;
}
//now:arg_a.m_data.size()>=arg_b.m_data.size()
long_int_tresult;
result.m_positive=arg_a.m_positive;
unsignedshortcarry=0;
data_t::const_reverse_iteratorit_a=arg_a.m_data.rbegin(),it_b=arg_b.m_data.rbegin();
for(;it_b!=arg_b.m_data.rend();++it_a,++it_b){
unsignedshortsum=*it_a+*it_b+carry;
carry=sum/molus;
sum%=molus;
result.m_data.push_front(sum);
}
for(;it_a!=arg_a.m_data.rend();++it_a){
unsignedshortsum=*it_a+carry;
carry=sum/molus;
sum%=molus;
result.m_data.push_front(sum);
}
if(carry)result.m_data.push_front(carry);
returnresult;
}
if(arg_a.m_positive){//arg_a>=0,arg_b<0
returnarg_a-(-arg_b);
}
else{//arg_a<0,arg_b>=0
returnarg_b-(-arg_a);
}
}
friendlong_int_toperator-(long_int_tconst&arg_a,long_int_tconst&arg_b){
if(arg_a.m_positive==arg_b.m_positive){//同号
if(arg_a.m_data.size()<arg_b.m_data.size()||
(arg_a.m_data.size()==arg_b.m_data.size()&&arg_a.m_data.front()<arg_b.m_data.front())){
//|arg_a|<|arg_b|
return-(arg_b-arg_a);
}
//now:|arg_a|>=|arg_b|
long_int_tresult;
result.m_positive=arg_a.m_positive;
unsignedshortborrow=0;
data_t::const_reverse_iteratorit_a=arg_a.m_data.rbegin(),it_b=arg_b.m_data.rbegin();
for(;it_b!=arg_b.m_data.rend();++it_a,++it_b){
unsignedshortdiff=*it_a+molus-*it_b-borrow;
borrow=1-diff/molus;
diff%=molus;
result.m_data.push_front(diff);
}
for(;it_a!=arg_a.m_data.rend();++it_a){
unsignedshortdiff=*it_a+molus-borrow;
borrow=1-diff/molus;
diff%=molus;
result.m_data.push_front(diff);
}
result.normalize();
returnresult;
}
if(arg_a.m_positive){//arg_a>=0,arg_b<0
returnarg_a+(-arg_b);
}
else{//arg_a<0,arg_b>=0
return-((-arg_a)+arg_b);
}
}
};
intmain(){
stringline;
while(getline(cin,line)){//读取一行
//识别两个参数
stringa,b,*current=&a;
for(string::size_typei=0;i!=line.size();++i){
charconstc=line[i];
if(c!=','){//逗号忽略
if(c==';')current=&b;//开始读取下一个数
elseif(c=='-'||isdigit(c))current->push_back(c);
//else不知道是什么东西,忽略
}
}
long_int_tconstint_a(a),int_b(b);
cout<<int_a<<"+"<<int_b<<"="<<(int_a+int_b)<<"
";
}
return0;
}
⑹ 帮忙做个c语言课程设计!四则运算
现在很多人都是网络复制的,骗分的
楼主三思!
⑺ C语言 长整数四则运算及阶乘问题 求代码
//加法函数
char *add(char *a,char *b){int len,i,c;int ia[1024],ib[1024],ir[1024];str2int(a,b,ia,ib,ir);if (strlen(a)>strlen(b)) len=strlen(a);else len=strlen(b);c=0;//加法运算for (i=0;i<len;i++){ir[i]=(ia[i]+ib[i]+c)%10;c=(ia[i]+ib[i]+c)/10;}if (c==1){ir[len]=1;len++;}for (i=0;i<len;i++){*(a+i)=ir[len-i-1]+48;//翻转输版出权}*(a+len)='\0';return a;}
⑻ 求助!!C语言课程设计:四则运算计算器!!
是用文件保存吗?
⑼ C语言设计:编写一个带命令行参数的程序,实现整数四则运算。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char x;
float a, b;
if (argc != 4)
{
printf("You may use program %s like this: %s 10 + 20
", argv[0], argv[0]);
return 1;
}
x = argv[2][0];
a = atof(argv[1]);
b = atof(argv[3]);
switch (x)
{
case '+':
printf("%.2f", a + b);
break;
case '-':
printf("%.2f", a - b );
break;
case '/':
if (argv[3] == 0)
{
printf("Error, You put 0 as a divisor
");
break;
}
else
{
printf("%.2f", a / b);
}
break;
case '*':
case 'x':
case 'X':
printf("%.2f", a * b);
⑽ C语言课程设计,编写一个小学生四则运算。求大神帮忙,6月7日答辩,快快的哈
尼码,早干嘛去了,用C还是C++写。
还有,100分不够