c - 找出该算法的最坏情况运行时间,以检查一个数字是否能被 3 整除

标签 c algorithm time division analysis

我编写了这个算法来检查数字能否被 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。我观察到,对于位数 n 小于 11 的情况,外部 while 循环最多迭代 3 次。对于 n 大于或等于 11 但小于 10^11,循环最多迭代 4 次。我尝试了 n 大于或等于 10^11 的几种情况,发现外循环迭代了 5 次。我无法找到这种情况的通用公式。另外,对于内部 while 循环,外部 while 循环的每次迭代都会迭代 n(N 当前值中的位数) 次,那么 n 如何随着外部 while 循环的每次迭代而减少?

最佳答案

如果您仔细观察,您的每次(外部)迭代都需要 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)

关于c - 找出该算法的最坏情况运行时间,以检查一个数字是否能被 3 整除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45912539/

相关文章:

c - 如何在 C 中的 Factorial while 循环内找到数字的平方?

c - 数据在广播 UDP 套接字中累积(FIFO?)

python - 如何在pygame中等待一段时间?

c++ - OpenGL 如何进行单元测试?

c - 如何在不创建临时文件的情况下从 char * 创建 FILE*

c++ - 这个for循环的运行时间复杂度是多少

c++ - 如何加快计算最长公共(public)子串的长度?

java - 合并排序 : Revision

c - 如何在 C 的 useconds 中获取当前进程的开始时间?

time - TCL-如何知道某个功能工作了多少时间?