求C/C++的加法运算(江湖救急,急,急,急!!!)

gtlwj 2005-04-22 08:17:33
要求:
1.用C/C++语言
2.在键盘读取2-16内的数字,判断,如果不在2-16,则提示错误。
如果输入数字在2-16内,则以此输入数为基数,进行加法运算。
例如:在键盘输入7,就运行7进制的加法运算。
数1: 4362
数2: 3553 +
结果: 11245

现急求C/C++源代码,下午2点急要,希望各位大虾伸出援助之手,如分数不够,可加!
在线等待!
在线MSN:gt_lwj@hotmail.com
邮箱:gt_lwj@163.com
...全文
594 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lipotee 2005-04-23
  • 打赏
  • 举报
回复
虽然结了也来写一点。。用C++实现的。可以试着扩充,再重载一下转换.



#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef vector<int> IntVector;
class StrangeNumber
{
public:
StrangeNumber(){}
~StrangeNumber();
void Clear();
bool FormFromString(string &inputString);
int GetLength(){return m_aryNumber.size();}
int GetDigit(int position);
static bool InputBase();
friend const StrangeNumber operator+( StrangeNumber& lhs, StrangeNumber& rhs);
friend ostream& operator<<(ostream& myOstream, const StrangeNumber& oper);
protected:
static char ConvertDigitToChar(int nValue);
static int ConvertCharToDigit(char cValue);
static int s_DigitBase;
IntVector m_aryNumber;
};
int StrangeNumber::s_DigitBase = 10;
StrangeNumber::~StrangeNumber()
{
Clear();
}
void StrangeNumber::Clear()
{
m_aryNumber.clear();
}
char StrangeNumber::ConvertDigitToChar(int nValue)
{
char literal;
if(nValue<10)
literal = (char)('0' + nValue);
else
literal = (char)('a' + nValue - 10);
return literal;
}
int StrangeNumber::ConvertCharToDigit(char crtValue)
{
int retValue;
if(crtValue> '0' && crtValue < '9')
retValue = crtValue-'0';
else if(crtValue > 'a' && crtValue < 'f')
retValue= 10+crtValue - 'a';
else if(crtValue > 'A' && crtValue < 'F')
retValue = 10+crtValue - 'A';
else
retValue = -1;
return retValue;
}

ostream& operator<<(ostream& myOstream, const StrangeNumber& oper)
{

IntVector::iterator myIter = (IntVector::iterator)oper.m_aryNumber.end();
while(myIter != oper.m_aryNumber.begin() )
{
myOstream<<StrangeNumber::ConvertDigitToChar(*--myIter);
}
return myOstream;
}

bool StrangeNumber::FormFromString(string &inputString)
{
int i=0,nLength = inputString.length(),nValue;
bool bResult = false;
try
{
while(i<nLength)
{
nValue = StrangeNumber::ConvertCharToDigit(inputString[i++]);
if(nValue != -1 && nValue < StrangeNumber::s_DigitBase)
m_aryNumber.push_back(nValue);
else
throw 1;
}
bResult = true;
}
catch(...)
{
Clear();
bResult = false;
}
return bResult;
}


int StrangeNumber::GetDigit(int position)
{
int nResult = 0,Length = GetLength();
if(position > Length)
return nResult;
nResult = m_aryNumber[Length - position-1];
return nResult;
}
bool StrangeNumber::InputBase()
{
bool bResult = false;
try
{
cout<<"Please input digit(0~16):";
cin>>StrangeNumber::s_DigitBase;
if(StrangeNumber::s_DigitBase < 0 || StrangeNumber::s_DigitBase > 16)throw 1;
bResult = true;
}
catch(...)
{
cout<<"Input Error~!"<<endl;
bResult = false;
}
return bResult;
}
const StrangeNumber operator+( StrangeNumber& lhs, StrangeNumber&rhs)
{
StrangeNumber result;
int nMaxLength,nCrtOper = 0,nLeft = 0,nCarry = 0,nCrtTotal;
try
{
nMaxLength = lhs.GetLength() > rhs.GetLength()?lhs.GetLength():rhs.GetLength();
while(nCrtOper<nMaxLength)
{
nCrtTotal = lhs.GetDigit(nCrtOper) + rhs.GetDigit(nCrtOper) + nCarry;
nCarry = nCrtTotal / StrangeNumber::s_DigitBase;
nLeft = nCrtTotal - nCarry*StrangeNumber::s_DigitBase;
result.m_aryNumber.push_back(nLeft);
nCrtOper++;
}
if(nCarry > 0)
result.m_aryNumber.push_back(nCarry);
}
catch(...)
{
}
return result;
}

