写出方法,,要是能写出代码更好,我要C写的,不要C++
1、判断循环的关键是在确定每位小数的时候,判断余数是否出现与之前的相同。
2、例程:
int repetend( //求循环节的函数,返回值为循环长度,共3个参数int a, //第一个参数为被除数
int b, //第二个参数为除数
char *Str) //第三个参数为用于存循环节每一位的数组指针
{int Rem[255], //用于存余数的整型数组
Div1=a, //把被除数保存下来,因为后面可能会改变被除数的值
Div2=b; //把除数也保存下来,因为后面可能会改变除数的值
if(a==0 or b==0) return 0; //如果被除数或者除数为0,函数返回0值
if(Div1<0) Div1=Div1*-1; //正负并不影响求循环节,所以被除数和除数都取绝对值
if(Div2<0) Div2=Div2*-1; //正负并不影响求循环节,所以被除数和除数都取绝对值
for(;Div1*10<Div2;){Div1=Div1*10;}
/*如果被除数乘以10小于除数,就通过一个循环不断让被除数乘以10,直到被除数乘以10大于
或者等于被除数,这样可以清除掉小数点后面的0.000000这些多余的数据。*/
Rem[0]=Div1%Div2; //第一次保存余数
for(int i=0;;i++) //用一个死循环检索小数点后面的每一位
{Div1=Rem[i]*10; //每一次的被除数都为前一次余数乘以10
Str[i]=Div1/Div2; //得到第i位小数(0为第1位,1为第2位,以此类推)
Rem[i+1]=Div1%Div2; //保存余数
if(Rem[i+1]==0) //不管小数点后第几位,如果余数为0,说明能除尽,不会出现循环
{Str[0]=0; //循环节为0
return 1;} //函数返回1,这是根据你题目中要求的,但我觉得应该设为0比较合理
for(int j=0;j<=i;j++) //再用一重循环比较之前所有的余数,确定循环节起始点
if(Rem[i+1]==Rem[j])
/*判断是否出现循环的关键是判断余数是否和之前的某一次相同。如果当前余数等于之前的某一
次余数,说明开始出现循环。循环点的起点为j,终点为i,循环长度为(i-j)+1位小数,当上述判断为真时,就可以结束函数*/
{for(int k=0;k<=(i-j);k++) Str[k]=Str[j+k]; //整理循环节数组
return (i-j)+1;} //函数返回循环长度
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2012-05-13
#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;
}本回答被提问者采纳
#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;
}本回答被提问者采纳