这道题一开始我就想着把除数一个一个枚举出来,这样就不会重复了,让后我就发现了一个规律,当商小于除数时,这时拆分出来的自然数就会出现重复。

/

/

/

举个例子

256 / 1 = 256

256 / 2 = 128

128 / 3 = (不是整数,跳过)

128 / 4 = 32

32 / 5 = (跳过)

......

32 / 8 = 4 (这里商比除数小,与前面除数4重复了,所以应在32就结束)

所以 256 = 1×2×4×32

/

/

/

再举个例子

114514 / 1 = 114514

114514 / 2 = 57257

57257 / 3 = (跳过)

......

57257 / 31 = 1847

......

1847 / 1847 = 1 (这里商比除数小,与前面除数1重复了,所以应在1847就结束)

所以 114514 = 1×2×31×1847

/

/

/

然后我就想到了用递归,设置边界条件为当商小于除数

#include<stdio.h>
int split(int n,int i,int c){

    while(n%i != 0)i++;
    
    if(n/i <= i)return c+1;
    
    else return split(n/i, i+1, c+1);
    //(n 为待拆整数,i为初始除数,c为自然数个数)
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        printf("%d\n",split(n,1,0));
    }
}

(第一次写题解,如有表达不清,请多海涵 ≧◇≦)