void main()
{
StrangeNumber Lhs, Rhs,Result;
string OhYes;
while(!StrangeNumber::InputBase());
cout<<"First Number:";
cin>>OhYes;
Lhs.FormFromString(OhYes);
cout<<"Second Number:";
cin>>OhYes;
Rhs.FormFromString(OhYes);
Result = Lhs + Rhs;
cout<<"The result is:"<<Result<<endl;
return;

}

qiqi162002 2005-04-22
  • 打赏
  • 举报
回复
#include<iostream>
#include<stdlib.h>
#include<string>
#include<vector>
using namespace std;
void str_to_vec(const string& str, vector<int>& vec)
{
for(int i=0; i<str.length();i++)
{
switch(str[i])
{
case '0': vec.push_back(0);break;
case '1': vec.push_back(1);break;
case '2': vec.push_back(2);break;
case '3': vec.push_back(3);break;
case '4': vec.push_back(4);break;
case '5': vec.push_back(5);break;
case '6': vec.push_back(6);break;
case '7': vec.push_back(7);break;
case '8': vec.push_back(8);break;
case '9': vec.push_back(9);break;
case 'a': vec.push_back(10);break;
case 'b': vec.push_back(11);break;
case 'c': vec.push_back(12);break;
case 'd': vec.push_back(13);break;
case 'e': vec.push_back(14);break;
case 'f': vec.push_back(15);break;
}
}
}
void vec_to_str(vector<int>& vec, string& str)
{
for(int i=0; i<vec.size();i++)
{
switch(vec[i])
{
case 0: str.push_back('0');break;
case 1: str.push_back('1');break;
case 2: str.push_back('2');break;
case 3: str.push_back('3');break;
case 4: str.push_back('4');break;
case 5: str.push_back('5');break;
case 6: str.push_back('6');break;
case 7: str.push_back('7');break;
case 8: str.push_back('8');break;
case 9: str.push_back('9');break;
case 10: str.push_back('a');break;
case 11: str.push_back('b');break;
case 12: str.push_back('c');break;
case 13: str.push_back('d');break;
case 14: str.push_back('e');break;
case 15: str.push_back('f');break;
}
}
}

void display(vector<int>& vec)
{
string str;
vec_to_str(vec,str) ;
for(int i=0; i<str.length(); i++)
{
cout<<str[i];
}
}


vector<int> v_add(vector<int>& num1, vector<int>& num2)
{
int off;
vector<int> result; //想差几位数
if(num1.size()>num2.size())
{
off=num1.size()-num2.size();
for(int i=0; i<off; i++) result.push_back(num1[i]);
for(int i=0; i<num2.size(); i++)
{
result.push_back(num1[off+i]+num2[i]);
}
}else{
off=num2.size()-num1.size();
for(int i=0; i<off; i++) result.push_back(num2[i]);
for(int i=0; i<num1.size(); i++)
{
result.push_back(num2[off+i]+num1[i]);
}
}
return result;
}
void format(vector<int>& vec,int base)
{
int temp=0;
vec.insert(vec.begin(),0);
for(int i=vec.size()-1; i>=0; i--)
{
if(vec[i]+temp>=base)
{
vec[i]=(vec[i]+temp)%base;
temp=1;
}else{
vec[i]+=temp;
temp=0;
}

}
if(vec[0]==0) vec.erase(vec.begin());
}

