CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

设计出一个新的数据类型完成任意整数间的基本运算

楼主zhengsy()2005-04-01 10:54:47 在 C/C++ / C++ 语言 提问

标准C++的内部数据类型int   在Win32   平台下占用4   个字节存储数据(sizeof(int)   =   4),  
  其能够表达的整数范围为:-2147483648   —   2147483647   (-2^15   —   2^15-1)。  
  现请设计出一个新的数据类型(class   MyInt),使其能够完成任意整数间的基本运算。  
  并再设计一个新的数据类型(class   ComplexInt),使其能够完成任意复数(限制条件:  
  复数的实部和虚部都均为整数)之间的基本运算。  
  要求:  
  1.   定义一个新类(class   MyInt),使其能够实现任意位整数间的加法和减法。  
  2.   定义一个新类(class   ComplexInt),用于实现任意复数(限制条件:复数的实部和  
  虚部都均为整数)间的加法和减法。  
  3.   能够通过类似于如下的语句,并在屏幕上输出正确的结果。  
  void   main(int   argc,   char*   argv[])  
  {  
  MyInt   iM("1234567890123");   //   整数对象初始化  
  MyInt   iN("-3210987654321");  
  MyInt   iResult1;  
  iResult1   =   iM;  
  iResult1   +=   iN;   //   整数加法操作  
  MyInt   iResult2   =   iM;  
  iResult2   -=   iN;   //   整数减法操作  
  //   结果输出  
  Display(iResult1);   //   iResult1:   -1976419764198  
  Display(iResult2);   //   iResult2:   4445555544444  
  //   实部:   1234567890123;虚部:   4445555544444  
  ComplexInt   ciM("1234567890123",   "4445555544444");   //   复数对象初始化  
  //   实部:   -4445555544444;虚部:   0  
  ComplexInt   ciN("-4445555544444");   //   复数对象初始化  
  ComplexInt   ciResult1   =   ciM;  
  ComplexInt   ciResult2   =   ciM;  
  ciResult1   +=   ciN;   //   复数加法操作  
  ciResult2   -=   ciN;   //   复数减法操作  
  //   结果输出  
  Display(ciResult1);  
  Display(ciResult2);  
  }  
  其中,Display   为一个全局函数,它可以根据所代入的参数类型进行相应的结果输  
  出(代入的参数是MyInt,则输出相应的整数;代入的是ComplexInt,则输出相应复  
  数的实部和虚部)。  
  得到的屏幕输出应该为:  
  This   is   MyInt::Display,   the   result   is:   -1976419764198  
  This   is   MyInt::Display,   the   result   is:   4445555544444  
  This   is   ComplexInt::Display,   the   result   is:   -3210987654321   +   4445555544444   i  
  This   is   ComplexInt::Display,   the   result   is:   5680123434567   +   4445555544444   i  
  4.   需要考虑程序的稳定性(各种错误处理)及健壮性(算法是否对所有的整数都适用),  
  不能有内存泄漏。  
  问题点数:100、回复次数:12Top

1 楼zhengsy()回复于 2005-04-02 10:25:06 得分 0

up一下。  
  我完全无思路阿Top

2 楼zengwujun(月之海 为linux入门奋斗100天)回复于 2005-04-02 10:36:03 得分 5

大整数,呵呵,这个类早就有了Top

3 楼catally(Complicated)回复于 2005-04-02 10:39:41 得分 5

就是用string做运算么  
  很多书上都有讲的Top

4 楼truewill(无处不在)回复于 2005-04-02 10:41:28 得分 5

一个char(或int)表示一个十进制位咯,浪费点无所谓啦  
   
  标准库里面好像有complex的吧  
   
  Top

5 楼pcboyxhy(-273.15℃)回复于 2005-04-02 10:42:23 得分 5

高精度计算    
  一搜一大堆Top

6 楼arrowcy(长弓手)回复于 2005-04-02 10:46:49 得分 5

一个char(或int)表示一个十进制位咯,浪费点无所谓啦  
  ===================================================  
  就是这样,自己编一下计算过程,重载一下运算符就可以了Top

7 楼zhengsy()回复于 2005-04-02 11:06:28 得分 0

什么是一个char(或int)表示一个十进制位Top

8 楼zhengsy()回复于 2005-04-02 11:41:21 得分 0

网上找不到类似的代码嘛!我想看看别人的想法……Top

