昨日明月 发表于 2013-9-14 17:08:27

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

本帖最后由 昨日明月 于 2013-9-14 17:46 编辑

# include <stdio.h>
int main(void)
{
int i;
int a;
int b;
int c;
double n=0;
    intm=22734;
    for(i=1;i<=57;++i)
{
n=m*i;
a=n/3600;
b=((n/3600)-a)*60;
c=(((n/3600)-a)*60-b)*60;
printf("%d°%d′%d″\n",a,b,c);
}
return 0;
}

输出结果:
6°18′54″
12°37′48″
18°56′42″
25°15′36″
31°34′29″。。。。。
341°0′35″
347°19′29″
353°38′23″
359°57′17″
Press any key to continue
第五排正确的结果应该是31°34′30″想问一下这个程序哪里出问题了,理论计算与计算机程序计算结果相差1秒
ps:1°=60′=3600″

wf2725864 发表于 2013-9-14 17:29:19

a,b,c怎么能定义整数呢,我去

昨日明月 发表于 2013-9-14 17:32:07

就是要输出整数,你好好看看程序

风随意 发表于 2013-9-14 18:47:47

不懂

昨日明月 发表于 2013-9-14 18:53:44

风随意 发表于 2013-9-14 18:47 static/image/common/back.gif
不懂

就是加工齿轮 需要将360°等分。多少个齿数就多少等分

昨日明月 发表于 2013-9-14 19:03:12

本帖最后由 昨日明月 于 2013-9-14 19:04 编辑

attach://297038.jpg 完善了程序。

fmdd 发表于 2013-9-14 19:12:47

double也是浮点数据类型,它比float更大,这种东西计算精度不高。

由于n是doubule型,那a、b、c与n运算后,全部自动升级为double型了。

由于360*3600=1296000,已经超过int的最大值范围了,对这种超大的整数运算,你需要使用“大数运算”的方法去处理。

关于C语言的大数运算,网上有很多相关的资料。

昨日明月 发表于 2013-9-14 19:55:38

fmdd 发表于 2013-9-14 19:12 static/image/common/back.gif
double也是浮点数据类型,它比float更大,这种东西计算精度不高。

由于n是doubule型,那a、b、c与n运算后 ...

嗯 谢谢。

如果云知道 发表于 2013-9-14 23:09:36

学习来了

逍遥处士 发表于 2013-9-14 23:10:45

fmdd 发表于 2013-9-14 19:12 static/image/common/back.gif
double也是浮点数据类型,它比float更大,这种东西计算精度不高。

由于n是doubule型,那a、b、c与n运算后 ...

在32位机器上,int占用4个字节,1个字节8位,故int共可表示2^32=4294967296种信息,32位的第一位为符号位,故其值域为 -2147483648 ~ +2147483648,容纳楼主的数值还是有余的,没有超范围。

a=n/3600,在计算n/3600时,会建立一个double型的临时变量用以存放结果,然后再将结果的整数部分赋值给a,而不会将a升级成double型。因为a、b、c被定义成int时,在内存中已经被分配了4个字节,而double型占用的是8个字节,所以它们是不可能升级成double型的。

页: [1] 2 3
查看完整版本: 求解一个C语言程序功能是每隔6°18′54″就增加6°18′54″并输出结果的程序问题。