约数
题目描述
输入n个整数,依次输出每个数的约数的个数。
输入
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入
6
1 4 6 8 10 12
0
样例输出
1
3
4
4
4
6
我的思路
要求求出输入的数共有几个约数,可以采取直接枚举的方法,但是由于所给的数字达到了10的9次方,如果直接枚举会超时,所以采取了先开方的方法,若遇到类似于4 * 4 = 16这种情况则要将计数器减一。
提交代码:
//求每个数的约数
#include<stdio.h>
#include<math.h>
int main(){
int n;
while(scanf("%d", &n), n){ //输入n为0时循环结束
for(int i = 0; i < n; i++){
int x;
scanf("%d", &x);
int y = sqrt(x); //开方
int sum = 0;
for(int j = 1; j <= y; j++){ //枚举约数
if(x % j == 0){
sum += 2;
}
}
if(y * y == x){
sum--;
}
printf("%d\n", sum);
}
}
return 0;
}
这个代码花费了我很久的时间,因为我一开始直接枚举导致了超时,后来在别人的代码中发现了问题所在,改正之后提交却依然超时。
长时间思考没有结果之后询问了群里的大佬,下面是更改了枚举方法之后仍超时的代码:
错误代码:
//求每个数的约数
#include<stdio.h>
#include<math.h>
int main(){
int n;
while(scanf("%d", &n) != 0){ //输入n为0时循环结束
for(int i = 0; i < n; i++){
int x;
scanf("%d", &x);
int y = sqrt(x); //开方
int sum = 0;
for(int j = 1; j <= y; j++){ //枚举约数
if(x % j == 0){
sum += 2;
}
}
if(y * y == x){
sum--;
}
printf("%d\n", sum);
}
}
return 0;
}
问题就在于while循环中scanf不等于0这个地方,这个地方导致我即使输入n = 0也无法使循环结束,所以无限循环导致了我的超时,并不是思路上的错误,而是关于C语言基础知识的错误。
更改之后:while(scanf("%d", &n), n)
,逗号运算符返回逗号右边的值,这样可以成功终止循环。
文章最后发布于: 2019-03-04 18:55:19
相关阅读
辗转相减法: #include <stdio.h> #include <stdlib.h> int main() { int a, b; printf("请输入要求公约数的两个数:"); scanf(
随着淘宝、天猫等电商平台使用大数据技术获得巨大成功以来,电商企业以数据驱动精细化运营已成为推动企业发展的趋势。近日,TCL集团
在刷题的过程中,经常会遇到很多关于最小公倍数和最大公约数的问题。 以下是用C语言写的求最大公约数和最小公倍数的算法。 最大公