读书人

生手做题求指教

发布时间: 2013-09-17 13:35:59 作者: rapoo

新手做题,求指教
数据结构与算法实验题2.1 高精度整数问题
实验任务
我们知道int 表示的数据范围是-2^31 ~ 2^31 - 1,而__int64 表示的数据范围是
-2^63~2^63 - 1。而21!就将超出__int64 的范围。
现在请你计算n!-m!的结果。
数据输入
输入数据只有一行,两个数字n 和m(0<=m<=n<=100)。
数据输出
输出n!-m!的结果。
输入示例输出示例
10 5 3628680




我写了n!-m!代码,对于超出__int64 的范围怎么看啊,求教
#include <iostream>
using namespace std;
int Factorial (int a);
int main ()
{
int n,m;
cin>>n>>m;
cout<<Factorial(n)-Factorial(m)<<endl;
}
int Factorial (int a)
{
if(a==1)
return 1;
else
return a*Factorial(a-1);
} 数据结构
[解决办法]
算法优化:n!-m! = n*...*m*...*1-m*...*1 = n*(n-1)*...*(m+2)*(m+1-1)*m*...*1
自定义大整数类(数组,一个元素放一个数位),用数组模拟笔算时的进位借位等等,自己算出结果,然后再将结果数组从高位到低位依次打印到输出界面

如果这道题用你写的那点代码就能完成,那这算哪门子的“数据结构与算法实验题”?
[解决办法]

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int COMPARE(string number1, string number2) {
int i,j;

int length1 = number1.size();
int length2 = number2.size();

if(number1.size() == 0) number1 = "0";
if(number2.size() == 0) number2 = "0";

j = 0;
for(i = 0; i < length1; ++i) {
if(number1[i] == '0') ++j;
else break;
}
number1 = number1.substr(j);

j = 0;
for(i = 0; i < length2; ++i) {
if(number2[i] == '0') ++j;


else break;
}
number2 = number2.substr(j);

length1 = number1.size();
length2 = number2.size();

if(length1 > length2) {
return 1;
} else if(length1 == length2) {
if(number1.compare(number2) > 0) {
return 1;
} else if(number1.compare(number2) == 0) {
return 0;
} else {
return -1;
}
} else {
return -1;
}

return 0;
}
string PLUS(string number1,string number2) {
int i;
int length1 = number1.size();
int length2 = number2.size();

string result="";

reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end());

for(i = 0; i < length1 && i < length2; i++) {
char c = (char)(number1[i] + number2[i] - 48);
result = result + c;
}

while(i < length1) {
result = result + number1[i];
++i;
}

while(i < length2) {
result = result + number2[i];
++i;
}

int carry = 0;
for(i = 0; i < (int)result.size(); ++i) {
int value = result[i] - 48 + carry;


result[i] = (char)(value % 10 + 48);
carry = value / 10;
}

if(carry !=0 ) {
result = result + (char)(carry + 48);
}

for(i = result.size() - 1; i >= 0; i--) {
if(result[i] != '0') break;
}

result = result.substr(0, i + 1);

reverse(result.begin(), result.end());
if(result.length() == 0) result = "0";
return result;
}
string MINUS(string number1,string number2) {
int i;
string result = "";

int length1 = number1.size();
int length2 = number2.size();

if(COMPARE(number2,number1) > 0) {
return "-" + MINUS(number2, number1);
}

reverse(number1.begin(),number1.end());
reverse(number2.begin(),number2.end());

for(i = 0; i < length1 && i < length2; i++) {
char c = number1[i] - number2[i] + 48;
result = result + c;
}

if(i < length1) {
for(; i < length1; i++) {
result = result + number1[i];
}
}

int carry = 0;
for(i = 0; i < (int)result.length(); i++) {
int value = result[i] - 48 + carry;
if(value < 0) {
value = value + 10;


carry = -1;
} else carry = 0;
result[i]=(char)(value + 48);
}

for(i = result.size() - 1; i >= 0; i--) {
if(result[i] != '0')break;
}

result = result.substr(0, i+1);

reverse(result.begin(), result.end());
if(result.length()==0) result = "0";
return result;
}
string MULTIPLY(string number1, string number2) {
int i, j;
int *iresult;
int length1 = number1.size();
int length2 = number2.size();
string result = "";

reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end());

iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));

for(i = 0; i < length1; i++) {
for(j = 0; j < length2; j++) {
iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
}
}

int carry = 0;
for(i = 0; i < length1 + length2; i++) {
int value = iresult[i] + carry;
iresult[i] = value % 10;
carry = value / 10;
}

for(i = length1 + length2 - 1; i >= 0; i--) {
if(iresult[i] != 0)break;
}

for(; i >= 0; i--) {
result = result + (char)(iresult[i]+48);


}

free(iresult);

if(result == "") result = "0";
return result;
}
string factorial(string n) {
string temp = "1";
string i;
for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1")) {
temp = MULTIPLY(temp, i);
}
return temp;
}
int main(void) {
cout << factorial("100") << endl;
return 0;
}

读书人网 >C++

热点推荐