9 楼lw1a2(一刀 现在改六点下班了:()回复于 2005-04-02 11:49:32 得分 65

我原先见过一个,帖子找不到了,我把代码贴一下吧  
   
  //very_long_int.h  
  #ifndef   VERYLONGINT  
  #define   VERYLONGINT  
  #include   <vector>  
  #include   <string>  
  #include   <vector>  
  #include   <iostream>  
  using   namespace   std;  
   
  class   Very_long_int  
  {  
  //后置条件:   将Very_long的数值写入outstream。WorstTime(n)是O(n),  
  //其中n是very_long是大小。  
  friend   ostream&   operator<<(ostream&   ,   const   Very_long_int   );  
   
  //前置条件:   输入是一系列位,后面跟着一个'X',忽略无效的位和字符以  
  //及空格、行尾标志。开头处没有0,除非是0自身用单个0表示。  
  //后置条件:very_long包含了非常长的整数,它的位来自instream,并返回一个  
  //对instream的引用。worstTime(n)是O(n),其中n是输入中位字符的数量。  
  friend   istream&   operator>>(istream&   instream,   Very_long_int&     very_long);  
  public:  
  //后置条件:   返回调用对象(左边的操作数)   和other_very_long(右边的操作数)  
  //的总和。worstTime(n)是O(n),其中n是调用对象和other_very_long中位数的最大值。  
  Very_long_int   operator+(const   Very_long_int&   other_very_long);  
  protected:  
  //后置条件:   如果i   >=   digits.size(),就返回0;否则返回digits   中的第i个  
  //                                                     最有效位。个位是第0个最低有效位。  
  char   least(unsigned   i)   const;  
   
  vector<char>   digits;  
  };  
  #endif  
   
  //very_long_int.cpp  
  #include   <string>  
  #include   <vector>  
  #include   <iostream>  
  #include   "very_long_int.h"  
  using   namespace   std;  
   
  istream&   operator>>   (istream&   instream,   Very_long_int&   very_long)  
  {  
  const   char   LOWEST_DIGIT_CHAR   =   '0';  
  const   char   HIGHEST_DIGIT_CHAR   =   '9';  
  const   char   SENTINEL   =   'X';  
  char   digit_char;  
  very_long.digits.erase(very_long.digits.begin(),   very_long.digits.end());  
  do  
  {  
  //读入至此已加到digits的每一位。  
  instream   >>   digit_char;  
  if((LOWEST_DIGIT_CHAR   <=   digit_char)   &&   (digit_char   <=   HIGHEST_DIGIT_CHAR))  
  very_long.digits.push_back(digit_char   -   LOWEST_DIGIT_CHAR);  
  }  
  while   (digit_char   !=   SENTINEL);  
  return   instream;  
  }  
   
  ostream&   operator<<   (ostream&   outstream,   const   Very_long_int   very_long)  
  {  
  for(unsigned   i   =   0;   i   <   very_long.digits.size();   i++)  
  outstream   <<   (int)very_long.digits[i];  
  return   outstream;  
  }  
   
  char   Very_long_int::least(unsigned   i)   const  
  {  
  if(i   >=   digits.size())  
  return   0;  
  else    
  return   digits   [digits.size()   -   i   -   1];  
  }  
   
  Very_long_int   Very_long_int::operator+(const   Very_long_int&   other_very_long)  
  {  
  unsigned   carry   =   0,  
  larger_size,  
  partial_sum;  
  Very_long_int   sum;  
  if(digits.size()   >   other_very_long.digits.size())  
  larger_size   =   digits.size();  
  else  
  larger_size   =   other_very_long.digits.size();  
  for(unsigned   i   =   0;   i   <   larger_size;   i++)  
  {  
  partial_sum   =   least(i)   +   other_very_long.least(i)   +   carry;  
  carry   =   partial_sum   /   10;  
  sum.digits.push_back(partial_sum   %   10);  
  }  
  if(carry   ==   1)  
  sum.digits.push_back(carry);  
  reverse(sum.digits.begin(),   sum.digits.end());  
  return   sum;  
  }  
   
  //very_long_int_main.h  
  #include   <iostream>  
  #include   <stdlib.h>  
  #include   "very_long_int.h"  
   
  using   namespace   std;  
   
  int   main(int   argc,   char   *argv[])  
  {  
      Very_long_int   myVeryLongInt1,   myVeryLongInt2;  
  cout   <<   "Please   input   your   very   long   int1:   ";  
  cin   >>   myVeryLongInt1;  
  cout   <<   endl   <<   "Please   input   your   very   long   int2:   "   ;  
  cin   >>   myVeryLongInt2;  
  cout   <<   endl   <<   "int1   +   int2   =   "   <<   myVeryLongInt1   +   myVeryLongInt2   <<   endl;  
   
      system("PAUSE");  
      return   0;  
  }  
   
  ------------------------------------------  
  用工程,在DevCPP下编译通过。这个只是加法,其他的运算你自己考虑一下吧,运行的时候数字后面要加X,例如:121212121212121221XTop

10 楼zhengsy()回复于 2005-04-02 12:36:42 得分 0

我们老师说不要用vectorTop

11 楼Wolf0403(废人:独活十年~心如刀割)回复于 2005-04-02 12:39:47 得分 10

不用   vector   无非是自己实现内存管理罢了。。。Top

12 楼zhengsy()回复于 2005-04-02 12:57:20 得分 0

so   it   is!  
  thksTop

相关问题

  • 超大整数运算
  • 超级菜问题:javascript怎么将页面的string类型的value值转换为整数运算 在线
  • 谁有长整数运算的类?
  • 关于长整数的四则运算
  • 谁有C#大整数运算库?
  • 大整数的运算,谢谢~~~
  • 如何用位运算实现整数四则运算
  • 利用双向循环链表实现任意长的整数的加法运算的演示程序(最好利用C的知识帮我解释一下,我有急用,谢谢
  • 谁有任意精度的整数计算类 ?
  • 求将任意长字符串转换成整数的算法

关键词

  • 数据
  • complexint
  • 整数
  • very
  • 复数
  • ciresult
  • iresult
  • myint
  • digits
  • myverylongint

得分解答快速导航

  • 帖主:zhengsy
  • zengwujun
  • catally
  • truewill
  • pcboyxhy
  • arrowcy
  • lw1a2
  • Wolf0403

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo