设计出一个新的数据类型完成任意整数间的基本运算
标准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




