交叉和计算,有人可以解释一下代码吗?
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
的数字之和。
【讨论】:
以上是关于交叉和计算,有人可以解释一下代码吗?的主要内容,如果未能解决你的问题,请参考以下文章