小启洋同学 发表于 2023-12-16 20:13:39

高精度算法问题

#include <iostream>
using namespace std;
int x = {0}, y = {0}, z = {0}, s = {0} ;
int main() {
        int d = 0;
        string a, b, n;
        cin >> a >> b;
        for (int i = 1; i <= a.size(); i++) {
                x = a - 48;
        }
        for (int i = 0; i <= a; i++) {
                x == x;
        }
        for (int i = 1; i <= b.size(); i++) {
                y = b - 48;
        }
        for (int i = 0; i <= a; i++) {
                y == y;
        }
        for (int i = 0; i <= max(a.size(), b.size()); i++) {
                n = x * y;
                for (int j = 1; j <= n.size(); j++) {
                        s = n - 48;
                }
                for (int i = 0; i <= s; i++) {
                        s == s;
                }
                for (int l = d; l <= max(a.size(), b.size()); l++) {
                        s == z;
                        cout << s << endl;
                }
                d++;
        }
        for (int i = 0; i <= 504; i++) {
                cout << z << endl;
        }
        return 0;
}
我想要做一个高精度乘法的算法为什么输出的全是0

FishC 发表于 2023-12-16 20:14:01

这段代码存在一些问题,让我们来逐步解决它们:

1. 首先是变量的定义不正确。变量x、y、z、s应该是数组类型,而不是单个整数。你可以将它们定义为int类型的数组。

2. 其次是缺少一对大括号来表示for循环的循环体。在for循环后面加上一对大括号{}。

3. 接下来是d变量的初始化问题。你可以在for循环之前将d初始化为0。

4. 最后是字符串a和b的输入问题。你可以使用getline函数来读取整行的字符串,而不是使用cin直接读取字符串。因为cin会在遇到空格或者换行符时停止读取。所以,如果a和b之间有空格,那么只能读取到a的值。

下面是修改后的代码:

#include <iostream>
using namespace std;

int main() {
    int x = {0};
    int y = {0};
    int z = {0};
    int s = {0};

    int d = 0;
    string a, b, n;
    getline(cin, a);
    getline(cin, b);

    for (int i = 1; i < a.length(); i++) {
      x = a - '0';
    }
   
    for (int i = 1; i < b.length(); i++) {
      y = b - '0';
    }

    for (int i = 1; i <= max(a.length(), b.length()); i++) {
      z = x + y + d;
      d = z / 10;
      z %= 10;
    }

    if (d > 0) {
      z = d;
    }

    for (int i = max(a.length(), b.length()) + 1; i >= 1; i--) {
      cout << z;
    }

    return 0;
}

希望这次的回答对你有帮助!如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

sfqxx 发表于 2023-12-16 22:43:31

本帖最后由 sfqxx 于 2023-12-16 22:45 编辑

你的代码有几个问题:

- `x == x[ i];` 这是在判断两个数是否相等,而不是赋值。

- `n = x[ i] * y[ i];` n是一个字符串, x[ i]、y[ i] 是两个整数,两者不能相乘。

- 在你的代码中,所有z[ i]的值从未被改变过,所以z[ i]永远为0; s == z这个语句是比较s和z,但是你要的应该是将s的值赋给z,应写作s = z。

这些修改你的代码后如下,进行了高精度乘法操作:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

const int MAXN = 2005;
int a={0},b={0},c={0};

int main()
{
    string str1,str2;
    cin>>str1>>str2;
    int len1=str1.length();
    int len2=str2.length();
    for(int i=len1-1;i>=0;i--)
      a=str1-'0'; //将str1倒序存储到a中,方便从个位开始逐位相乘
    for(int i=len2-1;i>=0;i--)
      b=str2-'0'; //同上
    for(int i=1;i<=len1;i++)
      for(int j=1;j<=len2;j++)
            c+=a*b; //根据乘法术算法进行累加
    for(int i=1;i<=len1+len2;i++)
    {
      c+=c/10; //进位
      c%=10; //取余数
    }
    int len=len1+len2;
    while(c==0 && len>1) len--; //去掉前导0
    for(int i=len;i>=1;i--)
      cout<<c; //逆序输出
    return 0;
}

这个程序在做高精度乘法的时候,用了竖式计算的方法,然后对数字进位。

求最佳答案{:10_254:}
页: [1]
查看完整版本: 高精度算法问题