c语言编的程序,最好有注释加算法思想,算法需覆盖数据结构
你说的应该是这个题目吧?
写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环 节,要将其用括号括起来。例如:1/3=.00000...表示为.(3),又如41/333=.123123123...表示为.(123)。
一些转化的例子:
1/3=.(3)
22/5=4.4
1/7=.(142857)
3/8=.375
45/46=.803(571428)
用上面的分数和11/59来测试你的程序。
运行举例:
ENTER N,D:17
1/7=.(142857)
本题中,0<=N<=65535,0<=D<=65535,设运算结果小数点后最多保留100位。
(1)解题思路
本题可以模仿手算除法的形式,重复地进行求商和余数的运算,直到余数为0或出现循环节为止。
(2)参考程序
Const Max=100; (小数点后最大位数)
Var Left,Digit:Array[0..Max]of Word; (记录每次的余数和商)
n,d:Word;
q,Top:Word; (q为循环字节的位置)
Procedure Init;
Begin
Write('ENTER N,D:');
Readln(n,d);
End;
Procedure Cacl; (计算)
Var i:Word;
Begin
Digit[0]:=n Div d;
Left[0]:=n Mod d;
Top:=0;
q:=0; (初始化商和余数)
While Left[Top]<> 0 Do (余数不为0则循环)
Begin
Inc(Top);
Digit[Top]:=(Left[Top-1]*10)Div d;
Left[Top]:=(Left[Top-1]*10)Mod d;
For i:=0 To Top-1 Do
If Left[Top]=Left[i] Then
Begin
q:=i+1;
Exit; (如果出现循环节则退出)
End;
End;
End;
Procedure Print;
Var i:Word;
Begin
Write(n,'\',d,'=');
If(Digit[0]<>0 Then Write(Digit[0]);
If Top>0 Then Write('.');
For(i:=1 To Top Do
Begin
If i=q Then Write('(');
Write(Digit[i]);
End;
If q>0 Then Write(')');
Writein;
End;
Begin
Init; {读入数据}
Cacl; {计算}
Print;; {打印结果}
End.
(3)运行结果
ENTER N,D:11 59
11/59=.(1864406779661016949152542372881355932203389830508474576271)
附:改写后的C源程序如下:
#include<stdio.h>
#define Max 100 /*小数点后最大位数*/
int Left[Max];
int Digit[Max]; /*记录每次的余数和商*/
int n,d,q,Top; /*q为循环字节的位置*/
void Init(void)
{
printf("ENTER N,D:");
scanf("%d %d",&n,&d);
}
void Cacl(void) /*计算*/
{
int i=0,j=1;
Digit[0]=n/d; /*求商*/
Left[0]=n%d; /*求余数*/
Top=0;
q=0; /*初始化商和余数*/
while(Left[Top]!=0&&j==1&&Top<100)
{
Top++; /*取下一个数组元素*/
Digit[Top]=(Left[Top-1]*10)/d; /*求商*/
Left[Top]=(int)(Left[Top-1]*10)%d; /*求余数*/
for(i=0;i<Top-1;i++)
{
if(Left[Top]==Left[i]) /*如果出现循环节则退出*/
{
q=i+1;
j=0;
break;
}
}
}
}
void Print(void) /*输出计算结果*/
{
int i;
printf("n/d= ");
if(Digit[0]!=0) printf("%d",Digit[0]);
if(Top>0) printf(".");
for(i=1;i<=Top;i++)
{
if(i==q) printf("(");
printf("%d",Digit[i]);
}
if(q>0) printf(")");
}
void main(void)
{
Init(); /*读入数据*/
Cacl(); /*计算*/
Print(); /*打印结果*/
}
写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环 节,要将其用括号括起来。例如:1/3=.00000...表示为.(3),又如41/333=.123123123...表示为.(123)。
一些转化的例子:
1/3=.(3)
22/5=4.4
1/7=.(142857)
3/8=.375
45/46=.803(571428)
用上面的分数和11/59来测试你的程序。
运行举例:
ENTER N,D:17
1/7=.(142857)
本题中,0<=N<=65535,0<=D<=65535,设运算结果小数点后最多保留100位。
(1)解题思路
本题可以模仿手算除法的形式,重复地进行求商和余数的运算,直到余数为0或出现循环节为止。
(2)参考程序
Const Max=100; (小数点后最大位数)
Var Left,Digit:Array[0..Max]of Word; (记录每次的余数和商)
n,d:Word;
q,Top:Word; (q为循环字节的位置)
Procedure Init;
Begin
Write('ENTER N,D:');
Readln(n,d);
End;
Procedure Cacl; (计算)
Var i:Word;
Begin
Digit[0]:=n Div d;
Left[0]:=n Mod d;
Top:=0;
q:=0; (初始化商和余数)
While Left[Top]<> 0 Do (余数不为0则循环)
Begin
Inc(Top);
Digit[Top]:=(Left[Top-1]*10)Div d;
Left[Top]:=(Left[Top-1]*10)Mod d;
For i:=0 To Top-1 Do
If Left[Top]=Left[i] Then
Begin
q:=i+1;
Exit; (如果出现循环节则退出)
End;
End;
End;
Procedure Print;
Var i:Word;
Begin
Write(n,'\',d,'=');
If(Digit[0]<>0 Then Write(Digit[0]);
If Top>0 Then Write('.');
For(i:=1 To Top Do
Begin
If i=q Then Write('(');
Write(Digit[i]);
End;
If q>0 Then Write(')');
Writein;
End;
Begin
Init; {读入数据}
Cacl; {计算}
Print;; {打印结果}
End.
(3)运行结果
ENTER N,D:11 59
11/59=.(1864406779661016949152542372881355932203389830508474576271)
附:改写后的C源程序如下:
#include<stdio.h>
#define Max 100 /*小数点后最大位数*/
int Left[Max];
int Digit[Max]; /*记录每次的余数和商*/
int n,d,q,Top; /*q为循环字节的位置*/
void Init(void)
{
printf("ENTER N,D:");
scanf("%d %d",&n,&d);
}
void Cacl(void) /*计算*/
{
int i=0,j=1;
Digit[0]=n/d; /*求商*/
Left[0]=n%d; /*求余数*/
Top=0;
q=0; /*初始化商和余数*/
while(Left[Top]!=0&&j==1&&Top<100)
{
Top++; /*取下一个数组元素*/
Digit[Top]=(Left[Top-1]*10)/d; /*求商*/
Left[Top]=(int)(Left[Top-1]*10)%d; /*求余数*/
for(i=0;i<Top-1;i++)
{
if(Left[Top]==Left[i]) /*如果出现循环节则退出*/
{
q=i+1;
j=0;
break;
}
}
}
}
void Print(void) /*输出计算结果*/
{
int i;
printf("n/d= ");
if(Digit[0]!=0) printf("%d",Digit[0]);
if(Top>0) printf(".");
for(i=1;i<=Top;i++)
{
if(i==q) printf("(");
printf("%d",Digit[i]);
}
if(q>0) printf(")");
}
void main(void)
{
Init(); /*读入数据*/
Cacl(); /*计算*/
Print(); /*打印结果*/
}
温馨提示:答案为网友推荐,仅供参考