任务类似于开心号码

时间:2016-10-07 15:04:37

标签: c++ algorithm

我正在解决c ++算法问题,我不知道为什么我得不到正确答案。问题在于:给出一行n个数字。您需要取每个数字并添加其数字的平方,直到您得到总和4或1.然后您需要打印您添加该数字的次数。他是一个例子:你有一排2个数字:89和68.你从89开始: 64 + 81 = 145;(1)1 + 16 + 25 = 42;(2)16 + 4 = 20;(3)4 + 0 = 4;(4) 我们停止因为它是4.我们需要打印4因为我们一次又一次地添加4次直到我们得到4或1.与68相同。我的代码是用c ++但它用于文件c。

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

FILE *f,*g;
int n,i,a[500],sqr,nr;
int main()
{
  f = fopen("unupatru.in","r");
  fscanf(f,"%d\n",&n);
  for(i=1;i<=n;i++)fscanf(f,"%d",&a[i]);
  fclose(f);
  for(i=1;i<=n;i++)
  {
    nr=0;
    sqr=0;
    while(sqr!=4 || sqr !=1)
    {
      while(a[i])
      {
        sqr+=pow(a[i]%10,2);
        a[i]/=10;
      }
      a[i]=sqr;
      nr++;
    }  
    g=fopen("unupatru.out", "w");
    fprintf(g,"%d\n",nr);
    fclose(g);
  }
  return 0;
}

请帮帮我 我的代码的问题是,当我点击运行并编译它并没有停止运行请帮助

2 个答案:

答案 0 :(得分:1)

不确定是否足够......

您应该将sqr = 0放在外部,而(正如Igor Tandetnik指出的那样)使用&&而不是||修改测试

或更好:您应该使用do / while(仅在sqr=0内)

do
{
  sqr=0;
  while(a[i])
  {
    sqr+=pow(a[i]%10,2);
    a[i]/=10;
  }
  a[i]=sqr;
  nr++;
} 
while(sqr!=4 && sqr !=1)

答案 1 :(得分:0)

#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
FILE *f,*g;
int n,i,a[500],sqr,nr,b[500];
int main()
{
  f = fopen("unupatru.in","r");
  fscanf(f,"%d\n",&n);
  for(i=1;i<=n;i++)fscanf(f,"%d",&a[i]);
  fclose(f);
  for(i=1;i<=n;i++)
  {
         nr=0;
         sqr=0;
      while(sqr!=4 && sqr !=1)
       {
           sqr=0;
           while(a[i])
            {
               sqr+=pow(a[i]%10,2);
               a[i]/=10;
            }
              a[i]=sqr;
              nr++;
              b[i]=nr;
       } 
  }

      g=fopen("unupatru.out", "w");
      for(i=1;i<=n;i++)
      fprintf(g,"%d ",b[i]);
      fclose(g);
  return 0;

}