注册 登录
编程论坛 C语言论坛

输出无限循环小数的循环节

逢考必过阿俊 发布于 2022-01-15 22:51, 1502 次点击
自己想到的方法就是使用数组,如果一个数字两次出现就记录两次下标,然后从两个下标开始一位一位地向后比较。不过这个方法有问题,而且自己写出来的程序非常繁琐,所以想请教一下这道题的程序要怎么写?
只有本站会员才能查看附件,请 登录
5 回复
#2
rjsp2022-01-16 13:06
我随手写的,不保证无误,仅供参考

程序代码:
#include <stdio.h>

void foo( unsigned m, unsigned n )
{
    printf( "%u", m/n );
    m %= n;
    if( m != 0 )
    {
        putchar( '.' );
        unsigned mark[100] = { 0 };
        for( unsigned i=1; m!=0; ++i )
        {
            if( mark[m] != 0 )
            {
                printf( "\nfrom %u to %u", mark[m], i-1 );
                break;
            }
            else
            {
                mark[m] = i;

                putchar( '0' + m*10/n );
                m = m*10%n;
            }
        }
    }
    putchar( '\n' );
    return;
}

int main( void )
{
    foo( 100, 2 );
    foo( 100, 3 );
    foo( 136, 90 );
    foo( 77, 78 );
}
#3
逢考必过阿俊2022-01-19 10:38
回复 2楼 rjsp
是的,就是这样,谢谢你!
#4
逢考必过阿俊2022-01-19 11:02
回复 2楼 rjsp
请问foo函数里面的m = m*10%n 是什么作用呢,可以简单解释一下吗?它和求最大公约数时用的取模运算是不是一个原理呀?
#5
rjsp2022-01-20 14:04
回复 4楼 逢考必过阿俊
这是“竖式除法”呀, 当前的余数 乘以 10,然后再除以 除数
#6
逢考必过阿俊2022-01-24 16:21
回复 5楼 rjsp
噢,是这样啊,谢谢你!
1