【问题标题】:code not executing due to huge time taken由于花费大量时间,代码未执行
【发布时间】:2019-07-30 02:53:39
【问题描述】:

输入 n,m 我写了这段代码,它将找到最小的数字,使得 不。将被 n 整除 和它的数字总和 = m 但它没有执行,它花费了太多时间并且没有显示任何输出

我尝试将 i 从 n+1 运行到 INT_MAX,但没有任何区别

#include <iostream>
#include<climits>
#include<stdio.h>
using namespace std;
int main()
{
    int n, m, a;
    cin >> n >> m;
    for (int i = n + 1; i < INT_MAX; i++)
    {
        a = 0;
        if (i % n == 0)
        {
            while (i > 0)
            {
                a += i % 10;
                i = i / 10;
            }
            if (a == m)
            {
                cout << a;
                break;
            }
        }
        if (a == m)
            break;
    }
}

我希望输出是一些数字,但它什么也没显示

【问题讨论】:

  • 您使用的输入是什么?你对输出有什么期望?您是否在调试器中单步执行过代码?
  • i = i / 10; 看起来很糟糕,因为这里也使用了i for (int i = n + 1; i &lt; INT_MAX; i++)
  • 为什么你把 if 条件 (a == m) 放在第二位??

标签: c++ dev-c++


【解决方案1】:

不要在 while 循环中使用 i,因为您已经在 for 循环中使用 i。每次执行 while 循环时,在 while 循环中使用 i 都会将其值减少 i/10 次。而是使用任何其他局部变量。

#include <iostream>
#include<climits>
#include<stdio.h>
using namespace std;
int main()
{
   int n, m, a;
   cin >> n >> m;
   for (int i = n + 1; i < INT_MAX; i++)
   {
       a = 0;
       if (i % n == 0)
       {
           int temp = i;
           while (temp > 0)
           {
               a += temp % 10;
               temp = temp / 10;
           }
           if (a == m)
           {
               cout << a;
               break;
           }
       }
       if (a == m)
           break;
   }
  return 0;
}

【讨论】:

  • 另一项改进:for (int i = n; i &lt; INT_MAX; i+=n) 消除了对if (i % n == 0) 的需要。测试ns 之间的任何值毫无意义,因为它们会自动失败。最终,虽然我很确定有一种方法可以将问题分解为一个等式。
【解决方案2】:

**** 编辑

在你的循环中 i 在每个循环中增加 1 然后除以 10 ,因此它永远不会真正增加,a 也不是,所以它永远不会达到命中并且卡在接近正 0 的循环中

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 2019-11-10
    • 1970-01-01
    • 2018-01-10
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多