九度OJ 1087 约数的个数解题报告

xiaoxiao2021-02-28  55

题目描述:

输入n个整数,依次输出每个数的约数的个数

输入:

输入的第一行为N,即数组的个数(N<=1000)接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)当N=0时输入结束。

输出:

可能有多组输入数据,对于每组输入数据,输出N行,其中每一行对应上面的一个数的约数的个数。

样例输入: 5 1 3 4 6 12 样例输出: 1 2 3 4 6 #include<stdio.h> int Count(int x){ int i,cnt=0; for(i=1;i*i<x;i++){ if(x%i==0) cnt+=2; } if(i*i==x) cnt++; return cnt; } int main(){ int num,i,A[1001]; while(~scanf("%d",&num)){ if(num==0) break; for(i=0;i<num;i++) scanf("%d",&A[i]); for(i=0;i<num;i++) printf("%d\n",Count(A[i])); } return 0; } /* 5 1 3 4 6 12 样输出: 1 2 3 4 6*/ #include<stdio.h> int Count(int x){ int i,cnt=0; for(i=1;i*i<=x;i++){ if(x%i==0) cnt+=2; } i--; if(i*i==x) cnt--; return cnt; } int main(){ int num,i,A[1001]; while(~scanf("%d",&num)){ if(num==0) break; for(i=0;i<num;i++) scanf("%d",&A[i]); for(i=0;i<num;i++) printf("%d\n",Count(A[i])); } return 0; } /* 5 1 3 4 6 12 样输出: 1 2 3 4 6*/ #include<stdio.h> int Count(int x){ int i,cnt=0; for(i=1;i*i<=x;i++){ if(x%i==0) cnt+=2; } if((i-1)*(i-1)==x) cnt--; return cnt; } int main(){ int num,i,A[1001]; while(~scanf("%d",&num)){ if(num==0) break; for(i=0;i<num;i++) scanf("%d",&A[i]); for(i=0;i<num;i++) printf("%d\n",Count(A[i])); } return 0; } /* 5 1 3 4 6 12 样输出: 1 2 3 4 6*/

准确来说:由于sqrt是double类型的,所以会丢失精度,应该用int强制类型转换

最关键是理解:if(x%i==0) (i,x/i)那么x/i<i 他跟(x/i,i)重复 

(1,60),(2,30),(4,15),(5,12),(6,10),i<sqrt(x)的时候,继续

if i>sqrt(x) 那么x/i>i 

转载请注明原文地址: https://www.6miu.com/read-2619050.html

最新回复(0)