必威体育Betway必威体育官网
当前位置:首页 > IT技术

约数的个数,基础知识不牢导致的问题

时间:2019-10-26 17:44:34来源:IT技术作者:seo实验室小编阅读:80次「手机版」
 

约数

题目描述

输入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

相关阅读

求两个数的最大公约数(C语言)

辗转相减法: #include <stdio.h> #include <stdlib.h> int main() { int a, b; printf("请输入要求公约数的两个数:"); scanf(

TCL幸福树签约数极客大数据分析平台

随着淘宝、天猫等电商平台使用大数据技术获得巨大成功以来,电商企业以数据驱动精细化运营已成为推动企业发展的趋势。近日,TCL集团

求最大公约数和最小公倍数的算法

在刷题的过程中,经常会遇到很多关于最小公倍数和最大公约数的问题。 以下是用C语言写的求最大公约数和最小公倍数的算法。 最大公

分享到:

栏目导航

推荐阅读

热门阅读