我写了一个程序来打印所有素数直到给定的数字
I wrote a program to print all primes number up-to a given a number
#include<stdio.h>
float abso(float a)
{
if(a<0.0)
return(-1*a);
else
return a;
}
int sqert(int x)
{
float x1 = (float)x;
float g1, g2;
g1 = x1/2.0;
g2 = x1/g1;
double e=0.000000001;
int sr;
while(abso(g1-g2)>=e)
{
g2 = (g1+x1/g1)/2.0;
g1 = x1/g2;
}
sr = (int)g1;
return(sr);
}
int main()
{
int num;
//num = 0;
printf("Enter a num between 1 and 1000 ");
scanf("%d",&num);
//printf("hello");
int flag;
flag = 0;
int i;
i = 2;
int m, j;
m = j = 0;
while(i<=num)
{
flag = 1;
if(i==2)
{
printf("%d ",i);
i++;
}
else if(i==3)
{
printf("%d ",i);
i= i+2;
}
else if(i>3)
{
m = sqert(i);
for(j=2;j<=m;j++)
{
if((i%j) == 0)
{
flag = 0;
break;
}
}
if(flag == 0)
{
i = i + 2;
continue;
}
if(j==m+1)
printf("%d ",i);
i = i + 2;
}
}
printf("\n");
return(0);
}
这里sqert
函数是对输入值取平方根,abso函数是取给定值的绝对值。
使用的逻辑很简单,我们迭代到该数字的平方根,然后检查每个数字,如果它可以被除自身以外的任何其他数字整除,那么它就不是质数,否则它就是质数。
但是这个程序只对最大 5 的值有效。之后它就不再打印任何东西了。它也不打印输入的数字。
如有任何帮助,我们将不胜感激。
在您的代码中,您试图将 float
与 double
进行比较。
while(abso(g1-g2)>=e)
这是不正确的,因为 float
和 double
之间的精度差异。
double
的精度是 float
的 2 倍。
float
是 32 位 IEEE 754 单精度浮点数
(1位符号,8位指数,23*值),
即 float 有 7 位小数精度。
double
是 64 位 IEEE 754 双精度浮点数
(1 位符号,11 位指数,52* 位值),
即 double 有 15 位小数精度。
将 e
声明为 float
并确保为其分配的值符合 float
的精度。
类似于:
float e = 0.00001;
那么您的代码将按预期工作。
@EricPostpischil 在评论中说 sqert
函数可能并不总是 return 正确的近似值。这是对的。
所以最好使用 math.h
中的 sqrt
来代替 sqert
.
#include<stdio.h>
float abso(float a)
{
if(a<0.0)
return(-1*a);
else
return a;
}
int sqert(int x)
{
float x1 = (float)x;
float g1, g2;
g1 = x1/2.0;
g2 = x1/g1;
double e=0.000000001;
int sr;
while(abso(g1-g2)>=e)
{
g2 = (g1+x1/g1)/2.0;
g1 = x1/g2;
}
sr = (int)g1;
return(sr);
}
int main()
{
int num;
//num = 0;
printf("Enter a num between 1 and 1000 ");
scanf("%d",&num);
//printf("hello");
int flag;
flag = 0;
int i;
i = 2;
int m, j;
m = j = 0;
while(i<=num)
{
flag = 1;
if(i==2)
{
printf("%d ",i);
i++;
}
else if(i==3)
{
printf("%d ",i);
i= i+2;
}
else if(i>3)
{
m = sqert(i);
for(j=2;j<=m;j++)
{
if((i%j) == 0)
{
flag = 0;
break;
}
}
if(flag == 0)
{
i = i + 2;
continue;
}
if(j==m+1)
printf("%d ",i);
i = i + 2;
}
}
printf("\n");
return(0);
}
这里sqert
函数是对输入值取平方根,abso函数是取给定值的绝对值。
使用的逻辑很简单,我们迭代到该数字的平方根,然后检查每个数字,如果它可以被除自身以外的任何其他数字整除,那么它就不是质数,否则它就是质数。
但是这个程序只对最大 5 的值有效。之后它就不再打印任何东西了。它也不打印输入的数字。
如有任何帮助,我们将不胜感激。
在您的代码中,您试图将 float
与 double
进行比较。
while(abso(g1-g2)>=e)
这是不正确的,因为 float
和 double
之间的精度差异。
double
的精度是 float
的 2 倍。
float
是 32 位 IEEE 754 单精度浮点数
(1位符号,8位指数,23*值),
即 float 有 7 位小数精度。
double
是 64 位 IEEE 754 双精度浮点数
(1 位符号,11 位指数,52* 位值),
即 double 有 15 位小数精度。
将 e
声明为 float
并确保为其分配的值符合 float
的精度。
类似于:
float e = 0.00001;
那么您的代码将按预期工作。
@EricPostpischil 在评论中说 sqert
函数可能并不总是 return 正确的近似值。这是对的。
所以最好使用 math.h
中的 sqrt
来代替 sqert
.