我下定决心写一小段代码得到两个整数,让我们说M和N(M <= N)并将它们之间所有整数的数字相加,包括在内。因此,例如,如果M = 1且N = 9,则DigitSum将等于45.如果M = 10且N = 11,则总和将是(1 + 0(10)+ 1 + 1(11)= 3)。 这是我到目前为止的代码(完成for循环而不是返回):
#include <iostream>
#include <vector>
using namespace std;
// the partial digits sums digitSum[i] = the sum of the digits between 0 and i
int digitSum[] = {0, 1, 3, 6, 10, 15, 21, 28, 36, 45};
int pow_of_ten[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
// the sums of all the digits in the numbers from 1 to (10^(i) - 1) where i is the index in the array
long subsums[] = {0, 45, 20 * 45, 300 * 45, 4000 * 45, 50000 * 45, 600000 * 45, 7000000 * 45, 80000000 * 45,
900000000 * 45};
//Calculates the sum of all digits between 0 and M inclusive
long Digit_Sum(int M) {
if (M < 10) {
return digitSum[M];
}
long result = 0;
int same = M;
int counter = 0;
int lastdigit = 0;
while (same > 0) {
if (same < 10) {
lastdigit = same;
break;
}
same /= 10;
counter ++;
}
for(;counter >= 0; counter --) {
result += (subsums[counter] + M % pow_of_ten[counter] + 1) * lastdigit;
result += digitSum[lastdigit - 1] * pow_of_ten[counter];
if (counter == 0) {
break;
}
lastdigit = (M / pow_of_ten[counter - 1]) % 10;
}
return result;
}
int main() {
int M;
int N;
vector<long> sums;
while (true) {
cin >> M >> N;
if (M == 0 && N == 0) {
break;
}
sums.push_back(Digit_Sum(N) - Digit_Sum(M - 1));
}
for (vector<long>::iterator it = sums.begin(); it != sums.end(); ++it) {
cout << *it << endl;
}
}
对于大多数情况,这种方法效果很好,但在线评判认为这是错误的。我查看了其他可行的解决方案,但没有人按照我的方式对数组中的值进行硬编码。这可能导致部分问题,任何想法?
答案 0 :(得分:0)
您可以轻松地创建一个for循环来大大简化此代码。
没有必要经过所有这些努力。
for (Initialization Action, Boolean Expression, Update_Action)
答案 1 :(得分:0)
下面重新删除:对不起,我有一点流感和mizread N
为M
。 :(
我认为主要错误是
M-1
<德尔> sums.push_back(Digit_Sum(N) - Digit_Sum(M - 1));
。
还注意到&lt; 更正时该公式仅适用于单位数字。我之前关于使用简单公式的评论是基于对您的问题描述的误解,考虑到该公式和您的示例。两者都只显示了一位数字。
然而,代码的复杂性似乎过高。考虑这一点,假设非负整数作为输入,并假设m
总是小于或等于n
:
#include <iostream>
#include <stdexcept>
using namespace std;
bool throwX() { throw std::runtime_error( "Ouch." ); }
auto main() -> int
{
for( ;; )
{
int m, n;
cin >> m >> n || throwX();
if( m == 0 && n == 0 ) { break; }
int sum = 0;
for( int i = m; i <= n; ++i )
{
for( int v = i; v != 0; v /= 10 )
{
sum += v % 10;
}
}
cout << sum << endl;
}
}
它不需要那么复杂。
答案 2 :(得分:0)
测试并使用规范,没有控制台输入:
#include <iostream>
#include <string>
using namespace std;
void sum_a_to_b(const int & a, const int & b)
{
if (a <= b && a >= 0)
{
long long sum = 0;
for (int i = a; i <= b; i++)
{
sum += i;
}
cout << "Sum of digits from " << a << " through " << b << " is " << sum << ".\n";
}
}
int main()
{
sum_a_to_b(5, 6);
sum_a_to_b(1, 9);
}