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分不夠