只有77分
查看原帖
只有77分
816549
52wyd楼主2023/1/6 21:00

最后两个测试点错了


#include <stdio.h>
#include <math.h>
 
int a[100010], yu[100010], yy[100010], len = 0, yu_fst;
//a数组记录结果,用于输出
//yu数组:记录余数是否出现过,e.g.yu[34]==1代表出现过34这个余数
//yy数组:顺序记录出现的余数,用于查找f1的位置
int main()
{
    int fz, fm, zheng, i, f1, f2, count;
    scanf("%d %d", &fz, &fm);//fz分子 fm分母
    
    zheng = fz / fm;//整数部分
    fz %= fm;  //化为真分数(取余)
    if (fz == 0)//如果余数为0
    {
        printf("%d.0", zheng);//直接输出结果
        return 0;
    }
    yu_fst = fz % fm; // 整数部分产生的余数
    
    f1 = f2 = -1;//f1、f2分别为开始和结束循环的位置(小数点后的位置)
    for (len = 0; len <= 1e7+10; len ++)//位置从0开始
    {
        fz *= 10;//更新分子(被除数)
        a[len] = fz / fm;//竖式除法记录结果
        fz %= fm;
        yy[len] = fz;//依次记录余数
        
        if (fz == 0)//出现了整除现象,除法结束
            break;
 
        if (yu[fz] == 1 || fz == yu_fst)//如果该余数已出现过
        {
            f2 = len;//循环的右端点
            if (fz == yu_fst) // 循环的左端点是第一个小数的情况
            {
                f1 = 0;
                break;
            }
            for (i = 0; i < len - 1; i ++)
                if (yy[i] == fz)
                {
                    f1 = i + 1;//循环的左端点
                    break;
                }
            break;
        }
        yu[fz] = 1;//记录该余数存在过
    }
    
    printf("%d.", zheng);//输出整数部分
    count = (int)log(zheng) + 1 + 1;
    for (i = 0; i <= len; i ++)//输出小数部分
    {
        count ++;
        if (i == f1)
            printf("(");
        printf("%d", a[i]);
        if (i == f2)
            printf(")");
        if (count % 76 == 0)
            printf("\n");
    }
 
    return 0;
}

我下载的第8个数据: 输入: 1 99991 输出: 由于标准输出太长,这里放不下。开头:0.(000010000900081007结尾:381344320988889)

2023/1/6 21:00
加载中...