vector<int> add(string& s_num1, string& s_num2, int base)
{
vector<int> v_num1,v_num2,result;
str_to_vec(s_num1,v_num1);
str_to_vec(s_num2,v_num2);
result=v_add(v_num1,v_num2);
format(result,base);
return result;
}
void main()
{
int base;
string s_num1,s_num2;
vector<int> result;
cout<<"输入进制(2-16):";
cin>>base;
if(base>16||base<2)
{
cout<<"进制范围错误!"<<endl;
exit(1);
}
cout<<"num1=";
cin>>s_num1;
cout<<"num2=";
cin>>s_num2;
cout<<endl;
result=add(s_num1,s_num2,base);

cout<<"result=";
display(result);

system("pause");
}
//////
用VECTOR 和STRIN实现 ,无长度限制,正确显示多于十进制的数,10=a 11=b...
zengwujun 2005-04-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

void Add(int a,int b,int base,char* cc)
{
char ca[16],cb[16];
sprintf(ca,"%d",a);
sprintf(cb,"%d",b);
int la=strlen(ca);
int lb=strlen(cb);
//int lc=0;

//将短的数前面补0
if(la<lb)
memset(ca,'0',lb-la);
else
memset(cb,'0',la-lb);

la=lb=strlen(ca);
int carry=0;//进位
for(int i=la-1;i>=0;--i)
{
if(ca[i]-'0'+cb[i]-'0'+carry>=base)
{
if(ca[i]-'0'+cb[i]-'0'+carry-base>=10)//处理进制>10
ca[i]=ca[i]-'0'+cb[i]-'0'+carry-base-10+'a';
else
ca[i]=ca[i]-'0'+cb[i]-'0'+carry-base+'0';
carry=1;
}
else
{
if(ca[i]-'0'+cb[i]-'0'+carry>=10)//处理进制>10
ca[i]=ca[i]-'0'+cb[i]-'0'+carry-10+'a';
else
ca[i]=ca[i]-'0'+cb[i]-'0'+carry+'0';
carry=0;
}
}

if(carry)
{
cc[0]='1';
strcpy(&cc[1],ca);
}
else
strcpy(cc,ca);
}

void main()
{
int a=4362,b=3553;
char cc[17];
Add(a,b,16,cc);
printf("sum=%s\n",cc);
}
gtlwj 2005-04-22
  • 打赏
  • 举报
回复
TO dq2004(替补一号)
还是编译出现错误哦,无法打开包含文件
kongwe 2005-04-22
  • 打赏
  • 举报
回复
编了下,最多存放结果位数100,你可以自己改,在VC++6下通过。
程序如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int flag;
cout<<"please input the number(2-16):";
cin>>flag;
if(flag>=2&&flag<=16)
{
int a,b,sum;
cout<<"please input the first number to plus:";
cin>>a;
cout<<"the second number:";
cin>>b;
sum=a+b;
int temp=sum;
int ans[100];
for(int i=0;i<10;i++)
{
ans[i]=temp%flag;
temp=temp/flag;
if(temp==0)break;
}
for(;i>=0;i--)
{
cout<<hex<<ans[i];
}
}
else
{
cout<<"input the wrong number";
exit(0);
}
return 0;
}
顺便说一句:楼主的示例错了:4362+3553应该等于32035,害的我查了半天程序。
Cnwanglin 2005-04-22
  • 打赏
  • 举报
回复
判断十进制数字:输入的首位是0 - 9
判断八进制数字:输入的首位是0并且其后的位数是0 - 7
判断十六进制数字:输入的首位是0x或0X
dq2004 2005-04-22
  • 打赏
  • 举报
回复
我写了个
不过实现的只是最基本的
没有判断如果要8进制,输入数值9,8,a,这些等的错误
#include <iostream>
#include <string>
using namespace std;

