簡體   English   中英

如何使我的程序運行更快?

[英]How to make my program work faster?

我試圖運行此代碼,但顯示在某些情況下超過了時間限制,如何縮短時間?

我需要了解程序中花費了很多時間的東西,例如某些函數等。我了解到通過改善迭代過程和復雜性,我可以減少執行時間,但並沒有太大幫助。請幫助

程序很簡單,我取a點和b點,然后計算所有回文數的數字。

我的執行時間僅超過0.0015秒!

#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;
}

您的代碼已經非常高效(作為算法的實現,可以改進)。 這些挑戰希望您找到一種“非顯而易見的”,但效率更高的算法。 也就是說,在這種情況下,您不應檢查ab之間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

請參閱如何反轉std :: string?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM