识别阿姆斯壮编号

时间:2018-10-23 13:36:46

标签: c

我写了这段代码,可以识别一个数字是否是阿姆斯特朗数字

 #include <stdio.h>
    #include <stdlib.h>
     int n;
    const int input()
    {
        printf("insert n:");
        scanf("%d",&n);
        return n;
    }   
    int Num_amount()
    {
      int amount=0;
      while(n>=10)
      {
          amount++;
          n=n/10;
          if(n<10)
            amount++;
      }
      return amount;
    }
    int Armstrong()
    {
        n=input();
        int v;
        int z=0;
        int y=10
      int x=Num_amount();
      int m[100]={};
      int i;
      for(i=0;n>=10;i++)
      {
          v=n%10;
        m[i]=pow(v,x);
        z=z+m[i];
        y=y*10;
      }
      return z;
    }
    int main()
    {
    int z=Armstrong();
    printf("%d",z);
    }

n = 153 运行时,我总是得到 0 。经过几次调试,我发现问题出在 Armstrong 函数中(最有可能)

 int Armstrong()
            {
                n=input();
                int v;
                int z=0;
                int y=10
              int x=Num_amount();
              int m[100]={};
              int i;
              for(i=0;n>=10;i++)
              {
                  v=n%10;
                m[i]=pow(v,x);
                z=z+m[i];
                y=y*10;
              }
              return z;
        }

debug watch指示,它没有执行 for 循环,而是直接进入了 return z 行,我已经尝试了所有方法,但仍然无法弄清楚你能告诉我问题出在哪里吗?

4 个答案:

答案 0 :(得分:2)

由于某些逻辑错误,您得到错误的结果。当您选择一个变量为global时,您需要考虑到变量值可以被任何function修改,在这种情况下,您已经在num_amount函数中修改了它的值。您在Num_amountArmstrong函数中也犯了一些逻辑错误。 您尚未包括math.h的{​​{1}}头文件。

这是您修改的代码,

pow

答案 1 :(得分:1)

发现代码有很多问题。这是修改后的版本。
1.不要使用全局变量。
2.简化功率计算。
3.返回结果的状态,而不是结果。您要检查号码是否为Armstrong。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int no_digits(int n){
  int digits = 0;
  while(n){
     digits++;
     n = n/10;
 }
  return digits;
}

int armstrong(){
  int n;
  printf("insert n:");
  scanf("%d",&n);

  int digits = no_digits(n);
  int curnum = 0,original = n;
  while(n){
    curnum += pow(n%10,digits);
    n /= 10;
  }

  if(original == curnum)
   return 1;
  return 0;
}
int main(){
  if(armstrong())
   printf("Is Armstrong\n");
  else printf("Not Armstrong\n");
}

答案 2 :(得分:1)

让我们看一下您的循环:

for(i=0;n>=10;i++)
{
  v=n%10;
  m[i]=pow(v,x);
  z=z+m[i];
  y=y*10;
}

此时n的值是多少?您已在上次调用Num_amount中将其设置为:

while(n>=10)
{
  amount++;
  n=n/10;
  if(n<10)
    amount++;
}

因此,Num_amount完成执行后,n 必须小于10,这意味着Armstrong中的循环将不执行。

这是为什么即使在这样的玩具程序中也不应使用全局变量的重要原因。如果您在不同的地方将其用于不同的目的,只会造成类似的麻烦。

至少,您应该更改代码,以将n作为参数传递给Num_amountArmstrong

答案 3 :(得分:0)

您的函数Num_amount()返回的“ n”值已经小于10,并且for循环永远不会运行。