none
3n+1的问题,在线测试系统总是提示结果是错误的,不知为何。 RRS feed

  • 问题

  • #include <stdio.h>

    unsigned long int Circle_length(unsigned long int n);

    unsigned long int fun(unsigned long int i,unsigned long int j)
    {
     unsigned long int max=0; /*max用来存储循环节长度的最大值*/
     unsigned long int temp=0;
     unsigned long int k=0;

     for(k=i;k<=j;k++)
     {
      temp=Circle_length(k);
      if(temp>max)
       max=temp;
     }
     return max;
    }

    unsigned long int Circle_length(unsigned long int n)
    {
     unsigned long int nCount=1; /*统计循环节长度的变量*/
     while(n!=1)
     {
      if(n%2==0)
       n/=2;
      else
       n=n*3+1;
      nCount++;
     }
     return nCount;
    }

    int main()
    {
     unsigned long int i=1,
                    j=1;
     unsigned long int max=1;/*用来存储最大循环节长度的*/
     scanf("%lu %lu",&i,&j);
     if(j>=i)
     {
      max=fun(i,j);
      printf("%lu %lu %lu\n",i,j,max);
     }
     else
     {
      max=fun(j,i);
      printf("%lu %lu %lu\n",j,i,max);
     }
     getchar();
     return 0;
    }

     

    这个程序错在哪? 为什么在线测试系统一直提示结果错误,结果是对的呀。。。

    2011年6月25日 15:13

答案

  • 你好,

     

    欢迎您来到MSDN中文论坛。

     

    根据您的代码,我发现了一些问题:

    1 您定义的输入变量为无符号的整数。然而在输入的时候输入为负数时,就会产生错误。

    2,当输入为0时,在Circle_length中会陷入死循环

    if(n%2==0)  // n =0         
    n/=2;          // n = 0         
    else      
    n=n*3+1;   

    3, 由于getchar是从标准输入流中读取字符,而scanf 是往标准输入流中写入字符。因此程序运行到getchar()时,并不会按照预定停下,所以您可以考虑使用fflush(stdin)清空输入流。

     

    希望我的建议能够对您的问题有所帮助


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年7月1日 9:12
    2011年6月27日 7:23

全部回复

  • 检查下边界的情况

    实在不行换个方法再写一遍,用两者的结果进行比对


    0xBAADF00D
    2011年6月27日 1:05
    版主
  • 你好,

     

    欢迎您来到MSDN中文论坛。

     

    根据您的代码,我发现了一些问题:

    1 您定义的输入变量为无符号的整数。然而在输入的时候输入为负数时,就会产生错误。

    2,当输入为0时,在Circle_length中会陷入死循环

    if(n%2==0)  // n =0         
    n/=2;          // n = 0         
    else      
    n=n*3+1;   

    3, 由于getchar是从标准输入流中读取字符,而scanf 是往标准输入流中写入字符。因此程序运行到getchar()时,并不会按照预定停下,所以您可以考虑使用fflush(stdin)清空输入流。

     

    希望我的建议能够对您的问题有所帮助


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年7月1日 9:12
    2011年6月27日 7:23