【问题标题】:Find the worst case running time of this algorithm for checking if a number is divisible by 3找出该算法的最坏情况运行时间,以检查一个数是否可​​被 3 整除
【发布时间】:2018-02-05 08:12:37
【问题描述】:

我编写了这个算法来检查一个数字是否能被 3 整除。它首先检查输入的 N 是否为一位数。如果 N 不是单个数字,则计算其数字的总和并将其分配给 N。外部 while 循环迭代直到数字 n 等于 1。然后程序检查 N 的最终值是否等于0、3、6 或 9,在这种情况下 N 可以被 3 整除。 例如当N=5432157且n=7时,则N=5+4+3+2+1+5+7=27且n=2,则N=2+7=9且n=1。因此,外部 while 循环迭代了 3 次。

    #include <stdio.h>
    main(){
        int N,n=0,rN,sum=0;
        printf("Enter the number: ");
        scanf("%d",&N);
        rN=N;
        while(n!=1){
            n=0;
            sum=0;
            while(N>0){
                sum+=N%10;
                N/=10;
                n++;
            }
            N=sum;
        }
        if(N==0||N==3||N==6||N==9){
            printf("\n%d is divisible by 3.",rN);
        }
        else{
            printf("\n%d is not divisible by 3.",rN);
        }
    }           

对于最坏的情况分析,我假设 N 的所有数字都等于 9。我观察到,对于小于 11 的数字数,外部 while 循环最多迭代 3 次。对于大于或等于 11 但小于 10^11 的 n,循环最多迭代 4 次。我尝试了一些 n 大于或等于 10^11 的情况,并看到外循环迭代了 5 次。我无法找到这种情况的通用公式。另外,对于内部 while 循环,对于外部 while 循环的每次迭代,迭代 n(当前值 N 中的位数)次,n 如何随着外部 while 循环的每次迭代而减小?

【问题讨论】:

  • 你可以使用:if( !(number %3) ) 然后数字可以被 3 整除

标签: c algorithm time division analysis


【解决方案1】:

如果您仔细观察,您的每个(外部)迭代都需要 log(N_current) 步骤。每走一步,您的电话号码也会变成log(N)(准确地说是9*log(N))。

外部迭代将一直持续到 N_current 有 1 个数字。

所以你的总复杂度将是 -

log(N) + log(log(N)) + log(log(log(N))) + ... + 1 ;     (1)

迭代次数为log*N

现在,我不知道如何减少 (1),但如果您过于近似并认为每个步骤都是 log(N),您可以将复杂度写为

O(log(N) * log*(N)) (注意大写O)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多