當前位置:首頁 » 編程語言 » 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