【问题标题】:Counting the sum of digits in a loop计算循环中的数字总和
【发布时间】:2014-09-05 19:21:08
【问题描述】:

我在让算法计算循环中使用的数字总和时遇到问题。

让我概述一下基本原则:

1 2 3 4 5 6 7 8 9 = 9 位数
1 2 3 4 5 6 7 8 9 10 = 11 位

我曾尝试寻找解决方案,但找不到合适的解决方案。

基本思想是我有一个已知的数字 n,它将代表数字计数的结束。 计数从 1 开始,所以 1 <= n <= 10000

我想到的第一件事就是数数:

while(numdig != 0) {
    numDig = n/10;
    digCount++;
}

然后在一个循环中继续循环,但我发现自己对第二个循环感到困惑。之后我想到了一个会使用大量 if 的循环,这将是一种非常不正确的解决问题的方法。

我希望这个问题是可以理解的。
谢谢

【问题讨论】:

  • 你有困难的部分,迭代数字并使用你的代码来计算数字。 digCount = 0; for (int i = 1; i < n; i++) { int numDig = i; /*you while loop here*/ }
  • 不知道有没有使用stringstream的简单解决方案

标签: c++ c count sum digits


【解决方案1】:

也许这对帮助您编写程序很有用(将数字计数分离到它自己的函数中)。

/* return the number of digits in the number i */
int ndigits ( int i ) {
    int n = 1;

    if (i < 0) i = -i;
    while (i >= 10) { ++n; i /= 10; }
    return n;
}

【讨论】:

  • 有一种方法可以优化这一点,而不是计算每个数字中位数的蛮力方式。 0-9 每个有 1,10-99 每个有 2,100-999 每个有 3,依此类推。所以,如果数字大于 100,您知道 1-9 总共有 9,加上 100-999 有 1800 (900 个数字乘以 2 个数字),依此类推。
  • 谢谢,在这种情况下一个函数可能真的很有帮助
  • 注意:这种方法在 INT_MIN 的极端情况下失败。处理这个问题:if (i &gt; 0) i = -i; while (i &lt;= -10) { ++n; i /= 10; }。 +1 反正
  • @chux 1 &lt;= n &lt;= 10000
  • 这可能是一个愚蠢的问题,但我不确定我们为什么要使用 if (i
【解决方案2】:

您可以尝试使用snprintf(返回写入的字符数)。会是这样的:

//read numdig
char buff[6]; // max of 5 digits and the '\0'
digCount += snprintf(buff,6, "%d", numdig);

【讨论】:

  • 谢谢,我发现它非常有用 :) 我以前从未听说过 snprintf
  • () 对于这样的事情有一些非常有用的功能 =)
  • 问题 1) 应该是 snprintf(buff,6, "%d", numdig); 或更好的 snprintf(buff,sizeof buff, "%d", numdig); 2) 为什么这么小,可能是 char buff[22]; 3) 负数减一。最多 5 个字符,而不是数字,以及 '\0'
  • 我解决了问题 #1,谢谢。我刚刚为提出的问题使用了适量的字符,并且没有负数(1
  • true 表示范围 (1 buff[6] 就足够了。当其他人不时浏览帖子和答案时,他们看不到给定答案的有限用处。考虑'-' 时,字符与数字是有意义的。我的 cmets 第 2 部分和第 3 部分不会影响您对帖子有限范围的回答的正确性。 +1
【解决方案3】:

这可能是另一种方法

int getDigitCount ( int val )
{
   stringstream ss;
   ss << val;
   string valstr = ss.str ();
   return valstr.length();
}


int main ( int argc, char** argv )
{
   int n;
   cout << "Enter a number between 1 and 10000 " << endl;
   cin >> n;
   long digitcount = 0;
   for ( int i = 1; i <= n; i ++ )
   {
      digitcount += getDigitCount ( i );
   }

   cout << "Digit Count =" << digitcount << endl;
   return 0;
}

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多