【问题标题】:Code for Armstrong numbers not working阿姆斯壮数字代码不起作用
【发布时间】:2013-10-31 14:28:42
【问题描述】:

好吧,请放轻松。刚刚学习 C++,首先在这里也提问。我编写了一个程序来列出所有低于 1000 的 Armstrong 数字。虽然我已经阅读了关于自恋数字的 Wikipedia 文章,但我只在寻找 3 位数字。这意味着我只关心数字的立方的总和。

它的工作原理是为 1 到 1000 执行一个 for 循环,使用用户定义的函数检查索引变量是否为 armstrong,如果是则打印它。用户定义的函数只需使用一个while循环来隔离数字并将立方体的总和与原始数字匹配即可。如果为真,则返回1,否则返回0。

问题是,我在输出中绝对没有数字。只有 void main() 中的 cout 语句出现,其余为空白。尝试尽可能多地调试。编译器是 Turbo C++。代码-

#include<iostream.h>
#include<conio.h>

int chk_as(int);//check_armstrong

void main()
{
    clrscr();
    cout<<"All Armstrong numbers below 1000 are:\n";
    for(int i=1;i<=1000;i++)
    {
        if (chk_as(i)==1)
            cout<<i<<endl;
    }
    getch();
}

int chk_as (int n)
{
    int dgt;
    int sum=0,det=0;//determinant
    while (n!=0)
    {
        dgt=n%10;
        n=n/10;
        sum+=(dgt*dgt*dgt);
    }
    if (sum==n)
    {det=1;}
    else
    {det=0;}
    return det; 
}

【问题讨论】:

  • main 应该返回 int
  • @ShafikYaghmour 这不是强制性的。
  • @AliAlamiri 当然是!从 N3337,3.6.1:“实现不应预定义 main 函数。此函数不应重载。它的返回类型应为 int,否则其类型为实现定义。所有实现都应允许main的以下定义:int main() { /* ... */ }int main(int argc, char* argv[]) { /* ... */ }"
  • 另外,#include&lt;iostream.h&gt; 应该是 #include &lt;iostream&gt;。没有称为iostream.h 的标准标头。
  • @user1158692 that 标准可选的。

标签: c++


【解决方案1】:

问题是你在你的方法中动态改变 n 的值,但是你需要它的原始值来检查结果。

添加一个临时变量,比如 t。

int t = n;
while (t!=0)
{
    dgt=t%10;
    t=t/10;
    sum+=(dgt*dgt*dgt);
}
if (sum==n)
// ... etc.

【讨论】:

  • +1 注意:您不需要 temp。您可以通过在初始时设置 sum 等于 n减去每个术语来做到这一点。如果在循环之后sum == 0 有效。
  • 是的,该方法也有效,为了清晰起见,我更喜欢临时变量。添加这个意味着对现有代码的最小调整。
【解决方案2】:

编辑:没关系...这是错误的

while (n!=0)
    {
    dgt=n%10;
    n=n/10;
    sum+=(dgt*dgt*dgt);
    }

这将永远运行,因为 n 永远不会达到 0。

【讨论】:

  • 是的,因为它是整数除法,而不是小数。
  • 你确定?这是一个整数除法。
  • 假设他的 OP 的整数除法和宇宙的其他部分一样,n 怎么永远不会达到零?
【解决方案3】:

问题是,在循环结束时

while (n!=0)
{
    dgt=n%10;
    n=n/10;
    sum+=(dgt*dgt*dgt);
}

n 为 0,因此条件 if (sum==n) 永远不会为真。

试试类似的东西:

int chk_as (int n)
{
int copy = n;
int dgt;
int sum=0,det=0;//determinant
while (copy!=0)
    {
    dgt=copy%10;
    copy=copy/10;
    sum+=(dgt*dgt*dgt);
    }
if (sum==n)
{det=1;}
else
{det=0;}
return det; 
}

【讨论】:

    【解决方案4】:

    我在这里给出了寻找三位数的阿姆斯壮数的程序。

    阿姆斯壮数的条件是, 其数字的立方和必须等于数字本身。

    例如,输入 407。 4 * 4 * 4 + 0 * 0 * 0 + 7 * 7 * 7 = 407 是阿姆斯壮数。

    #include <stdio.h>
    
    int main()
    {
          int i, a, b, c, d;
          printf("List of Armstrong Numbers between (100 - 999):\n");
    
          for(i = 100; i <= 999; i++)
          {
                a = i / 100;
                b = (i - a * 100) / 10;
                c = (i - a * 100 - b * 10);
    
                d = a*a*a + b*b*b + c*c*c;
    
                if(i == d)
                {
                      printf("%d\n", i);
                }
          }  
          return 0;
    }
    

    (100 - 999) 之间的阿姆斯壮数列表: 153 370 371 407

    参考:http://www.softwareandfinance.com/Turbo_C/Find_Armstrong_Number.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2021-04-03
      • 2011-08-07
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多