绅士羊 2023-03-05 17:06 采纳率: 84.6%
浏览 17
已结题

真麻了c语言求循环体


#include<stdio.h>
#include<math.h>
#include<string.h>
#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<decimal)    //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<decimal)    //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);
}

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

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-03-05 18:17
    关注

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

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

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败