真麻了c语言求循环体


#include
#include
#include
#define decimal 100    //control accuracy

int  stack[255] = {0};
int  result_stack[255] = {0};
int convert2int(char* str,int x[]) //返回值是 int 数组的长度
{
    int state = -1 , state_old;
    int len = 0 , i = 0 , j;
    char buff[255];
    while(*str!= '\0')
    {
        state_old = state;
        switch((*str))            //状态机
        {
            case ' ':
                state = -1;
                break;
            case '/':
                state = 1;
                break;
            default:
                if(state == -1) 
                    state = 0;
                buff[i] = *str;
                i++;
        }    
        str++;
        if(state_old!= state && state!= 0)
        {
            j = 0;
            while(i)
            {
                x[len] += (buff[j] - '0')*(int)pow(10,i-1);
                i--;
                j++;
            }
            len++;
            i = 0;
        }
    }
    return len;
}

int checkrepeat(int x)
{
    int i = 0;
    while(i<255)
    {
        if(stack[i]==x) return i;
        if(!stack[i])
        {
            stack[i] = x;
            break;
        }
        i++;
    }
    return -1;
}


void main()
{
    char buff[255];
    int  buff_num[255] = {0};
    int str_len , i = 0,j = 0,z = 0;    // i for print position,z for accuracy control
    int k,m,x  = 0;
    int begin_num = -1,end_num = -1;
    int flag = 0;
    printf("please input nums:");
    gets(buff);

    str_len = strlen(buff);                //add space for convinient handling
    buff[str_len] = ' ';
    buff[str_len+1] = '\0';

    str_len = convert2int(buff,buff_num);
    while(str_len>0)
    {
        k = buff_num[j];
        m = buff_num[j+1];
        x = sprintf(&buff[i],"%d",k/m);
        sprintf(&buff[x+i],"%c",'.');
        i += x+1;
        z = 0;
        while(z//find repeat address
        {
            k = 10*(k%m);
            result_stack[z] = k/m;
            if(k%m == 0) 
            {
                end_num = z;    
                break;
            }
            if((begin_num = checkrepeat(k))!= -1)
            {
                end_num = z-1;
                break;
            }
            z++;
        }
        z = 0;
        while(z//print the result
        {
            if(z== begin_num) 
            {
                sprintf(&buff[i++],"%c",'(');
                flag = 1;
            }
            sprintf(&buff[i],"%d",result_stack[z]);
            if(z== end_num) 
            {
                if(    flag )
                {
                    sprintf(&buff[++i],"%c",')');
                }
                sprintf(&buff[++i],"%c",'\n');
                i++;
                flag = 0;
                break;
            }
            i++;
            z++;
        }
        memset(stack,0,255);
        memset(result_stack,0,255);
        str_len -= 2;
        j += 2;
    }
    printf("%s\n",buff);
}

麻了看了一天看不懂,哭了谁能用汉语说下思路啊

“Devil组”引证GPT后的撰写:
好的

  • 这段代码的作用是将输入的数字字符串进行分数转换,然后将分数转换为小数,并按照小数的精度控制打印结果,如果出现了循环小数,就打印出循环体。
  • 代码的具体实现使用了状态机,将数字字符串按照分数的格式分割成整数和分子,然后进行小数的计算和打印。为了控制精度,使用了一个长度为 100 的数组来存储小数位,并在小数部分找到循环小数的位置。
  • 主要的循环体是在处理每一个分数时,将其转换为小数,并找到循环体的位置。最后将结果按照要求打印出来。
  • 由于代码结构比较复杂,建议你先去了解一下状态机的基本原理,再结合具体代码分析。