
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)