void trun_int(string a,int carry,int *ia)
{

if(carry<=10)
{
for(int i=0;i<a.size();i++)
{
if(a[i]>=48&&a[i]<=58)
ia[i]=a[a.size()-i-1]-48;
else
{cout<<"错误的输入";
return;
}
}
}
else if(carry>10&&carry<16)
{
for(int i=0;i<a.size();i++)
{
if(a[i]>=48&&a[i]<=58)
ia[i]=(a[a.size()-i-1])-48;
else if(a[i]>=65&&a[i]<=69)
ia[i]=(a[a.size()-i-1])-65;
else
{cout<<"错误的输入";return ;}
}
}
}

void fun_add(string sa,string sb,string &result,int carry)
{
int temp[30], ia[20],ib[20];
//string result;
int i;
for( i=0;i<20;i++)
ia[i]=ib[i]=0;
for(i=0;i<30;i++)
temp[i]=0;
trun_int(sa,carry,ia);
trun_int(sb,carry,ib);


int flag=0;
flag=sa.size()>sb.size()?sa.size():sb.size();//长的在上这样比较符合我门的计算思维
for( i=0;i<flag;i++)
{
temp[i]+=(ia[i]+ib[i])%carry;
if((ia[i]+ib[i])>=carry)
temp[i+1]+=1;//进位最大是1
}
//转化为字符串
flag=sa.size()>sb.size()?sa.size():sb.size();
flag+=1;//因为加法最多进一位数
if(temp[flag-1]==0)
flag-=1;//这里判断最后一位有没有数值
for( i=0;i<flag;i++)
{
char a=temp[i]+48;
if(temp[i]>10)
a+=17;
result+=a;
cout<<"第"<<i<<"位数是"<<a<<endl;
}
cout<<result.size()<<endl;
}

int main(int argc, char* argv[])
{
string num1,num2, result;

int carry;
cout<<"carry in";
cin>>carry;
cout<<"num1,num2 in"<<endl;
cin>>num1>>num2;
fun_add(num1,num2,result,carry);
//因为写进去是添加到尾部,所以逆序输出
for(int i=0;i<result.size();i++)
cout<<result[i];

return 0;
}
defyer007 2005-04-22
  • 打赏
  • 举报
回复
up
gtlwj 2005-04-22
  • 打赏
  • 举报
回复
希望各位鼎力帮忙!谢谢!
gtlwj 2005-04-22
  • 打赏
  • 举报
回复
楼上的,编译错误哦!
zengwujun 2005-04-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

int convert(int a,int base)
{
char ca[16];
sprintf(ca,"%d",a);
int la=strlen(ca);

int sum=0,pow=1;
int carry=0;
for(int i=la-1;i>=0;--i)
{
int d=ca[i]-'0'+carry;
if(d<base)
{
sum += d * pow;
carry=0;
}
else
{
sum += (d-base)*pow;
carry=1;
}
pow=pow*10;
}
sum += carry * pow;

return sum;
}

int Add(int a,int b,int base)
{
return convert(a+b,base);
}

void main()
{
int a=4362,b=3553;
printf("sum=%d\n",Add(a,b,8));
}
gtlwj 2005-04-22
  • 打赏
  • 举报
回复
不需要很高精度的,能实现就可以。他是我一个很要好的朋友,他早早就打电话给我,但是我不会C/C++,所以来这里求救,希望各位帮帮忙,谢谢!
zhousqy 2005-04-22
  • 打赏
  • 举报
回复
mark
pcboyxhy 2005-04-22
  • 打赏
  • 举报
回复
是否需要高精度呢?
zengwujun 2005-04-22
  • 打赏
  • 举报
回复
mark
jsjjms 2005-04-22
  • 打赏
  • 举报
回复
原理实现不是很困难,

时间不够,没法给你源码,

帮你顶一下。
FromNoWhere 2005-04-22
  • 打赏
  • 举报
回复
mark

64,635

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