交叉和计算,有人可以解释一下代码吗?

Posted

技术标签:

【中文标题】交叉和计算,有人可以解释一下代码吗?【英文标题】:Cross sum calculation, Can anyone explain the code please? 【发布时间】:2019-09-10 17:43:55 【问题描述】:

我将在一开始就学习 C++,并努力应对大学的一些挑战。 任务是计算交叉和并仅使用模和除运算符。

我有下面的解决方案,但不明白机制.. 也许任何人都可以提供一些建议或帮助理解发生了什么。

我试图弄清楚模运算符是如何工作的,并一步一步地看代码,但仍然不明白为什么需要while语句。

#include <iostream>
using namespace std;

int  main()


  int input;
  int crossSum = 0;

  cout << "Number please: " << endl;
  cin >> input;

  while (input != 0) 
  
    crossSum = crossSum + input % 10;
    input = input / 10;
  

  cout << crossSum << endl;

  system ("pause");
  return 0;

假设我的输入数字是 27。交叉和是 9

第一步:crossSum = crossSum + (input'27' % 10 ) // 0 + (modulo10 of 27 = 7) = 7

下一步:input = input '27' / 10 // (27 / 10) = 2.7; Integer=2 ?

如何将它们组合在一起,while 循环有什么作用?感谢您的帮助。

【问题讨论】:

对我来说,挑战是仅使用模数和除法运算符来做到这一点。我看不出提高数学如何有助于探索正确的过程 【参考方案1】:

以防万一您不确定:

运算符%将左边的数字除以右边的数字(它的操作数),并给出余数。例如,49 % 5 = 4

不管怎样,

while 循环 采用条件语句,并会一遍又一遍地执行以下括号中的代码,直到该语句变为 false。在您的代码中,当输入不等于零时,做一些事情。

为了将所有这些结合在一起,每个循环,您将输入模数为 10 - 这将始终返回给定 Base-10 数字的最后一位数字。您将其添加到运行总和(crossSum)上,然后将数字除以 10,基本上将数字移动一个空格。 while 循环确保您执行此操作直到数字完成 - 例如,如果输入是 104323959134,它必须循​​环 12 次,直到获得所有数字。

【讨论】:

【参考方案2】:

您似乎正在添加输入数字中存在的数字。让我们通过一个例子来理解它,让 input = 154。

Iteration1
crossSum= 0 + 154%10 = 4 
Input = 154/10= 15 

Iteration2 
crossSum = 4 + 15%10 = 9 
Input = 15/10 = 1 

Iteration3 
crossSum = 9 + 1%10 = 10 
Input = 1/10 = 0 

现在 while 循环将不会执行,因为 input = 0。保持干运行代码的习惯。

【讨论】:

【参考方案3】:
#include <iostream>
using namespace std;

int  main()


  int input;
  int crossSum = 0;

  cout << "Number please: " << endl;
  cin >> input;

  while (input != 0)  // while your input is not 0
  
    // means that when you have 123 and want to have the crosssum
    // you first add 3 then 2 then 1 
    // mod 10 just gives you the most right digit
    // example: 123 % 10 => 3
    //          541 % 10 => 1 etc.

    // crosssum means: crosssum(123) = 1 + 2 + 3 
    // so you need a mechanism to extract each digit
    crossSum = crossSum + input % 10; // you add the LAST digit to your crosssum


    // to make the number smaller (or move all digits one to the right)
    // you divide it by 10 at some point the number will be 0 and the iteration 
    // will stop then.
    input = input / 10;
  

  cout << crossSum << endl;

  system ("pause");
  return 0;

【讨论】:

【参考方案4】:

但还是不明白为什么需要while语句

实际上,没有需要(字面意义上的),因为可表示的位数是有限的。

让我们考虑signed char 而不是int:最大数量为127(提供8 位char)。所以你可以这样做:

crossSum = number % 10 + number / 10 % 10 + number / 100;

对于 int 也是如此,但由于该数字更大,您需要 10 个加数(提供 32 位 int)...并且:您总是会计算 10 个加数,即使对于数字 1,实际上所有 9 个无论如何,上和数都等于 0。

while循环简化了事情:只要还有数字,数字不等于0,所以你继续,一旦没有数字(数字== 0),你停止迭代:

123 -> 12 -> 1 -> 0 // iteration stops, even if data type is able
  ^     ^    ^      // to store more digits

标记的数字构成交叉和的总和。

请注意,整数除法总是会去掉小数位,而模运算会得到余数,就像你在学校的第一堂数学课一样:

7 / 3 = 2, remainder 1

所以% 10 将准确地为您提供最后一个(以 10 为基数)数字(最低有效位),然后/ 10 将删除该数字,以便在下一次迭代中继续使用下一个数字。

您甚至可以根据不同的基数计算交叉和(例如 16;基数 2 会给出二进制表示的 1 位的数量)。

【讨论】:

【参考方案5】:

Loop 用于重复某些语句直到 条件 为真。 在您的程序中,重复以下语句直到 input 变为 0

检索输入的最后一位。 (int digit = input % 10;) 将上面检索到的数字添加到crosssum。 (crosssum = crosssum + digit;) 从输入中删除最后一个数字。 (input = input / 10;)

重复上述语句直到输入变为,重复除以10。输入中的所有数字都添加到crosssum.

因此,变量crosssum 是变量input 的数字之和。

【讨论】:

以上是关于交叉和计算,有人可以解释一下代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释一下Pandas bin的精度吗?

有人能解释一下这段代码中的法线是如何计算的吗?

什么是机器视觉?有人能解释一下吗?

MATLAB - 有人可以解释一下这些代码行的作用吗

有人可以为我解释一下 C++ 代码吗? [复制]

有人可以解释一下attr吗?