[英]How to make my program work faster?
我試圖運行此代碼,但顯示在某些情況下超過了時間限制,如何縮短時間?
我需要了解程序中花費了很多時間的東西,例如某些函數等。我了解到通過改善迭代過程和復雜性,我可以減少執行時間,但並沒有太大幫助。請幫助
程序很簡單,我取a點和b點,然后計算所有回文數的數字。
#include<stdio.h>
int ifpalin(int g)
{
int rev=0;
int tmp=g;
while(tmp>0)
{
rev=rev*10+(tmp%10);
tmp=tmp/10;
}
if(rev==g)
return 1;
else
return 0;
}
int findpalin(int a1,int b1)
{
int sm=0;
for(int i=a1;i<=b1;i++)
{
if (ifpalin(i)==1)
sm++;
}
printf("%d",sm);
printf("\n");
return 0;
}
int main()
{
int a,b,n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
scanf("%d",&b);
findpalin(a,b);
}
return 0;
}
您的代碼已經非常高效(作為算法的實現,可以改進)。 這些挑戰希望您找到一種“非顯而易見的”,但效率更高的算法。 也就是說,在這種情況下,您不應檢查a
和b
之間a
每個數字。
這里還有另一種解決方案,即您可以直接“知道”回文數。 像這樣思考:
用一位數字,有10
回文[0, ..., 9]
,
用兩位數表示的回文數為9
[11, ..., 99]
。
對於三位數字,有9種可能性,其中第一位和最后一位等於[1, ..., 9]
。 對於可行的回文,中間也必須是回文。 由於中間有一個數字,所以我們知道這里有10個回文的可能性,因此我們有3個數字的9 * 10 = 90
回文。
用4位數字,我們得到9 * 10
(兩位數回文,現在也允許00),用5位數字9 * 100
(3位p,以0開頭)。
因此,您可以導出n位數字的公式。 然后,您可以直接得出a和b之間的大條紋的數量,而只需要擔心哪些數字是相關的,以及由於a和b不是10^(n-1)
和10^n - 1
對於每個給定的g,您的int ifpalin(int g)
函數可以並行運行,因為此函數的輸入數據似乎不同,對其他數據沒有影響。 您可以並行運行此功能。
在int findpalin(int a1,int b1)
函數中,有一個for循環,其復雜性順序為N,在這里可以運行線程。 (每個線程運行ifpalin
函數)。 當然,需要一個好的並行計划。 您可以按一定的邏輯順序運行此功能,然后匯總結果。
另一方面,任何基准測試都應在發布模式下執行。
希望對您有所幫助。
如果我的英語寫作不好,不好意思, 請糾正我 。
In ifpalin Convert the number to string Reverse the string Compare with the original If equal then it's a palindrome
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.