这道题一开始我就想着把除数一个一个枚举出来,这样就不会重复了,让后我就发现了一个规律,当商小于除数时,这时拆分出来的自然数就会出现重复。
/
/
/
举个例子
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));
}
}
(第一次写题解,如有表达不清,请多海涵 ≧◇≦)