C语言问题 不懂 请教达人 20分求解

#include<stdio.h>voidmain(void){intp,i,m,n;inta[100];3<=n<=40;a[2]=1,a[3]=2;a[n]=a[n-... #include <stdio.h>
void main(void)
{
int p,i,m,n;
int a[100];
3<=n<=40;
a[2]=1,a[3]=2;
a[n]=a[n-1]+a[n-2];
scanf("%d",&p);
for(i=1;i<=p;i++)
{
scanf("%d",&m);
printf("%d\n",a[m]);
a[m]=0;
m=0;
}
return 0;
}

不知道为什么这段代码编译的时候会弹出应用程序错误的对话框 请大家指导下 谢谢!

#include <stdio.h>
void main(void)
{
int a,b;
while(scanf("%d,%d",&a,&b)!=EOF)
{
if(a==0&&b==0)
continue;
int c,i;
int d;
int e=1;
for(i=1;i<=b;i++)
e*=a;
d=e%1000;
printf("%d\n",d);
e=1;
}

}
运行输入6789,10000 后输出的值为负 不知道应该怎么改 麻烦达人指教下 谢谢!
回3楼:的确是没开始好好学C啊 现在很后悔...................................................

继续

第一个问题:
int a[100];
3<=n<=40;
a[2]=1,a[3]=2;
a[n]=a[n-1]+a[n-2];

对于这段代码我想起到的功能是系统能自动算出a[1]到a[100]的值并先存储起来,为了下面a[m]可以直接从这些中直接读取一个值。是不是不能这样写?如果要写的话,应该怎么样编写呢?能否帮我写个示范 谢谢

第二个问题:

有谁能再解释详细点么 或者提点下我应该去看C教材中的哪些章节。问题貌似有点麻烦 请大家帮帮忙 谢谢了!
展开
 我来答
阿鸾44
2009-12-15 · TA获得超过2137个赞
知道大有可为答主
回答量:2141
采纳率:50%
帮助的人:648万
展开全部
3<=n<=40;
没有这种语法,即使编译不出错,也只是一个逻辑值,对整个程序没任何意义

2、你是算6789的1000次方,这么大的数肯定溢出,int类型只能表示正负65535这么大的数(好像是),long类型也只能表示正负2的31次方,所以你的出这么大的结果肯定溢出,所以必须设计另一种大数的算法

大数的算法涉及到进位,涉及到乘法原理,不是简单修改语句就能实现。有些程序设计比赛就是考这些大数的乘法

大概思路是:设两个数(二进制,任何数都可以表示二进制)相乘,因long是4字节,32位,要完全表示你这么大的天文数字,必须扩展表示的位数。新建一个有足够位数的变量保存结果,新建两个储存现有乘数。这些变量中要有表示符号和进位的位,然后相乘时如果需要进位则设置进位标记……太麻烦,不说了,自己找吧 ,看看乘法运算原理你就明白了,计算机组成原理的书上有说

给你找了一个大数乘法的实现代码
http://zhidao.baidu.com/question/29232515.html

参考资料: http://zhidao.baidu.com/question/29232515.html

ubai
2009-12-15 · TA获得超过481个赞
知道小有建树答主
回答量:583
采纳率:50%
帮助的人:321万
展开全部
1.声明了一个 int变量 n ,并没有赋予值:这时里面随机的垃圾值了。
在a[n]的时候 如果这个垃圾值大于100,就会有溢出现象,这时如果侵犯了别的内存领域,就会出错了。

2.
e = 1, e*=a => e = 1*6789 在这里不管下面的代码,b=10000,要运行一万次,而 e 一直在累积,不等到 b 到10000以前,e 已经超出了 int 范围了。

================================================================
看这两段代码,就看出你粗心大意,基础不稳了. 在细心一些吧.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
panwb2005
2009-12-15 · TA获得超过806个赞
知道小有建树答主
回答量:454
采纳率:50%
帮助的人:427万
展开全部
关于第二个问题是长整型越界了,第一个,既然你main都是void了,干嘛还return 0?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-12-15
展开全部
第一段程序中,n没有赋值就去使用是导致运行出错的原因,另外3<=n<=40;这种表达形式也有问题,应该是n>=3&&n<=40;按照对你程序的理解,修改如下:

//---------------------------------------------------------------------------

#include <stdio.h>
void main(void)
{
int p,i,m,n;
int a[100];
scanf("%d",&n); /*注意这里*/
if (n>=3&&n<=40) { /*注意这里*/
a[n]=a[n-1]+a[n-2];
}

a[2]=1,a[3]=2;

scanf("%d",&p);
for(i=1;i<=p;i++)
{
scanf("%d",&m);
printf("%d\n",a[m]);
a[m]=0;
m=0;
}
/*注意这里,函数类型是void,无需返回值*/
}

//---------------------------------------------------------------------------

2.

你知道6789的10000次方是多大的一个数字吗?它远远远远超出了int类型可以表示是最大值(事实上,它也远远超出了double类型的最大值),当然会出现负数了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式