回 帖 发 新 帖 刷新版面

主题:新近在教学生时要求学生编一道求小数位数的程序

新近在教学生时要求学生编一道求小数位数的程序, 一位学生编程如下:
var i:real;
    j:integer;
begin
  readln(i);
  repeat
    i:=i*10;
    j:=j+1;
    until i=trunc(i);
  writeln(j);
end.

输入:
   23.234
输出:
   3           ----->正确

输入:
    7.98
输出:
    15     正确的结果应为2.


请教各位大虾,问题出在什么地方.   是否是I实数有误差???

回复列表 (共12个回复)

沙发

var a:char;
b:string;
i,k:integer;
begin
read(a);
while a<>'.' do
begin
read(a);
end;
readln(b);
i:=length(b);
writeln(i);
readln;
end.

板凳

var
  j:integer;
  i:real;
begin
  readln(i);
  j:=0;
  repeat
    i:=i*10;
    inc(j);
  until i=trunc(i);
  writeln(j);
end.

3 楼

var s:string;
begin
  readln(s);writeln(length(s)-pos('.',s));
end.

4 楼

2楼和lz的程序其实没有什么本质区别,不能改变real型的存储误差
记得别的语言中读到
对于这种类型判断是否已经无小数位的本质方法是如下中止条件判断
i-trunc(i)<.000000000001

5 楼

我只是加了个变量赋0而已。。。。。。
4楼说的很对,我忘了。

6 楼

对于这道题 我认为小田甜 的程序 不错
   记住 浮点数始终存在误差 如我我给你的输入数据是
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
 浮点数怎么处理啊
   
  OI中的人啊!!!!
  但是小田甜的 程序没考虑 只有整数位的情况
   这是我的丑程序
program number;
  var
   num:ansistring;
   n,m,l:longint;
  begin
    readln(num);
    n:=pos('.',num);
    m:=length(num)-n;
    if (n=0) thene m:=0;
    writeln(m); 
  end.
  
如果错了请勿笑话

7 楼

果然出错 “then”打成了“thene”

8 楼

我赞成6楼blackmark 的方法
不过还可以更简单一点,我帮你改改

var
  s:string;
  i:integer;
begin
  readln(s);
  i:=pos('.',s);
  if i=0
    then writeln('0')
    else writeln(length(s)-i);
end.

9 楼

program lx;
  var
    st:string;
  begin
    readln(st);
    writeln(length(st)-pos('.', st));
  end.
程序未经调试

10 楼

楼上的没有考虑没有小数时的情况

我来回复

您尚未登录,请登录后再回复。点此登录或注册