自由深渊 发表于 2017-3-20 21:41:44

关于欧拉计划26题

#include <stdio.h>

void division ( int * , int , int ) ;
int cir ( int * ) ;
_Bool judge ( int * , int , int ) ;

int main ( void )
{
        int i = 7 , j , max = 0 , temp , result ;
        int a [ 10000 ] = { 0 } ;
       
        while ( i <= 1000 )
        {
                for ( j = 0 ; j < 10000 ; j ++ )
                {
                        a [ j ] = 0 ;
                }
                       
                division ( a , i , 1 ) ;
               
                temp = cir ( a ) ;
               
                if ( temp > max )
                {
                        result = i ;
                        max = temp ;
                }
               
                i ++ ;
                printf ( "%d" , i ) ;
        }
       
        printf ( "%d\n" , result ) ;
       
/*        division ( a , 45 , 1 ) ;
       
        printf ( "%d\n" , cir ( a ) ) ;*/
       
        return 0 ;
}

void division ( int *a , int i , int j )//将一个数除数存进A数组
{
        int count = 0 ;
       
        while ( count <= 10000 )
        {
                while ( j < i )
                {
                        j *= 10 ;
                        count ++ ;
                }
               
                if ( !( j % i ) )
                {
                        a [ count ] = j / i ;
                        break ;
                }
                else
                {
                        a [ count ] = j / i ;
                        j = j % i ;
                }
        }
}

int cir ( int *a )//返回循环数
{
        int i = 1 , j = 2 , k , temp ;
        _Bool flag = 0 ;
       
        k = 9999 ;
       
        while ( a [ k ] == 0 )
        {
                k -- ;
        }
       
        if ( k < 9000 )
        {
                return 0 ;
        }
       
        while ( 1 )
        {       
                while ( a [ i ] != a [ j ] )
                {
                        j ++ ;
               
                        if ( j == 9999 && a [ i ] != a [ j ] )
                        {
                                i ++ ;
                                flag = 1 ;
                                j = i + 1 ;
                               
                                break ;
                        }
                }
               
                if ( flag )
                {
                        flag = 0 ;
                       
                        continue ;
                }
               
                k = j - i ;
               
                if ( judge ( a , k , i ) )
                {
                        break ;
                }
                else
                {
                        j ++ ;
                        continue ;
                }
        }

       
        return k ;
}

_Bool judge ( int *a , int k , int i )//判断是不是这个循环
{
        int j , b = i , count = 0 ;
       
        while ( count < 10 )
        {
                j = b + k ;
               
                if ( a [ b ] != a [ j ] )
                {
                        return 0 ;
                }
               
                b ++ ;
                count ++ ;
        }
       
        return 1 ;
}
这是我写的代码,但是不知道为什么总是会运行出错,找了好久没找到错误,求大神告知一下我这段代码到底出错在哪里了,谢谢

自由深渊 发表于 2017-3-21 12:18:00

有没有大神呀

人造人 发表于 2017-3-21 12:20:23

程序是调试出来的
^_^

自由深渊 发表于 2017-3-21 14:55:23

人造人 发表于 2017-3-21 12:20
程序是调试出来的
^_^

什么意思呀?我这个代码不知道为什么运行到一半会奔溃,不明原因,明明各个函数单独运行都没错

自由深渊 发表于 2017-3-21 16:14:51

人造人 发表于 2017-3-21 12:20
程序是调试出来的
^_^

这个代码还是我调试了很多次才写成这样的,就是不知道为什么崩溃,明明看着没错

人造人 发表于 2017-3-21 16:33:21

自由深渊 发表于 2017-3-21 16:14
这个代码还是我调试了很多次才写成这样的,就是不知道为什么崩溃,明明看着没错

fc1735 发表于 2017-3-21 17:15:01

本帖最后由 fc1735 于 2017-3-21 18:18 编辑

if ( j >= 9999 && a [ i ] != a [ j ] )

int a [ 12000 ] = { 0 } ; //函数里有个地方会超出数组范围改到后面的值,懒得修改,所以初始化为12000


算法是错的,只是刚好答案对了,10个小数都相同,第11个还是可能不同

自由深渊 发表于 2017-3-21 20:51:20

人造人 发表于 2017-3-21 16:33


额,这就尴尬了{:10_282:}

自由深渊 发表于 2017-3-21 20:55:02

fc1735 发表于 2017-3-21 17:15
if ( j >= 9999 && a [ i ] != a [ j ] )

int a [ 12000 ] = { 0 } ; //函数里有个地方会超出数组范围改 ...

内个,算法是错的,指的是哪个函数呀,能不能告诉一下呀

fc1735 发表于 2017-3-21 22:00:34

本帖最后由 fc1735 于 2017-3-21 22:07 编辑

if ( !( j % i ) )
                {
                        a [ count ] = j;
                        break ;
                }
                else
                {
                        a [ count ] = j ;
                        j = j % i ;
                }



while ( 1 )
      {      
                while (!a[ i ]){i++;j=i+1;}
                while ( a [ i ] != a [ j ] )




k = j - i ;
return k;
不需要judge函数

自由深渊 发表于 2017-3-21 22:12:14

人造人 发表于 2017-3-21 16:33


感谢,自己改了之后总算可以正常运行了,不太会用调试这个功能,我用的DEV-C++,不知道怎么让循环体里面的数字快速循环,自己一下下点NEXTLINE又很累

人造人 发表于 2017-3-21 22:23:42

自由深渊 发表于 2017-3-21 22:12
感谢,自己改了之后总算可以正常运行了,不太会用调试这个功能,我用的DEV-C++,不知道怎么让循环体里面 ...

不用vs2015吗?
vs2015很好啊
^_^

自由深渊 发表于 2017-3-22 10:31:40

人造人 发表于 2017-3-21 22:23
不用vs2015吗?
vs2015很好啊
^_^

甲鱼推荐的是DEV-C啊

人造人 发表于 2017-3-22 12:20:36

自由深渊 发表于 2017-3-22 10:31
甲鱼推荐的是DEV-C啊

不管用哪一个,一定要学会调试程序,因为程序是调试出来的
^_^
页: [1]
查看完整版本: 关于欧拉计划26题