Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印正在运行的产品的代码 如何创建C++代码,打印每第三个数字的运行产品。< /P>_C++_Multiplication - Fatal编程技术网

打印正在运行的产品的代码 如何创建C++代码,打印每第三个数字的运行产品。< /P>

打印正在运行的产品的代码 如何创建C++代码,打印每第三个数字的运行产品。< /P>,c++,multiplication,C++,Multiplication,我不知道我是否理解它。不知道您在运行什么(32位体系结构,64位?),但您可能会溢出一个int。您的答案将变得非常大。变量sum溢出。即使将其设置为无符号long也最多只能处理136个字符。使用双 >代码>和> /COD>将使您接近481——但C++中没有可用的数据类型将一直处理到500。 如果绝对必须达到500,则需要使用能够支持大整数值的类。您不会说您使用的是什么平台和编译器,但可以看看类似的。无符号长产品(100); 对于(未签名的长i(103);i我不确定是否可以接受,但这会打印一个产品

我不知道我是否理解它。

不知道您在运行什么(32位体系结构,64位?),但您可能会溢出一个int。您的答案将变得非常大。

变量
sum
溢出。即使将其设置为
无符号long
也最多只能处理136个字符。使用<代码>双<代码> >代码>和> /COD>将使您接近481——但C++中没有可用的数据类型将一直处理到500。 如果绝对必须达到500,则需要使用能够支持大整数值的类。您不会说您使用的是什么平台和编译器,但可以看看类似的。

无符号长产品(100);

对于(未签名的长i(103);i我不确定是否可以接受,但这会打印一个产品(在所有格式都没有指定之后,对吧?)

无符号长积=1;
std::载体fct;

对于(int i=100;i使用整数数据类型可以得到的最大数是, 无符号长整型b=0xFFFFFFFFFFFFFF;(18446744073709551615)

在你的情况下,结果甚至比这个数字还要大

这就是这个问题的症结所在。您可能必须找到一种处理大量数据的方法。我建议您找到现有的API或算法

我已经写了一个程序,可以做到这一点…我没有测试这个边缘的情况下,可以有一个更好的方法来做到这一点

现在,

#include <iostream>
#include <deque>

using namespace std;

void print_num(deque<int> &num) {
  for(int i=0;i < num.size();i++) {
    cout<<num[i];
  }
  cout<<endl;
}

deque<int> sum(deque<int> &oppA, deque<int> &oppB) {
  if (oppA.size() == 0) return oppB;
  if (oppB.size() == 0) return oppA;

  deque<int> result;
  unsigned int carry = 0;

  deque<int>::reverse_iterator r_oppA = oppA.rbegin();
  deque<int>::reverse_iterator r_oppB = oppB.rbegin();
  while ((r_oppA != oppA.rend()) && (r_oppB != oppB.rend())) {

    int tmp = *r_oppA + *r_oppB + carry;
    result.push_front(tmp % 10);
    carry = tmp / 10;

    r_oppB++;
    r_oppA++;

  }
  while (r_oppA != oppA.rend()) {
    int tmp = *r_oppA + carry;
    result.push_front(tmp % 10);
    carry = tmp / 10;
    r_oppA++;
  }

  while (r_oppB != oppB.rend()) {
    int tmp = *r_oppB + carry;
    result.push_front(tmp % 10);
    carry = tmp / 10;
    r_oppB++;
  }

  return result;
}

deque<int> multiply(deque<int>& multiplicand, deque<int>& multiplier) {

  unsigned int carry = 0;
  deque<int> result;
  int deci_cnt = 0;

  deque<int>::reverse_iterator r_multiplier = multiplier.rbegin();
  deque<int> tmp_result;

  while (r_multiplier != multiplier.rend()) {

    for (int i=0; i<deci_cnt ;i++) {
      tmp_result.push_front(0);
    }

    deque<int>::reverse_iterator r_multiplicand = multiplicand.rbegin();
    while (r_multiplicand != multiplicand.rend()) {
      int tmp = (*r_multiplicand) * (*r_multiplier) + carry;
      tmp_result.push_front(tmp % 10);
      carry = tmp / 10;
      r_multiplicand++;
    }

    if (carry != 0) {
      tmp_result.push_front(carry);
      carry = 0;
    }

    result = sum(result, tmp_result);

    deci_cnt++;
    tmp_result.clear();
    r_multiplier++;
  }

  return result;
}

deque<int> int_to_deque(unsigned long num) {
  deque<int> result;

  if (num == 0) {
    result.push_front(0);
  }

  while (num > 0) {
    result.push_front(num % 10);
    num = num / 10;
  }

  return result;
}

int main() {

  deque<int> num1 = int_to_deque(18446744073709551615ULL);
  deque<int> num2 = int_to_deque(18446744073709551615ULL);

  deque<int> result = multiply(num1, num2);
  print_num(result);

  return 0;
}
#包括
#包括
使用名称空间std;
无效打印数量(数字和数量){
对于(int i=0;i
你可以在你的循环中手动递增i,或者在for循环中递增i。不要在两个地方都递增,因为这太混乱了。谢谢你,尼尔。我按照你的建议做了,我得到了相同的输出。你有溢出,数字太大了,无法将乘法结果放入任何类型尝试将和存储在
unsigned long
data t中YPE。希望它足够大。然后你需要使用任意大小的整数类。即使<代码>未签名的长long < /C> >只处理136。我不知道我是否在32位或64位运行?有人告诉我这个程序不能在C++中完成!!对吗?我的意思是,我的代码是正确的,只是结果太大,不能适应,RI!嗯?重要的是我对这个问题的理解是正确的,对吗?我不会说图灵意义上的“做不到”——有很多表示和处理非常大的数字的技术,但这比当原生类型足够时要多得多。这是我学计算机科学的第一个学期:(.这就是为什么我不熟悉你们使用的一些术语。即使是
unsigned long-long
也远远不够大。它刚刚超过100。我也有同样的期望,但不想做数学汉克斯。我开始认为这超出了我的水平!谢谢凯莉。我还没有学习过课程。我是一名计算机科学的新学生dentWell,它不一定是一个类。它可能只是一组函数。你可能会发现一些支持大整数的开放源代码,但如果没有,你就必须自己编写。对于一个刚开始学习CS的学生来说,这将是一个非常高级的项目。非常感谢Carey。我想我会使用无符号长-长data类型,因为它给出了最多的结果:/。谢谢lizusek。但是我不能向我的老师展示这个。有一个术语我从来没有见过。我会为作弊设置A+:D。@user3479130这是真的乘法吗?我不这么认为,因为这真的不能用任何基本类型来表示。或者你真的误解了任务。也许只是打印第三个数字?什么是“数字的运行乘积”?这是一个问题,问问你的同事或教授…;)我不知道。我在互联网上搜索了一下,但我找不到答案!@user3479130,因为这不是标准的东西。我自己非常非常好奇你的教授是什么意思,什么是答案。你能在知道的时候告诉我吗?
unsigned long long  product = 1;
std::vector<int> fct;
for (int i = 100; i <= 500; i = i +3)
{
    if ( (i%2) == 0) {
        int r = i / 2;
        fct.push_back( r);
        std::cout << "product:" << product << " * 2";
        std::vector<int>::iterator it = fct.begin();
        while ( it != fct.end()) {
            std::cout << " * " << *it++;
        }
        std::cout << std::endl;
    } else {
    product = product * i;
    std::cout << "product:" << product << " * 2";
        std::vector<int>::iterator it = fct.begin();
        while ( it != fct.end()) {
            std::cout << " * " << *it++;
        }
        std::cout << std::endl;
    }
}
#include <iostream>
#include <deque>

using namespace std;

void print_num(deque<int> &num) {
  for(int i=0;i < num.size();i++) {
    cout<<num[i];
  }
  cout<<endl;
}

deque<int> sum(deque<int> &oppA, deque<int> &oppB) {
  if (oppA.size() == 0) return oppB;
  if (oppB.size() == 0) return oppA;

  deque<int> result;
  unsigned int carry = 0;

  deque<int>::reverse_iterator r_oppA = oppA.rbegin();
  deque<int>::reverse_iterator r_oppB = oppB.rbegin();
  while ((r_oppA != oppA.rend()) && (r_oppB != oppB.rend())) {

    int tmp = *r_oppA + *r_oppB + carry;
    result.push_front(tmp % 10);
    carry = tmp / 10;

    r_oppB++;
    r_oppA++;

  }
  while (r_oppA != oppA.rend()) {
    int tmp = *r_oppA + carry;
    result.push_front(tmp % 10);
    carry = tmp / 10;
    r_oppA++;
  }

  while (r_oppB != oppB.rend()) {
    int tmp = *r_oppB + carry;
    result.push_front(tmp % 10);
    carry = tmp / 10;
    r_oppB++;
  }

  return result;
}

deque<int> multiply(deque<int>& multiplicand, deque<int>& multiplier) {

  unsigned int carry = 0;
  deque<int> result;
  int deci_cnt = 0;

  deque<int>::reverse_iterator r_multiplier = multiplier.rbegin();
  deque<int> tmp_result;

  while (r_multiplier != multiplier.rend()) {

    for (int i=0; i<deci_cnt ;i++) {
      tmp_result.push_front(0);
    }

    deque<int>::reverse_iterator r_multiplicand = multiplicand.rbegin();
    while (r_multiplicand != multiplicand.rend()) {
      int tmp = (*r_multiplicand) * (*r_multiplier) + carry;
      tmp_result.push_front(tmp % 10);
      carry = tmp / 10;
      r_multiplicand++;
    }

    if (carry != 0) {
      tmp_result.push_front(carry);
      carry = 0;
    }

    result = sum(result, tmp_result);

    deci_cnt++;
    tmp_result.clear();
    r_multiplier++;
  }

  return result;
}

deque<int> int_to_deque(unsigned long num) {
  deque<int> result;

  if (num == 0) {
    result.push_front(0);
  }

  while (num > 0) {
    result.push_front(num % 10);
    num = num / 10;
  }

  return result;
}

int main() {

  deque<int> num1 = int_to_deque(18446744073709551615ULL);
  deque<int> num2 = int_to_deque(18446744073709551615ULL);

  deque<int> result = multiply(num1, num2);
  print_num(result);

  return 0;
}