当前位置: 代码迷 >> 综合 >> 清华大学-约数的个数
  详细解决方案

清华大学-约数的个数

热度:88   发布时间:2024-01-06 13:12:33.0

题目描述
输入n个整数,依次输出每个数的约数的个数
输入描述:
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出描述:
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
示例1
输入

5
1 3 4 6 12
输出

1
2
3
4
6


分析:第一次提交代码,超时了。。。。

#include <stdio.h>
#include <math.h>
int main(){int n;int a[1000],sum[1000];while(scanf("%d",&n)!=EOF){for (int i = 0; i <n ; i++) {scanf("%d",&a[i]);sum[i]=0;}for(int i=0;i<n;i++){for(int j=1;j<=a[i];j++){if(a[i]%j==0){sum[i]++;}}}for (int i = 0; i <n ; i++) {printf("%d\n",sum[i]);}}return 0;
}

因为没考虑到数据量数据大小对问题的影响,采用了较简单的思路
所以后续做了以下更改,方得以正确运行


#include <stdio.h>
int main(){int n;int a[1000],sum[1000];while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&a[i]);sum[i]=0;int j;for(j=1;j*j<a[i];j++){if(a[i]%j==0){sum[i]+=2;}}if(j*j==a[i]){sum[i]++;}}for(int i=0;i<n;i++){printf("%d\n",sum[i]);}}return 0;
}

判断一个数num的约数个数,以i*i小于num为循环结束条件,则可以节约一半的时间