【发布时间】: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