新手做题,求指教

is_bug 2013-09-13 11:07:45
数据结构与算法实验题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);
}
...全文
180 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
is_bug 2013-09-16
  • 打赏
  • 举报
回复
#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) { string n,m,a,b,c; cin>>n>>m; a=factorial(n); b=factorial(m); for(int i=a.size()-1;i>=0;i--) { int j; j=b.size()-1; if(j>=0) { c[i]=a[i]+b[j]; j--; } else c[i]=a[i]; } cout <<c<< endl; return 0; } 为什么运行不了啊
is_bug 2013-09-14
  • 打赏
  • 举报
回复
要实现两string相减怎么办啊,如果再转换成int又不行了
is_bug 2013-09-14
  • 打赏
  • 举报
回复
这,有点复杂啊。
赵4老师 2013-09-13
  • 打赏
  • 举报
回复
#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;
}
is_bug 2013-09-13
  • 打赏
  • 举报
回复
我只学过C和C++,感觉你们说的有点陌生,怎么办啊
max_min_ 2013-09-13
  • 打赏
  • 举报
回复
先用unsigned long long 吧! 如果还是不行的话吧! 就大数处理吧!
绝版紫太狼 2013-09-13
  • 打赏
  • 举报
回复
弄个数组、高位低位存放,然后输出
is_bug 2013-09-13
  • 打赏
  • 举报
回复
才学一个礼拜数据结构与算法,所以是有点不懂,求指教,能说明的详细些吗
baichi4141 2013-09-13
  • 打赏
  • 举报
回复
算法优化:n!-m! = n*...*m*...*1-m*...*1 = n*(n-1)*...*(m+2)*(m+1-1)*m*...*1 自定义大整数类(数组,一个元素放一个数位),用数组模拟笔算时的进位借位等等,自己算出结果,然后再将结果数组从高位到低位依次打印到输出界面 如果这道题用你写的那点代码就能完成,那这算哪门子的“数据结构与算法实验题”?
is_bug 2013-09-13
  • 打赏
  • 举报
回复
求指教,求指教啊

64,654

社区成员

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

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