C语言-求因子和

求因子和

题目描述:

一个数的因子和不包括它本身的所有因子之和,如12的因子有1、2、3、4、6所以12的因子和是16。现在给定一个数n(n<=10^9),求它的因子和。

输入格式:

一个数。

输出格式:

一个数。

样例输入:

12

样例输出:

16

提示:

60%的数据,n<=10,000;
80%的数据,n<=1,000,000;
100%的数据,n<=1,000,000,000;

这题第一次写的时候,一般人都会想到直接枚举,即直接从1一直枚举到该数除本身的最大因子。于是有了下面这一段代码:

#include <stdio.h>

int main()
{
	long n, s = 0, x;
        int i;
	scanf("%ld", &n);
	for (i = 1; i < n; i++)	{
		if (n % i == 0)
			s += i;
	}
	printf("%ld", s);
	return 0;
}

但是这段代码一遇到大数就超时。原因是从1一直枚举到最大因子数量太多,效率太低。这里有一种解决方案,就是当枚举一个因子时,立马将输入的数除以这个因子,这样就可以只枚举到n的算术平方根了。代码如下:

#include <stdio.h>
#include <math.h>

int main()
{
	long n, s = 0;
        int i;
	scanf("%ld", &n);
	for (i = 1; i <= sqrt(n); i++)	{
		if (n % i == 0)
			if (i == n / i)
				s += i;
			else
				s = s + i + n / i;
	}
	printf("%ld", s - n);
	return 0;
}

原文地址:https://www.cnblogs.com/kgdy-wwy-mfkd/p/11072372.html

时间: 2024-10-01 19:52:19

C语言-求因子和的相关文章

C语言求质数的算法

前言 上次被出了一题质数的C语言求解题目(面试),当时用了最粗暴的算法,回来仔细参考资料,其实答案有很多种: 1,小学生版本: 判断 x 是否为质数,就从 2 一直算到 x-1. static rt_uint32_t array1[ARRAY_LEN]; void func1(void) { for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++) { array1[i - 1] = 0; } rt_uint32_t x, y = 0, z = 0; rt_uin

用c语言求ax^2+bx+c=0方程的解

用c语言求ax^2+bx+c=0方程的解.#include <stdio.h>#include <math.h>#define m 0.000001int main(){     float a,b,c,x,x2,n,q,p;     scanf ("%f%f%f",&a,&b,&c);     n=b*b-4*a*c;     if ((a<m)&&(a>-m))     {         x=(-c)/b

C语言求积分

编一个程序,求定积分. 1 #include<stdio.h> 2 int main() 3 { 4 float x,n=100000,integral=0,i; 5 for(i=0;i<100000;) 6 { 7 i++; 8 x=n*n; 9 integral+=i/x; 10 } 11 printf("%0.5f\n",integral); 12 return 0; 13 } C语言求积分

hdu1215七夕节 筛选法求公因子和

hdu1215七夕节 数据量比较大,筛选法求公因子和即可. #include <iostream> #include<cstdio> #include<string.h> #define maxn 500005 using namespace std; int ans[maxn]; int main() { int cas; int n; cin >> cas; memset(ans,0,sizeof(ans)); for(int i = 1;i <

C语言求最大公约数和最小公倍数

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和

C语言——求最大公约数及最小公倍数

基本概念 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数.整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号. 最大公约数:也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号. 关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数). 方法分析 最大公

C语言求x的y次方,自定义函数,自己的算法

我是一名高二中学生,初中时接触电脑,非常酷爱电脑技术,自己百度学习了有两年多了,编程语言也零零散散的学习了一点,想在大学学习计算机专业,所以现在准备系统的学习C语言,并在博客中与大家分享我学习中的心得与思路.希望大牛路过的时候指点指点. 可以说是第N次学习C语言了,都是学到数组和函数这里停止了,这次下定了决心要学完C语言,不光要学完,还要学好下面是利用自定义函数写的一个模仿pow()函数工作的一个小程序[求x的y次方] 1 #include<stdio.h> 2 3 int main(void

C语言求两个数中最大公约数

在C语言中如何求两个数的最大公约数呢?下面用三种方法进行求解. 方法一:穷举法. 先比较两个数的大小,然后找出较小数t,最后判断t为何值时两个数都能整除,此方法效率较低. 代码如下: #include<stdio.h> int main() {      int num1,num2,temp,i;      scanf("%d%d",&num1,&num2);      if(num1>num2)      {            temp=num1

C语言求10个整数中的最大值

我们知道求三个整数的最大值可以先定义三个变量来存放这三个数值,但是如果有十个,一百个,一千个,我们不可能定义那么多变量出来,没有什么意义.怎么解决呢?这个时候我们可以用一个数组来存放我们需要比较的数值,比如十个值,我们就用a[10].美观简洁高效!数据的存放解决了,下来就是比较,先定义一个变量比如:MAX来存放这十个数其中的一个值再一一进行比较就可以了,但为了方便起见,我们通常选择数组的第一个值即a[0]赋值给变量,然后依次和a[1].a[2]....顺序比较.如果MAX小于a[1]则把a[1]