2 bruce pac Bruce_pac 于 2016.01.18 22:33 提问

求(3+√5)的n次方的整数部分最后3位数字(舍去小数点后面),各位大神,这编程怎么解决啊?最好是C或OC 1C

最后结果如果n是10的话就输出047,100的话就输出751

5个回答

caozhy
caozhy   Ds   Rxr 2016.01.18 22:41
 #include <math.h>
int main()
{
    int n = 10;
    double d = 1;
    for (int i = 0; i < n; i++)
        d = d * (3 + sqrt(5));
    printf("%d", ((int)d) % 1000);
}
fei13148687
fei13148687 回复Bruce_pac: (int)d只是取整数,没有四舍五入所以有可能不对
接近 2 年之前 回复
Bruce_pac
Bruce_pac n是100的话,不对啊
接近 2 年之前 回复
qq_27183003
qq_27183003   Ds   Rxr 2016.01.18 23:43

100次方是个很大的数,普通精度计算是不行的。
可以试试高精度计算:
http://www.apfloat.org/apfloat/

qq_27183003
qq_27183003 普通double精度只有15位,满足不了你的需求。如果你是做这方面研究,可以看看这个算法库,据称可以达到19亿以上的有效位数。不过我也没用过,需要你自己研究研究。。呵呵
接近 2 年之前 回复
qq_27183003
qq_27183003 普通double精度只有15位,满足不了你的需求。如果你是做这方面研究,可以看看这个算法库,据称可以达到19亿以上的有效位数。不过我也没用过,需要你自己研究研究。。呵呵
接近 2 年之前 回复
Bruce_pac
Bruce_pac 全英文看不懂啊,大神能大概解释一下什么意思吗
接近 2 年之前 回复
fei13148687
fei13148687   2016.01.19 10:10

#include
int main()
{
int n = 10;
double d = 1;
if(n==0)
{
for (int i = 0; i < n; i++)
d = d * (3 + sqrt(5));
}

printf("%d", ((int)(d+0.5)) % 1000);//正数+0.5取整就是四舍五入

}

fei13148687
fei13148687 回复Bruce_pac: n=100,是要用别的方法处理!
接近 2 年之前 回复
fei13148687
fei13148687 回复Bruce_pac: 应该是不等于!由于公司同事催着要电脑,打错了!之前的没四舍五入只是取整了,你可以试试,不四舍五入算出来是047,四舍五入算出来是048
接近 2 年之前 回复
Bruce_pac
Bruce_pac 这一看就不对了,不可能执行到if语句里,而且n=100的话肯定也不正确
接近 2 年之前 回复
fei13148687
fei13148687   2016.01.20 09:22

#include
int main()
{
int n = 10;
double d = 1;
if(n!=0)
{
for (int i = 0; i < n; i++)
d = d * (3 + sqrt(5));
}

printf("%d", ((int)(d+0.5)) % 1000);//正数+0.5取整就是四舍五入
}
//公司催着要电脑不等于打成了等于!不好意思!

fei13148687
fei13148687   2016.01.20 13:35

如果你要求小数后面的精度是9位的话,1阶的时候有10位数字,乘法得到的数据如果没有被省略(且没有进位)应该是19位数,如果对精度要求很高的话,现有的乘法都不能用,你可以自己自定义乘法来编写这个程序,或者申请一个较大的内存块来存储每次计算的结果,当你要算n=100时,你要求的计算精度还那么高的话,你的计算结果估计要存储10*2^100这么多位的数据

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!