求用C语言写的“大整数的四则运算”程序源代码,请看详细描述,刷分勿近!

求用C语言写的“大整数的四则运算”程序源代码,请看详细描述,刷分勿近!,第1张

/////这个是C++的,C++下比较模块化一点用的是字符串存储整数,比数组存储容易实现点。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////1. 输入形式为:A[空格或换行]O[空格或换行]B

//// 2. 1中A、B为大数,O为运算符(如输入:123456789 / 432432)

//// 3. 既然处理大数,就没必要输入小数点位了

//// 4.加减不能处理负号,乘除可以

//// 5. 用于学习交流,若发现错误或不妥之处可联系

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include<iostream>

#include<string>

using namespace std

class BigFigure{

string num1,num2

string outcome

int precision

char operation

public:

BigFigure(){

num1=num2="0"

outcome="0"

precision=5

}

string&plus(string &, string &)

string&subtration(string &, string &)

string&multiplication(string &, string &)

string&division(string &, string &)

void show()

void BigFigureInterface()

string &revese(string&)

friend istream&operator>>(istream&i, BigFigure&a){

return i>>a.num1>>a.operation>>a.num2

}

~BigFigure(){ }

}

void BigFigure::show(){

cout<<"Result: "<<outcome<<endl

}

void BigFigure::BigFigureInterface(){

BigFigure a

cout<<"*********************************************************/n"

cout<<" Welcome... /n"

cout<<"Four Arithmetic Operations of Big Figures/n"

cout<<"*********************************************************/n/n"

cout<<"Notes:/n"

cout<<" 1. 输入形式为:A[空格或换行]O[空格或换行]B。/n"

cout<<" 2. 1中A、B为大数,O为运算符(如输入:123456789 / 432432)。/n"

cout<<" 3. 既然处理大数,就没必要输入小数点位了。/n"

cout<<" 4. 加减不能处理负号,乘除可以。/n"

cout<<" 5. 用于学习交流,若发现错误可联系519916178@qq.com。/n/n"

cout<<"Now Start, Input 0 0 0 to end if you want to quit!/n/n"

cout<<"[BigFigure #] "

cin>>a

while(a.operation!='0'){

switch(a.operation){

case '+': a.plus(a.num1, a.num2)

a.show()break

case '-': a.subtration(a.num1, a.num2)

a.show()break

case '*': a.multiplication(a.num1, a.num2)

a.show()break

case '/': a.division(a.num1, a.num2)

a.show()break

default:cout<<a.operation<<" is not Arithmetic Operation./n"

}

cout<<"[BigFigure #] "

cin>>a

}

system("cls")

cout<<"/n/n/n/n/n/n/t/t Quited.../n/n/n/n/n/n/n"

system("pause")

}

string& BigFigure::revese(string&s){

char c

int t=s.size()

for(int i=0i<t/2i++){

c=s[i]

s[i]=s[t-i-1]

s[t-i-1]=c

}

return s

}

string&BigFigure::plus(string &str1, string &str2){//加法运算,未处理符号

int min=0,i,t=0

string temp

outcome.clear()

str1=revese(str1)

str2=revese(str2)

min=str1.size()<str2.size() ? str1.size() : str2.size()

for(i=0i<mini++){

temp+=(str1[i]+str2[i]-96+t)%10+48

t=(str1[i]+str2[i]-96+t)/10

}

if(min==str1.size()){

while(i<str2.size()){

temp+=(str2[i]+t-48)%10+48

t=(str2[i]-48+t)/10

i++

}

if(t) temp+='1'

}

else{

while(i<str1.size()){

temp+=(str1[i]+t-48)%10+48

t=(str1[i]-48+t)/10

i++

}

if(t) temp+='1'

}

outcome=revese(temp)

return outcome

}

string &BigFigure::subtration(string &str1, string &str2){//减法运算,未处理符号

int min=0,flag,i,t=0

string temp

outcome.clear()

if(str1.size()>str2.size() || (str1.size()==str2.size() &&str1.compare(str2)==1)){

str1=revese(str1)

str2=revese(str2)

flag=0

min=str2.size()

}

else if(str1.size()==str2.size()){

if(!str1.compare(str2)){

outcome='0'

return outcome

}

if(str1.compare(str2)==-1){

temp=str1

str1=revese(str2)

str2=revese(temp)

flag=1

min=str2.size()

}

}

else{

temp=str1

str1=revese(str2)

str2=revese(temp)

flag=1

min=str2.size()

}

temp.clear()

for(i=0i<mini++){

if(str1[i]-t<str2[i]){

temp+=str1[i]+10-t-str2[i]+48

t=1

}

else{

temp+=str1[i]-t-str2[i]+48

t=0

}

}

while(i<str1.size()){

if(!t){

while(i<str1.size()){

temp+=str1[i]

i++

}

break

}

if(str1[i]!='0'){ temp+=str1[i]-tt=0}

else temp+='9'

i++

}

string s

for(unsigned int k=temp.size()-1k>=0k--){

if(temp[k]!='0'){

for(int n=kn>=0n--)

s+=temp[n]

break

}

}

if(flag) s='-'+s

outcome=s

return outcome

}

