注册 登录
编程论坛 C语言论坛

求大佬解释这个算法在这道题怎么用的?

梦伦 发布于 2020-09-07 21:27, 1263 次点击
求大佬解释这个算法在这道题怎么用的?

题目: 计算 5/2^50
编程:
#include<stdio.h>
#define N 50
    int main()
{
    int i,j,k,t;
    int a[N]={5};
   for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
{
  t=a[j]+k;
  a[j]=t/2;
 k=t%2*10;
}

}
for(i=0;i<N;i++)
printf("%d",a[i]);
}PS:下划线部分为什么要这么编程
2 回复
#2
沈和2020-09-07 23:39
这位网友,你好。题目的5/2^50。运算符/理解成整数除,还是数学除法?运算符^是理解成异或还是乘方?
程序代码:

#include<stdio.h>
#define N 50
    int main()
{
    int i,j,k,t;
    int a[N]={5};
   for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
{
  t=a[j]+k;
  a[j]=t/2;
 k=t%2*10;
}
}
for(i=0;i<N;i++)
printf("%d,",a[i]);
}

这段的运行结果是

0,0,0,0,0,0,0,-3,0,-2,-2,-5,-1,-8,-2,-9,-7,-8,-6,-8,-2,-5,-9,-6,-5,-1,-2,-9,-5,-3,-7,-5,0,-7,-8,-9,-1,-6,-5,-4,-9,-6,-8,-2,-6,-1,-7,-1,-8,-7,


而两种对运算符的理解,结果和上述结果没看出关联性。
程序代码:

#include <stdio.h>
#include <math.h>

int main(void)
{
  int a = 2;
  int b = 50;
  printf("%d\n", a^b);
  
  printf("%g\n", 5.0 / pow(2, 50));
  return 0;
}


运行结果:

48
4.44089e-15


因此,我觉得没有必要理解划线那段是什么意思。

[此贴子已经被作者于2020-9-7 23:49编辑过]

#3
rjsp2020-09-08 12:22
即使改正了你的错误代码,输出也是 00000000000000044408920985006261616945266723632812,最后一位明显不对,最后一位应当是5。

我来写个正确的代码吧
程序代码:
#include <stdio.h>

int main( void )
{
    // 计算 5/2^50
    enum { N=50 };
    unsigned char a[N+1] = { 5 };
    for( size_t i=0; i!=N; ++i )
    {
        unsigned k = 0;
        for( size_t j=0; j!=sizeof a; ++j )
        {
            unsigned t = a[j] + k;
            a[j] = t/2;
            k = t%2 * 10;
        }
    }

    for( size_t i=0; i!=sizeof a; ++i )
    {
        putchar( '0'+a[i] );
        if( i == 0 )
            putchar( '.' );
    }
}

输出是 0.00000000000000444089209850062616169452667236328125
1