Untitled
unknown
plain_text
2 years ago
11 kB
12
Indexable
#include <iostream>
#include<vector>
#include<string>
using namespace std;
void add(int[],int[],int,string base_k,int a[],int&lengtha,int&lengthb);
void sub(int[],int[],int,string base_k,int a[],int&lengtha,int&lengthb);
void mult(int[],int[],int,string base_k,int a[],int&lengtha,int&lengthb);
int inputnum(int[],int[],string,int&lengtha,int&lengthb);
int detectposition(int answer[]);
bool detectcarry(int answer[],string base_k);
bool detectminus(int [201]);
void output_ans(int []);
void carry(int answer[],string base_k);
int main()
{
string base_k;string option; int a[201]={0};int b[201]={0};int largenum;int answer[201]={0};int lengtha;int lengthb;int lengthk;int c1=0;
do
{
cout << "----Welcome to big number calculator----" << endl;
cout << "------------------------------------------------" << endl;
do//find base
{
c1=0;
cout << "Please enter the base-k of the number (2<=k<=16)" << endl;
cout << "base-k = ";
getline(cin,base_k);lengthk=base_k.length();
if(base_k.length()>2)//long int
{
cout << "Error! Please try again" << endl;
continue;
}
if(stoi(base_k)>16||stoi(base_k)<2)//wrong input
{
cout << "Error! Please try again" << endl;
continue;
}
for( int x=0;x<lengthk;x++)
{
if(base_k[x]>96)//a=97
{
cout<<"Error! Please try again"<<endl;
c1=1;
break;
}
else if(base_k[x]>64&&base_k[x]<91)//Upper letter A=65
{
cout<<"Error! Please try again"<<endl;
c1=1;
}
else if(base_k[x]>=48&&base_k[x]<=57)//0 to 9
{
if(base_k[x]-'0'>=stoi(base_k))
{
cout<<"Error! Please try again"<<endl;
c1=1;
break;
}
}
else
{
cout<<"Error! Please try again"<<endl;
c1=1;
break;
}
break;
}
}while(c1!=0);//wrong input
cout << "------------------------------------------------" << endl;
do
{
cout << "Please choose the function" << endl;
cout << "1.Addition" << endl;
cout << "2.Subtraction" << endl;
cout << "3.Multiplication" << endl;
cout << "0.Exit" << endl;
cout << "------------------------------------------------" << endl;
getline(cin,option);
if(!(option=="1"||option=="0"||option=="2"||option=="3"))
{
cout<<"Error! Please try again"<<endl;
}
}while(!(option=="1"||option=="0"||option=="2"||option=="3"));//wrong input
if(option=="1")
{
cout<<"----Now for Addition----"<<endl;
largenum=inputnum(a,b,base_k,lengtha,lengthb);
answer[201]={0};
add(a,b,largenum,base_k,answer,lengtha,lengthb);
cout<<"Result a+b = ";
output_ans(answer);
}
if(option=="2")
{
cout<<"----Now for Subtraction----"<<endl;
largenum=inputnum(a,b,base_k,lengtha,lengthb);
answer[201]={0};
sub(a,b,largenum,base_k,answer,lengtha,lengthb);
cout<<"Result a-b = ";
output_ans(answer);
}
if(option=="3")
{
cout<<"----Now for Multiplication----"<<endl;
largenum=inputnum(a,b,base_k,lengtha,lengthb);
answer[201]={0};
mult(a,b,largenum,base_k,answer,lengtha,lengthb);
cout<<"Result a*b = ";
output_ans(answer);
}
if(option=="0")
{
cout<<"Good bye!";
return 0;
}
}while(true);
return 0;
}
int inputnum(int a[201],int b[201],string base_k,int&lengtha,int&lengthb)// confirmed correct
{
for(int i=0;i<201;i++)
{
a[i]=0;b[i]=0;
}
string inputa;string inputb;int c1=1;
cout<<"Please enter two numbers."<<endl;
do// input a start
{
c1=0;
cout<<"a = ";
getline(cin,inputa);
lengtha=inputa.size();
for(int i=200, x=inputa.length()-1;i>=201-inputa.length();i--,x--)
{
if(inputa[x]>96)//a=97
{
if(inputa[x]-87>=stoi(base_k))//wrong
{
cout<<"Wrong input a! Please enter again!!!"<<endl;
c1=1;
break;
}
}
else if(inputa[x]>64&&inputa[x]<91)//Upper letter A=65
{
if(inputa[x]-55>=stoi(base_k))//wrong
{
cout<<"Wrong input a! Please enter again!!!"<<endl;
c1=1;
break;
}
}
else if(inputa[x]>=48&&inputa[x]<=57)//0 to 9
{
if(inputa[x]-'0'>=stoi(base_k))
{
cout<<"Wrong input a! Please enter again!!!"<<endl;
c1=1;
break;
}
}
else
{
cout<<"Wrong input a! Please enter again!!!"<<endl;
c1=1;
break;
}
}
}while(c1!=0);
for(int i=200 ,x=inputa.length()-1;i>=201-inputa.length();i--,x--)//input a value
{
if(inputa[x]>96)
{
a[i]=(static_cast<int>(inputa[x]-87));
}
else if(inputa[x]>64&&inputa[x]<91)
{
a[i]=(static_cast<int>(inputa[x]-55));
}
else //0 to 9
{
a[i]=(static_cast<int>(inputa[x]-'0'));
}
}
do// input b start
{
c1=0;
cout<<"b = ";
getline(cin,inputb);
lengthb=inputb.size();
for(int i=200 , x=inputb.length()-1;i>=201-inputb.length();i--,x--)
{
if(inputb[x]>96)//a=97
{
if(inputb[x]-87>=stoi(base_k))//wrong
{
cout<<"Wrong input b! Please enter again!!!"<<endl;
c1=1;
break;
}
}
else if(inputb[x]>64&&inputa[x]<91)//Upper letter A=65
{
if(inputb[x]-55>=stoi(base_k))//wrong
{
cout<<"Wrong input b! Please enter again!!!"<<endl;
c1=1;
break;
}
}
else if(inputb[x]>=48&&inputb[x]<=57)//0 to 9
{
if(inputb[x]-'0'>=stoi(base_k))
{
cout<<"Wrong input b! Please enter again!!!"<<endl;
c1=1;
break;
}
}
else
{
cout<<"Wrong input b! Please enter again!!!"<<endl;
c1=1;
break;
}
}
}while(c1!=0);
for(int i=200 , x=inputb.length()-1;i>=201-inputb.length();i--,x--)//input b value
{
if(inputb[x]>96)
{
b[i]=(static_cast<int>(inputb[x]-87));
}
else if(inputa[x]>64&&inputb[x]<91)
{
b[i]=(static_cast<int>(inputb[x]-55));
}
else //0 to 9
{
b[i]=(static_cast<int>(inputb[x]-'0'));
}
}
if(lengtha>lengthb)
{
return lengtha;
}
else
return lengthb;
}
void add(int a[],int b[],int largenum,string base_k,int answer[201],int &lengtha,int &lengthb)
{
for(int i=0;i<201;i++)
{
answer[i]=0;
}
for(int i=200;i>=201-lengtha;i--)
{
answer[i]=a[i];
}
for(int i=200;i>=201-lengthb;i--)
{
answer[i]+=b[i];
}
carry(answer,base_k);
}
void sub(int a[],int b[],int largenum,string base_k,int answer[201],int&lengtha,int&lengthb)
{
int carry[201];
for(int i=0;i<201;i++)
{
answer[i]=0;
}
for(int i=200;i>=201-largenum;i--)//minus
{
answer[i]=a[i]-b[i];
}
do
{
for(int i=200;i>=0;i--)// borrow
{
if(answer[i]<0)
{
answer[i-1]-=1;
answer[i]+=stoi(base_k);
}
}
}while(detectminus(answer));
}
bool detectminus(int answer[])
{
for(int i=0;i<201;i++)
{
if(answer[i]<0)
{
return true;
}
}
return false;
}
void mult(int a[],int b[],int largenum,string base_k,int answer[201],int&lengtha,int&lengthb)
{
int start=200;int counter=0;
for(int i=0;i<201;i++)
{
answer[i]=0;
}
for(int x=200;x>=201-lengthb;x--)
{
start=200-counter;
for(int i=200;i>=201-lengtha;i--)
{
answer[start]+=a[i]*b[x];
start--;
}
counter++;
}
carry(answer,base_k);
}
bool detectcarry(int answer[],string base_k)
{
for(int i=0;i<201;i++)
{
if(answer[i]>=stoi(base_k))
{
return true;
}
}
return 0;
}
int detectposition(int answer[])
{
for(int i=0;i<201;i++)
{
if(answer[i]!=0)
{
return 201-i;
}
}
return 1;
}
void output_ans(int answer[])
{
for(int i=201-detectposition(answer);i<=200;i++)// output function need ABC (65,66,67)
{
if(answer[i]<=9)
{
cout<<answer[i];
}
else
{
cout<<static_cast<char>(answer[i]+55);
}
}
cout<<"\n"<<endl;
}
void carry(int answer[],string base_k)
{
int carry[201]={0};
do
{
for(int i=200;i>=0;i--)// carry out
{
carry[i]=answer[i]/stoi(base_k);
answer[i]%=stoi(base_k);
}
for(int i=200;i>=0;i--)
{
answer[i-1]+=carry[i];
}
}while(detectcarry(answer,base_k));
}
Editor is loading...
Leave a Comment