c语言怎样找无限循环小数的循环体
两个整数相除,如果结果是有限小数就直接输出,如果是无限循环小数就按以下形式输出:0.3333输出0.(3)。如输入1,3,输出0.(3)。问如何找到循环体,用c语言编程怎...
两个整数相除,如果结果是有限小数就直接输出,如果是无限循环小数就按以下形式输出:0.3333输出0.(3)。如输入1,3,输出0.(3)。问如何找到循环体,用c语言编程怎么实现?
展开
4个回答
展开全部
//我研究了一下午,查了好多资料,终于搞定了
#include <stdio.h>
#include <memory.h>
#define MAX_LEN 1000
int nume; //numerator分子
int deno; //denominator分母
int quot[MAX_LEN]; //quotient商
int rem[MAX_LEN]; //remainder余数
int negative_flag; //负数标志
void save_quot_rem() //存取商和余数
{
int i;
negative_flag = nume/(double)deno < 0 ? 1 : 0; //若是负数则标志为1
nume = nume < 0 ? -nume : nume; //若是负数则转换为正数,下同
deno = deno < 0 ? -deno : deno;
for(i=0; i<MAX_LEN; i++)
{
quot[i] = nume/deno;
rem[i] = nume%deno;
nume = 10*rem[i];
if(!rem[i])
break;
} //for
}
//判断是否是循环小数,若是则保存循环节起始和结束位置
int is_circu(int *start, int *end)
{
int i, j;
for(i=0; i<MAX_LEN; i++)
{
if(-1 == rem[i])
return 0;
}
for(i=0; i<MAX_LEN; i++)
{
for(j=i+1; j<MAX_LEN; j++)
{
if(rem[i] == rem[j])
{
*start = i;
*end = j;
return 1;
} //if
} //for
} //for
return 0;
}
void show_circu(int start, int end) //显示循环小数
{
int i;
printf(negative_flag ? "-%d." : "%d.", quot[0]); //整数部分
for(i=1; i<=start; i++) //小数非循环节部分
{
printf("%d", quot[i]);
}
printf("(");
for(i=start+1; i<=end; i++) //小数循环节部分
{
printf("%d", quot[i]);
}
printf(")\n\n");
}
void show_not_circu() //显示非循环小数
{
int i;
if(-1 == quot[1]) //无小数部分
{
printf(negative_flag ? "-%d" : "%d", quot[0]);
printf("\n\n");
return;
}
printf(negative_flag ? "-%d." : "%d.", quot[0]);
for(i=1; (i < MAX_LEN) && (-1 != quot[i]); i++) //小数部分
{
printf("%d", quot[i]);
}
printf("\n\n");
}
int main()
{
int start, end;
printf("请输入分子和分母,用空格分开(输入两个0离开):\n");
while(1)
{
fflush(stdin);
scanf("%d%d", &nume, &deno);
if(!nume && !deno)
return 0;
memset(quot, -1, sizeof(quot));
memset(rem, -1, sizeof(rem));
if(!deno)
{
printf("除数不能为0,请重新输入:\n");
continue;
}
save_quot_rem();
is_circu(&start, &end) ? show_circu(start, end) : show_not_circu();
}
return 0;
}
//测试数据: 35416156 61616315
// 1 7
#include <stdio.h>
#include <memory.h>
#define MAX_LEN 1000
int nume; //numerator分子
int deno; //denominator分母
int quot[MAX_LEN]; //quotient商
int rem[MAX_LEN]; //remainder余数
int negative_flag; //负数标志
void save_quot_rem() //存取商和余数
{
int i;
negative_flag = nume/(double)deno < 0 ? 1 : 0; //若是负数则标志为1
nume = nume < 0 ? -nume : nume; //若是负数则转换为正数,下同
deno = deno < 0 ? -deno : deno;
for(i=0; i<MAX_LEN; i++)
{
quot[i] = nume/deno;
rem[i] = nume%deno;
nume = 10*rem[i];
if(!rem[i])
break;
} //for
}
//判断是否是循环小数,若是则保存循环节起始和结束位置
int is_circu(int *start, int *end)
{
int i, j;
for(i=0; i<MAX_LEN; i++)
{
if(-1 == rem[i])
return 0;
}
for(i=0; i<MAX_LEN; i++)
{
for(j=i+1; j<MAX_LEN; j++)
{
if(rem[i] == rem[j])
{
*start = i;
*end = j;
return 1;
} //if
} //for
} //for
return 0;
}
void show_circu(int start, int end) //显示循环小数
{
int i;
printf(negative_flag ? "-%d." : "%d.", quot[0]); //整数部分
for(i=1; i<=start; i++) //小数非循环节部分
{
printf("%d", quot[i]);
}
printf("(");
for(i=start+1; i<=end; i++) //小数循环节部分
{
printf("%d", quot[i]);
}
printf(")\n\n");
}
void show_not_circu() //显示非循环小数
{
int i;
if(-1 == quot[1]) //无小数部分
{
printf(negative_flag ? "-%d" : "%d", quot[0]);
printf("\n\n");
return;
}
printf(negative_flag ? "-%d." : "%d.", quot[0]);
for(i=1; (i < MAX_LEN) && (-1 != quot[i]); i++) //小数部分
{
printf("%d", quot[i]);
}
printf("\n\n");
}
int main()
{
int start, end;
printf("请输入分子和分母,用空格分开(输入两个0离开):\n");
while(1)
{
fflush(stdin);
scanf("%d%d", &nume, &deno);
if(!nume && !deno)
return 0;
memset(quot, -1, sizeof(quot));
memset(rem, -1, sizeof(rem));
if(!deno)
{
printf("除数不能为0,请重新输入:\n");
continue;
}
save_quot_rem();
is_circu(&start, &end) ? show_circu(start, end) : show_not_circu();
}
return 0;
}
//测试数据: 35416156 61616315
// 1 7
展开全部
{
int a[MAX_NUM]={0};
int M , N;
printf( "请输入两个数,格式为(M/N) ");
scanf( "%d/%d ",&M,&N);
for(int i=1;i <=N;++i)
{
M = (M*10) % N;
if((0==M)||(a[M]))
break;
a[M] =i;
}
if(M)
printf( "%d/%d的循环从第%d位开始循环,循环位数为%d ", M, N, a[M], i-a[M]);
else
printf( "非循环小数 ");
}
你可以把printf部分按照自己的想法输出来:比如:printf("%d.(%d)",M/N,M*10%N);
int a[MAX_NUM]={0};
int M , N;
printf( "请输入两个数,格式为(M/N) ");
scanf( "%d/%d ",&M,&N);
for(int i=1;i <=N;++i)
{
M = (M*10) % N;
if((0==M)||(a[M]))
break;
a[M] =i;
}
if(M)
printf( "%d/%d的循环从第%d位开始循环,循环位数为%d ", M, N, a[M], i-a[M]);
else
printf( "非循环小数 ");
}
你可以把printf部分按照自己的想法输出来:比如:printf("%d.(%d)",M/N,M*10%N);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int i;
printf(negative_flag ? "-%d." : "%d.", quot[0]); //整数部分
for(i=1; i<=start; i++) //小数非循环节部分
{
printf("%d", quot[i]);
}
printf("(");
for(i=start+1; i<=end; i++) //小数循环节部分
{
printf("%d", quot[i]);
}
printf(")\n\n");
}
注释:两个整数相除,如果结果是有限小数就直接输出,
如果是无限循环小数就按以下形式输出:0.3333输出0.(3)。如输入1,3,输出0.(3)即可。
printf(negative_flag ? "-%d." : "%d.", quot[0]); //整数部分
for(i=1; i<=start; i++) //小数非循环节部分
{
printf("%d", quot[i]);
}
printf("(");
for(i=start+1; i<=end; i++) //小数循环节部分
{
printf("%d", quot[i]);
}
printf(")\n\n");
}
注释:两个整数相除,如果结果是有限小数就直接输出,
如果是无限循环小数就按以下形式输出:0.3333输出0.(3)。如输入1,3,输出0.(3)即可。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只对真分数进行讨论
1)约分,得到最简分数形式 a/b
2)判断分母是否还有2和5之外的其它质因数,若有、则为无限循环小数
3)找到一个形为 9...90..0的数字 c,即连续m个9、n个0的一个数字(m>=1、n>=0)、且这个数字c能够被分母b整除;且记 m个9为 c2, 则有 c=c2*10^n
4)a/b上下通分为 d/c的形式,然后分两种情况讨论:
5)若n=0,则小数部分全部为循环部分,循环体为 (d)
6)若n>0,则用计算 d被c2整除的结果,作为混循环小说的开始部分;
再用 d%c2的结果,作为循环体。
1、2步骤比较简单,就不用例子讨论了。
用7/45做例子看一下:
3) 找到90能够被45整除,所以 c2=9, n=1, c=9*10=90
4) 7/45通分为14/90
6) 因n>1:
用计算 d被c2整除的结果,作为混循环小说的开始部分:
14/9=1(整数除法),所以 1是小数开始部分
再用 d%c2的结果,作为循环体:
14%9=5,所以循环体是5
结果是: 7/45=14/90=0.15555555555555555...=0.1(5)
1)约分,得到最简分数形式 a/b
2)判断分母是否还有2和5之外的其它质因数,若有、则为无限循环小数
3)找到一个形为 9...90..0的数字 c,即连续m个9、n个0的一个数字(m>=1、n>=0)、且这个数字c能够被分母b整除;且记 m个9为 c2, 则有 c=c2*10^n
4)a/b上下通分为 d/c的形式,然后分两种情况讨论:
5)若n=0,则小数部分全部为循环部分,循环体为 (d)
6)若n>0,则用计算 d被c2整除的结果,作为混循环小说的开始部分;
再用 d%c2的结果,作为循环体。
1、2步骤比较简单,就不用例子讨论了。
用7/45做例子看一下:
3) 找到90能够被45整除,所以 c2=9, n=1, c=9*10=90
4) 7/45通分为14/90
6) 因n>1:
用计算 d被c2整除的结果,作为混循环小说的开始部分:
14/9=1(整数除法),所以 1是小数开始部分
再用 d%c2的结果,作为循环体:
14%9=5,所以循环体是5
结果是: 7/45=14/90=0.15555555555555555...=0.1(5)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询