c++ - 查找整数序列的数字和

  显示原文与译文双语对照的内容
0 0

我决定编写一小段代码来获得两个整数,让我们说M 和N ( M <= N ) 和它们之间的数字。 例如如果M = 1和N = 9,DigitSum将等于 45. 如果M = 10和N = 11,则求和将为( 1 + 0 ( 10 ) + 1 + 1 ( 11 ) = 0. 下面是我的代码( 。执行了循环而不是返回):

#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;
}
}

大多数情况下这是很正常的,但在线法官说这是错误的。 我看了其他的解决方案,但是没有一个像我所做的那样硬编码数组中的值。 这会导致部分问题?

时间:原作者:8个回答

0 0

你可以轻松地创建一个for循环来大大简化这个代码。

不需要完成所有的工作。

for (Initialization Action, Boolean Expression, Update_Action)
原作者:
0 0

以下是 deletion: 对不起,我有一位流感和 mizread N 作为 M 。 : (

我认为主要的错误是 M-1

       sums.push_back(Digit_Sum(N) - Digit_Sum(M - 1));

同时也注意到,当修正的时候,这个公式只能用于单个数字 我以前关于使用简单公式的评论基于误解你的问题描述,以及这个公式。 只显示单个数字数字。

然而,代码的复杂性显得相当高。 假设,假设非负整数作为输入,假设 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;
 }
}

它不需要比那更复杂。

原作者:
0 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);
}
原作者:
...