很奇怪的问题。关于文件输出
#include <conio.h>
#include <stdio.h>
/* 判断是否为素数 */
int isPrime( int m )
{
int i;
for( i=2;i<m;i++ )
if( m%i==0 )
return 0;
return 1;
}
int prime( int m,int n,int a )
{
int i,j;
int prime;
for( j=m+1;;j++ )
if( prime=isPrime( j )== 1 )
{
return j;
}
}
void main()
{
int m,n,i;
int a[3000];
int result=0;
FILE *fp;
clrscr();
printf("Please input m: ");
scanf("%d",&m );
printf("\nPlease input n: ");
scanf("%d",&n );
for( i=0;i<10;i++ )
a[i]=0;
result=prime( m,n,a[0] );
a[0]=result;
for( i=1;i<n;i++ )
{
result=prime( a[i-1],n,a[i] );
a[i]=result;
}
for( i=0;i<n;i++ )
printf("\n\n%d ", a[i] );
if( (fp=fopen("out.txt","w"))==NULL )
{
printf("\nCan't open this file.");
getch();
exit(0);
}
for( i=0;i<n;i++ )
{
fprintf( fp, "%d ", a[i] );
}
}
m为第一个素数,n为要输出多少个大于m的素数.
但现在问题是,我要是输出小一些的数,就会正确。如我输入3和5,输出5,7,11,13,17,文件输出也正常。但如果我输入3和2999(我数组定义大小为3000),屏幕输出正常。但文件输出错误。这是什么原因呀。还有如果我把所有的int型定义成long型后,则会出错。这是为什么?如果数组定义过大(如定义成a[30000] ),就会出错。是什么原因?
问题点数:10、回复次数:10Top
1 楼rorot(rorot)回复于 2004-05-01 20:44:50 得分 1
我再TC3和VC6下测试,文件是正常得.Top
2 楼newegg2002(同志们,同胞们,大学的四年,是扎实基础的四年!!)回复于 2004-05-01 21:07:11 得分 2
把所有的int型定义成long型后
如果数组定义过大(如定义成a[30000] ),就会出错。
///////////////
你所说的这两个错误在我这儿都没有出现..我猜之所以出错.恐怕是一个原因:存储分配问题..你定义的变量占用空间太大了..在这方面好像都有限制的..Top
3 楼newegg2002(同志们,同胞们,大学的四年,是扎实基础的四年!!)回复于 2004-05-01 21:20:33 得分 5
呵.关于文件输出的问题我也已经解决了..对于你的程序作如下改动:
for( i=0;i<n;i++ )//这一句改为for( i=0;i<=n;i++ )
{
fprintf( fp, "%d ", a[i] );
}
就行了.另外.因为输出的数有可能超过int型的范围,,所以输出文件中有可能会有"负数"出现,,
不要用long,用unsigend int 也行啊..
Top
4 楼skycncomp(闭关修练到年底)回复于 2004-05-01 21:37:40 得分 0
那为什么我把数组定义成30000大小会出错呢。
文件输出前半部份正确,后半部他错误。是负数。
这是什么原因?Top
5 楼julyclyde(Java初学(大学不教只好自己学))回复于 2004-05-01 22:01:37 得分 1
%udTop
6 楼huolong1312(耶稣也上网)回复于 2004-05-01 22:12:40 得分 0
我一直不明白isPrime这是什么意思~!是调出函数吗?Top
7 楼julyclyde(Java初学(大学不教只好自己学))回复于 2004-05-01 22:34:03 得分 0
/* 判断是否为素数 */
int isPrime( int m )
{
int i;
for( i=2;i<m;i++ )
if( m%i==0 )
return 0;
return 1;
}
Top
8 楼newegg2002(同志们,同胞们,大学的四年,是扎实基础的四年!!)回复于 2004-05-01 22:38:34 得分 1
不是说了嘛 ..后面的数太大超出了int 型所能表达的范围嘛..
当最高位变为1的时候,当然变成负数了.因为最高位是个标志位,,0为正..1为负嘛..
可以扩大输出的范围嘛..用无符型可以解决一下这个问题.不过也不能太大了..Top
9 楼skycncomp(闭关修练到年底)回复于 2004-05-02 02:08:21 得分 0
明白了。用无符号的就OK了。
我想试一下我要求100万个素数?该如何考虑这个程序呢?
高手请解答一下。
给些思路。应该是很难的。Top
10 楼skycncomp(闭关修练到年底)回复于 2004-05-06 12:26:48 得分 0
没人给解释一下吗?
100万个素数如何来求。Top