string&BigFigure::multiplication(string &str1, string &str2){//乘法运算,已处理符号

char c='0',flag=0

string temp1,temp2="0"

if(str1[0]=='0' || str2[0]=='0'){

outcome="0"

return outcome

}

if(str1[0]=='-'){ flag++str1.erase(0,1)}

if(str2[0]=='-'){ flag++str2.erase(0,1)}

str1=revese(str1)

str2=revese(str2)

for(unsigned int i=0i<str2.size()i++){

c='0'

for(unsigned int j=0j<str1.size()j++){

temp1+=((str2[i]-48)*(str1[j]-48)+c-48)%10+48

c=((str2[i]-48)*(str1[j]-48)+c-48)/10+48

}

if(c!='0') temp1+=c

temp1=revese(temp1)

for(int k=0k<ik++)

temp1+='0'

temp2=plus(temp1, temp2)

temp1.clear()

}

if(flag%2) temp2='-'+temp2

outcome=temp2

return outcome

}

string&BigFigure::division(string &str1, string &str2){//除法运算,已处理符号

int str=0,flag=0,flag1=0,flag2=0

string temp,temps,tempt

if(str2=="0"){

outcome="Inf"

return outcome

}

if(str2=="1" || str1=="0"){

outcome=str1

return outcome

}

if(str1[0]=='-'){ flag++str1.erase(0,1)}

if(str2[0]=='-'){ flag++str2.erase(0,1)}

for(unsigned int i=0i<str1.size()i++){//整除处理

str=0

temp+=str1[i]

if(temp[0]=='0') temp.erase(0,1)

if(temp.size()>str2.size() ||

(temp.size()==str2.size() &&temp.compare(str2)>=0)){

while(temp.size()>str2.size() ||

(temp.size()==str2.size() &&temp.compare(str2)>=0)){

tempt=str2

temp=subtration(temp, tempt)

str++

}

temps+=str+48

}

else if(temp.size()==str2.size() &&temp.compare(str2)==0) temps+='1'

else temps+='0'

}

flag1=temps.size()

if(temp!="0" &&precision) temps+='.'

for(int i=0i<=precision &&temp!="0"i++){//小数后位的处理

str=0

temp+='0'

if(temp.size()>str2.size() ||

(temp.size()==str2.size() &&temp.compare(str2)>=0)){

while(temp.size()>str2.size() ||

(temp.size()==str2.size() &&temp.compare(str2)>=0)){

tempt=str2

temp=subtration(temp, tempt)

str++

}

temps+=str+48

}

else if(temp.size()==str2.size() &&temp.compare(str2)==0) temps+='1'

else temps+='0'

}

flag2=temps.size()-2

if(temps[temps.size()-1]>='5' &&flag2-flag1==precision){//四舍五入处理

temps.erase(flag1,1)

temps.erase(temps.size()-1, 1)

temp="1"

temps=plus(temps, temp)

if(temps.size()>flag2) temps.insert(flag1+1, 1, '.')

else temps.insert(flag1, 1, '.')

}

else if(flag2-flag1==precision) temps.erase(temps.size()-1, 1)

temp.clear()

for(unsigned int k=0k<temps.size()k++){//左端去零处理

if(temps[k]!='0' || temps[k+1]=='.'){

for(int n=kn<temps.size()n++)

temp+=temps[n]

break

}

}

if(flag%2) temp='-'+temp

outcome=temp

return outcome

}

int main(){//主函数

BigFigure a

a.BigFigureInterface()

return 0

#include "stdio.h"

main()

{int x,n,i<br/>long s=1<br/>printf("please input x and n:")<br/>scanf("%d%d",&x,&n)<br/>for(i=1i<=ni++) <br/>s*=x<br/>printf("%d^%d=%d",x,n,s)<br/>}

一个数的任意次方

1、大数就是位数多,数值大的意思。通常来说c语言里的基本数据类型范围是有限的,如long型的最大只能表示几十亿,几十亿也就11位数字长度而已。如果用100长的数组表示,假设数组一个元素存数字的一位,那么总位数可以达到100位,这是基本数据类型无法表示的。

2、例程:

#include"stdio.h"

int getlength(char a[]){

 int i=0

 while(a[i])

  i++

 return i

}/*返回字符串的长度*/

int chartoint(char a){

 return a-48

}/*将字符编程整形*/   

void creatarray(char a[],char b[]){

 printf("请输入第一个数:")

 scanf("%s",a)

 printf("请输入第二个数:")

 scanf("%s",b)

}/*创建数组*/

void go(char a[],char b[],int s[]){

 int alength=getlength(a)

 int blength=getlength(b)

 int i=alength-1

 int j=blength-1

 int k/*s数组下标*/

 int slength

 if(alength>blength)

  slength=alength

 else

  slength=blength

 k=slength

 while(i>=0&&j>=0)

  s[k--]=chartoint(a[i--])+chartoint(b[j--])

 while(i>=0)

  s[k--]=chartoint(a[i--])

 while(j>=0)

  s[k--]=chartoint(b[j--])

 k=slength

 while(k>=2){

  if(s[k]>=10){

   s[k-1]++

   s[k]-=10

  }

  k--

 }

 printf("两数之和为:")

 if(s[1]>=10){

  s[0]=1

  s[1]-=10

  for(i=0i<=slengthi++)

   printf("%d",s[i])

 }

 else{

  for(i=1i<=slengthi++)

   printf("%d",s[i])

 }

 printf("\n")

}

void main(){

 char a[1000],b[1000]

 int s[1000]

 int lab

lab1: creatarray(a,b)

 go(a,b,s)

 printf("请输入1继续(想退出按其他数字键):")

 scanf("%d",&lab)

 if(lab==1)

  goto lab1

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12160630.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存