机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 6250|回复: 21

求解一个C语言程序功能是每隔6°18′54″就增加6°18′54″并输出结果的程序问题。

[复制链接]
发表于 2013-9-14 17:08:27 | 显示全部楼层 |阅读模式
本帖最后由 昨日明月 于 2013-9-14 17:46 编辑 ) D! Z# B# e4 r* p- h! O

+ O- u* c: L- v/ ]# include <stdio.h>
! H7 X2 |9 _+ G' Oint main(void)
, w4 s- O) ^3 h) c+ c( G9 ~{
7 `! W# l9 b! Sint i;2 u7 W: e% _5 `9 K! G, u
int a;- W$ l7 m  }+ v8 Q4 F+ W
int b;, ]( Q; S) ~; g2 a9 Z  W4 F
int c;# P+ D6 Z5 |7 n$ i8 I4 z6 z
double n=0;
+ q; ^& D" r: d8 l' b( [; q! F    int  m=22734;  C1 G; b4 _; |( C' |& i1 C: _
    for(i=1;i<=57;++i)
. `% h2 ?6 ?2 N$ h% p. ~{
6 n, g; K1 N. v. _  n=m*i;
: a( w4 o6 J8 f. C2 y7 F& y  a=n/3600;
! [0 ]* ~8 j7 Z  b=((n/3600)-a)*60;  E) y+ W$ h1 v1 U9 v
  c=(((n/3600)-a)*60-b)*60;0 I2 ~6 P/ r" r" F" y5 E
  printf("%d°%d′%d″\n",a,b,c);  S, i  ]1 m% o# R
}
- }9 C  M( y& t7 U0 I5 G4 Sreturn 0;
' V7 ?9 u9 F5 L- N" K. B}$ T2 g& s  d1 i& k+ a! c6 }7 t
3 h8 f$ d/ k! a( D$ }: T
输出结果:) M; V/ y! Z4 @2 E" `! B( m4 Q
6°18′54″
0 f. q6 v  R" J* T+ S12°37′48″* O  ~1 O% J7 m, y1 @
18°56′42″( V+ N9 E! n5 u. u) g& ~
25°15′36″* b6 w6 s; a2 v9 j6 e
31°34′29″
。。。。。
! }+ y* g, _$ e. p/ R
341°0′35″3 M5 p8 l. ?! V( E+ g6 X+ o; H! H9 J
347°19′29″
, E, M$ Q; a/ Y  ~( h! S: `353°38′23″# N4 b. m2 ?6 J5 q* T) V5 N8 r
359°57′17″

/ s( ~% m) D/ p/ n$ \  l
Press any key to continue2 g$ p* b. d. U, g* [1 i
第五排正确的结果应该是31°34′30″  想问一下这个程序哪里出问题了,理论计算与计算机程序计算结果相差1秒! q% O/ ?! j8 Q/ H, I. A$ }, _% ~5 g- [
ps:1°=60′=3600″

4 i( H8 k2 p5 s" Z% {
回复

使用道具 举报

发表于 2013-9-14 17:29:19 | 显示全部楼层
a,b,c怎么能定义整数呢,我去

点评

就是要输出整数,你好好看看程序  发表于 2013-9-14 17:32
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-14 17:32:07 | 显示全部楼层
就是要输出整数,你好好看看程序

点评

不可能吧,就那个算错了,其它56结果都是对的。  发表于 2013-9-14 17:35
我也是提个建议呵呵  发表于 2013-9-14 17:35
整数精度不够吧  发表于 2013-9-14 17:34
回复 支持 反对

使用道具 举报

发表于 2013-9-14 18:47:47 | 显示全部楼层
不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-14 18:53:44 | 显示全部楼层
风随意 发表于 2013-9-14 18:47 # @8 T% m2 F1 B( [! D" Y. @. h. c
不懂
& F; y* F) ?% g( o& Q, d4 _3 B
就是加工齿轮 需要将360°等分。多少个齿数就多少等分
; M6 |9 M3 \: b3 s' x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-14 19:03:12 | 显示全部楼层
本帖最后由 昨日明月 于 2013-9-14 19:04 编辑
  y7 |7 K7 K" `$ T, Y7 [% ]/ B2 p+ p
' s; ^$ ?! B* }! G; xhttp://www.cmiw.cn/forum.php?mod=attachment&aid=Mjk3MDM4fDI4YmNhOGNhODg3NWYzYjcxZGVmYWU3OTM3MzljYTQ2fDE3NDM3MDczNjA%3D&request=yes&_f=.jpg 完善了程序。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
回复 支持 反对

使用道具 举报

发表于 2013-9-14 19:12:47 | 显示全部楼层
double也是浮点数据类型,它比float更大,这种东西计算精度不高。
. i. T1 I! P* Q2 I$ X/ ~% T0 }" u  m# @- V( P" F% W
由于n是doubule型,那a、b、c与n运算后,全部自动升级为double型了。
0 `. |9 ?) v7 e; N! P) S
* |2 a/ G) j* [4 c由于360*3600=1296000,已经超过int的最大值范围了,对这种超大的整数运算,你需要使用“大数运算”的方法去处理。
: J0 j" O3 A0 J7 ~& V- M( t
' A. H2 E7 l# m8 P4 V关于C语言的大数运算,网上有很多相关的资料。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-14 19:55:38 | 显示全部楼层
fmdd 发表于 2013-9-14 19:12
' F* r; V2 z  n/ ydouble也是浮点数据类型,它比float更大,这种东西计算精度不高。3 [3 N# s( i8 k: ]* N; Q

$ Z) `/ U8 z" L/ I- i% e由于n是doubule型,那a、b、c与n运算后 ...
2 r0 T0 y9 d1 K* a) c- J
嗯 谢谢。: W0 S8 S: {! m# N) F& P; J% S
回复 支持 反对

使用道具 举报

发表于 2013-9-14 23:09:36 | 显示全部楼层
学习来了
回复 支持 反对

使用道具 举报

发表于 2013-9-14 23:10:45 | 显示全部楼层
fmdd 发表于 2013-9-14 19:12
; C' b* H) h; ldouble也是浮点数据类型,它比float更大,这种东西计算精度不高。
& y& M" t+ {& ?+ |! V' H, _7 O) t; k3 J/ B
由于n是doubule型,那a、b、c与n运算后 ...

5 P0 A* S7 z1 L" |. ]5 S* N在32位机器上,int占用4个字节,1个字节8位,故int共可表示2^32=4294967296种信息,32位的第一位为符号位,故其值域为 -2147483648 ~ +2147483648,容纳楼主的数值还是有余的,没有超范围。
( C5 I9 D* p6 j9 j/ P( V4 {" ?, ~  V1 W5 O& N( F. w6 u6 E: w  O* |
a=n/3600,在计算n/3600时,会建立一个double型的临时变量用以存放结果,然后再将结果的整数部分赋值给a,而不会将a升级成double型。因为a、b、c被定义成int时,在内存中已经被分配了4个字节,而double型占用的是8个字节,所以它们是不可能升级成double型的。$ d3 Z: R% N5 \6 @& |/ h6 {

8 N) s  `' k" |, K9 l
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-4-4 03:09 , Processed in 0.072154 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表