c语言编程,编译无错,运行出错

在做三级上机的时候出的问题。。。因为和答案想法不是很一样参考价值不大。。下面是题目和程序。。。各位大大帮忙看哈~~~谢了某级数的前两项A1=1,A2=1,以后各项具有如下... 在做三级上机的时候出的问题。。。
因为和答案想法不是很一样参考价值不大。。
下面是题目和程序。。。各位大大帮忙看哈~~~谢了
某级数的前两项A1=1,A2=1,以后各项具有如下关系:
An=An-2+2An-1(注:n-2与n-1为下标)
下列程序prog1.c的功能是:要求依次对于整数M=100,1000和10000求出对应的n值,使其满足:Sn<M且Sn+1>=M,这里Sn=A1+A2+...+An,并依次把n值存入数组单元b[0],b[1]和b[2]中,请编制jsValue()函数来实现此功能, 最后调用函数writeDat()把数组b[]中的值输出到out.dat文件中。
请勿改动主函数main()和写函数writeDat()的内容。

#include<stdio.h>
int b[3];
void writeDat();
void jsValue( )
{
int i;
int a[1000000],s[100000];
a[0]=1;
a[1]=1;
for(i=2;i<100000;i++)
a[i]=a[i-2]+2*a[i-1];
for(i=0;i<100000;i++)
{s[i]=s[i-1]+s[i];
if(s[i]<100&&s[i+1]>=100)
b[0]=i;
if(s[i]<1000&&s[i+1]>=1000)
b[1]=i;
if(s[i]<10000&&s[i+1]>=10000)
b[2]=i;
}
}
void main()
{
jsValue( );
printf("M=100,n=%d\nM=1000,n=%d\nM=10000,n=%d\n",b[0],b[1],b[2]);
writeDat();
}
void writeDat()
{
FILE *fp;
fp=fopen("out.dat","w");
fprintf(fp,"%d\n%d\n%d\n",b[0],b[1],b[2]);
fclose(fp);
}
void jsValue( )为我自己编的内容
其他是题目给出的。。。
展开
 我来答
bloodelf02
推荐于2016-06-20 · TA获得超过1657个赞
知道小有建树答主
回答量:328
采纳率:0%
帮助的人:487万
展开全部
你的程序有3个问题:

1 你所谓的运行时问题,即栈溢出(stack overflow), 解决方法是使用c语言的malloc函数(相当于C++的new操作符)在堆上分配内存(当然最后根据输出文件的答案来看,你确实数据给大了)

2 逻辑问题,如楼上各楼所说:
s[i]=s[i-1]+A[i];而不是s[i]=s[i-1]+s[i];
你中学数学知识都忘了。。。

3 还是逻辑问题,不改会让你的文件始终输出0 0 0
if(s[i]<100&&s[i+1]>=100)
b[0]=i;
这种类型的应改为:
if(s[i-1]<100&&s[i]>=100)
b[0]=i-1;

这是因为你的逻辑里,每次刚给s[i]赋值,此时s[i+1]还没赋值呢,不能使用

总的改好的如下,我也加了简单的中文注释:

#include<stdio.h>
#include <stdlib.h> // malloc和free函数需要这个头文件
int b[3];
void writeDat();
void jsValue( )
{
int i;
//int a[1000000],s[100000];
//数据太大,避免栈溢出,在堆上分配内存
int* a = (int*)malloc(sizeof(int) * 1000000 );
int* s = (int*)malloc(sizeof(int) * 100000 );

a[0]=1;
a[1]=1;

for(i=2;i<100000;i++)
a[i]=a[i-2]+2*a[i-1];

s[0] = a[0];
for(i=1;i<100000;i++)
{
s[i]=s[i-1]+a[i];
if(s[i-1]<100&&s[i]>=100)
b[0]=i-1;
if(s[i-1]<1000&&s[i]>=1000)
b[1]=i-1;
if(s[i-1]<10000&&s[i]>=10000)
{
b[2]=i-1;
break; //已经找到所有数了,跳出循环,不然会得到错误答案
}
}

//释放malloc 分配的内存
free(a);
free(s);
}

void main()
{
jsValue( );
printf("M=100,n=%d\nM=1000,n=%d\nM=10000,n=%d\n",b[0],b[1],b[2]);
writeDat();
}

void writeDat()
{
FILE *fp;
fp=fopen("out.dat","w");
fprintf(fp,"%d\n%d\n%d\n",b[0],b[1],b[2]);
fclose(fp);
}

参考资料: my smart brain, 同时庆祝我c++问题的采纳率终于突破了50% !!

hippo200208
2010-08-14 · TA获得超过747个赞
知道小有建树答主
回答量:961
采纳率:70%
帮助的人:352万
展开全部
你这里有几个问题:
1。你的数组定得这么大,计算机根本不可能接受;
2。因为只是对M值进行比较判断,所以不应用for 循环而用do while 较好

试改写如下:

a[0]=1;
a[1]=1;
n=3;
s=2;

do while s<100
{ a[n]=....;
s=s+a[n];
n=n+1;}

然后写入b 数组。
再重置a数组,重做二次,将循环判别值改为1000,10000即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-08-14
展开全部
你的第二个循环中当i=0时s[i-1]为s[-1],所以就会出错,
帮你改了一点点
void jsValue( )
{
int i;
int a[1000000],s[100000];
a[0]=1;
a[1]=1;
s[0]=1;
s[1]=2;
for(i=2;i<100000;i++)
{
a[i]=a[i-2]+2*a[i-1];
s[i]=s[i-1]+a[i];
if(s[i]<100&&s[i+1]>=100)
b[0]=i;
if(s[i]<1000&&s[i+1]>=1000)
b[1]=i;
if(s[i]<10000&&s[i+1]>=10000)
b[2]=i;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友08a0473e8
2010-08-14 · 超过12用户采纳过TA的回答
知道答主
回答量:38
采纳率:0%
帮助的人:0
展开全部
第二层循环没有必要吧
你每次算出一个A[i],同事就可以算出来S[i]了
而且,s[i]=s[i-1]+A[i];而不是s[i]=s[i-1]+s[i];
以上两点,希望能有参考价值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式