当前位置:首页 » 编程语言 » c语言递归超时了怎么办
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言递归超时了怎么办

发布时间: 2022-02-28 22:03:33

c语言超时问题

for(i=a;i<=b;i++)
i每次递增2,因为偶数不可能是。这样可以少一半的时间。

改动几点:
{for(j=2;j<=n;j++)

{if(i%j==0) c=1;}
j 可以从3开始,每次递增2,这样可以少一半的时间。

结合下面的查表法,可以得到更好的结果。

㈡ c语言程序超时问题

把scanf("%d%d",&a,&b); 改为 scanf("%d %d",&a,&b);

试试~

㈢ c语言超时,请帮忙优化

如果你的逻辑没错的话,可以考虑将你的判断语句拿到外面,括号里就放最终的判断值就好了

㈣ C语言程序超时 怎么改

把条件中的函数调用独立出来,条件尽量使用数据的直接比较。

㈤ 一个c语言小代码超时怎么办

问题出在这一行
sort(a+1,a+n+1,cmp);
在输入的时候,你仅录入了n个数据,而排序的时候是从第二个到第n+1个。
应该是
sort(a, a+n, cmp);

㈥ 【C语言新手问题】这个程序超时怎么办

你好,你要优化时间效率。这里可以考虑在计算和的平方之前,对于根本不符合的直接排除。
1.首先,对于数x,它的平方根不可能超过sqrt(x);所以当你计算出两部分和的时候,先检查这个条件是否满足,不满足则continue下一轮循环
2.一个数x平方的个位数跟x的个位数存在一定关系。
x个位数 x^2个位数
1或9 1
2或8 4
3或7 9
4或6 6
5 5
0 0
因此在计算两部分和的时候如果1条件满足,那么检测条件2。
根据上面两个条件,应该可以提高一定的效率。
3.应用多线程,这样同时可以处理几个数据,不过你的算法就要修改一下了。

㈦ C语言的一些简单程序的超时...

#include<stdio.h>
intmain()
{
intn,tmp;
while(scanf("%d",&n)!=EOF)
{
//解出来那个值是一个循环
switch(n%10)
{
case0:tmp=6;break;
case1:tmp=1;break;
case2:tmp=2;break;
case3:tmp=4;break;
case4:tmp=8;break;
case5:tmp=5;break;
case6:tmp=10;break;
case7:tmp=9;break;
case8:tmp=7;break;
case9:tmp=3;break;
default://不可能
break;
}
printf("%d ",tmp);
}
return0;
}

㈧ 一个简单的c语言递归代码问题,想了半天始终理解不了

看看下面的图示过程

先算n-1,算出age(1)后再+2递推

这是整个递归过程

㈨ c语言问题提交显示超时,怎么优化才可以

这道题的难点就是时间,如果用最直接的方法一个个找肯定可以找出来,但是500000个字符串如果作回溯比较将非常耗时。

像wufangyu1992说的思路是对的,想办法把字符串做一个哈希表。但是如果对每一个字符串都提取特征码这个不容易实现而且相当耗时,这里用邻接表实现一个允许冲突的哈希表:

  • 根据题目知道每个字符串最多有10个字符,每个字符的ASCII码不超过127,所以我们可以计算每个字符串的ASCII码和,以这个ASCII码的和作为这个字符串的特征码,可知这个特征码最大为:127*10 = 1270。当然这种计算肯定有可能出现两个不同字符串计算出来的特征码一样,但是我们在特征码相同的地方用链表继续添加到末尾即可。

  • 邻接数组建立之后,读入每个字符串,计算特征码,然后根据特征码把该字符串添加到邻接表。添加的时候先查找这个字符串是否已经存在,如果该字符串节点已存在则表示这个字符串已经出现两次,直接删除该字符串所在的节点;如果这个字符串不在邻接表上则将其添加到邻接表。

  • 所有字符都处理完之后,因为有偶数个的字符串都已经被移除,所以邻接表中只剩下一个未匹配的字符串节点,将其遍历出来即可。

  • 具体代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*accordingtoASCIItable,
*is127,
*/
#defineTABLE_SIZE(127*10)

structnode_s;

typedefstructnode_s{
charstr[11];
structnode_s*next;
}node_t;

inlineintcal_index(constchar*str)
{
intsum=0;
while(*str)
{
sum+=*str;
str++;
}
returnsum;
}

voidproccess_node(node_t*table[],constchar*str,intindex)
{
node_t*p=table[index],*ppre=NULL;

if(p==NULL)/*firstnodeofthisindex,justaddittotable*/
{
p=(node_t*)malloc(sizeof(node_t));
strcpy(p->str,str);
p->next=NULL;
table[index]=p;
return;
}

/*findstr,ifexitsdeleteit,elseaddedtotail*/
while(p)
{
if(!strcmp(p->str,str))
{
/*ifmatched,deleteitfromthelist*/
if(ppre==NULL)/*ifitsthefirstnode*/
{
free(p);
table[index]=NULL;
return;
}
else
{
ppre->next=p->next;
free(p);
return;
}
}
ppre=p;
p=p->next;
}
/*nostringmatched,addanewnodetotail*/
p=(node_t*)malloc(sizeof(node_t));
strcpy(p->str,str);
p->next=NULL;
ppre->next=p;
}

node_t*get_result(node_t*table[],intcount)
{
inti;
for(i=0;i<count;i++)
{
if(table[i]!=NULL)
{
returntable[i];
}
}
}

intmain()
{
node_t**table,*result;
intindex,i,n;
chartmp[11];

scanf("%d",&n);

table=(node_t**)malloc(sizeof(node_t*)*TABLE_SIZE);

if(table==NULL)
{
fprintf(stderr,"nomemory!");
return-1;
}

memset(table,0,sizeof(node_t*)*TABLE_SIZE);

for(i=0;i<n;i++)
{
scanf("%s",tmp);
index=cal_index(tmp);
proccess_node(table,tmp,index);
}

result=get_result(table,TABLE_SIZE);

printf("%s ",result->str);
free(result);
free(table);

return0;
}

㈩ C语言递归问题该怎么学啊!学了很久还是不会搞

给你一个很简单的例子,计算阶乘的:


intjc(intn)
{
returnn<=2?n:n*jc(n-1);
}

当n==4时,4的阶乘应该返回4*3*2=24

使用jc函数,调用printf("%d ",jc(4));会发生如下调用流程:

jc(4)->

n<=2不成立,所以jc(4)返回4*jc(3)

jc(3)->

n<=2不成立,所以jc(3)返回3*jc(2)

jc(2)->

n<=2成立,所以jc(2)返回2

<-返回到调用者jc(3)

jc(3)获得结果3*jc(2)=3*2=6

<-返回到调用者jc(4)

jc(4)获得结果4*jc(3)=4*6=24

<-返回到调用者printf