CPP 1192 整数的因子数

题目链接:http://cpp.zjut.edu.cn/ShowProblem.aspx?ShowID=1192

题面:

整数的因子数

Time Limit:2000MS  Memory Limit:32768K

Description:

找出整数的所有因子数。 一个整数n的因子数为包含它自身的所有因子的个数。例如:12的因子数为6(1,2,3,4,6,12)。

Input:

输入数据中含有一些整数n(1≤n<2^32)。

Output:

对于每个n,列出其所有因子数,每个n加上冒号单独列一行。

Sample Input:

11 22 33 24

Sample Output:

11: 2
22: 4
33: 4
24: 8

Source:

qianneng

题意:

特别简单,就是数据量太大。我算是水过的吧,数据中没有出现很大的素数。把每个数分解为质数,然后统计它每个质数的个数。因子数为每个质数的个数+1连乘的结果。证明很简单,每个质数可以取0到其个数个,故证得。

今天某位大神说是用pollard rho,看了下觉得还是很好地不能解决很大素数的情况,不过有空还是可以试一下。

估计应该还有更好的方法,找到了再补充。

代码:

#include <iostream>
#include <map>
#include <cmath>
using namespace std;
map <unsigned int,int> store;
bool is_prime(unsigned int x)
{
	if(x==1)return false;
	else if(x==2)return true;
	int y=sqrt(1.0*x);
	for(int i=2;i<=y;i++)
	{
		if(x%i==0)
		return false;
	}
	return true;
}
void cal(unsigned int x)
{
	if(is_prime(x))
	store[x]++;
	else
	{
		int y=sqrt(1.0*x);
		for(int i=2;i<=y;i++)
		{
			if(x%i==0)
			{
				cal(i);
				cal(x/i);
				break;
			}
		}
	}
}

int main()
{
	unsigned int n,tmp,ans;
	while(cin>>n)
	{
	    cout<<n<<": ";
		ans=1;
		if(n==1)
		{
			cout<<1<<endl;
			continue;
		}
	  store.clear();
	  int up_limit=sqrt(1.0*n);
	  tmp=n;
	  for(int i=2;i<=up_limit;i++)
	  {
  	     if(tmp%i==0)
		   {
		     cal(i);
			 cal(tmp/i);
			 break;
		   }
   	  }
   	  if(store.size()==0)
		 {
		   cout<<2<<endl;
		   continue;
		 }
   	  map <unsigned int,int> ::iterator  iter;
   	  for(iter=store.begin();iter!=store.end();iter++)
   	  ans*=((iter->second)+1);
   	  cout<<ans<<endl;
	}
	return 0;
}
时间: 2024-11-10 14:30:48

CPP 1192 整数的因子数的相关文章

输入一组整数,求子数组和的最大值。(数组进行首尾相接之后)

输入一组整数,求子数组和的最大值. 题目:返回一个一维整数数组中最大子数组的和. 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. ? 10 -9 8 7 -5 3 ? i : 4 3 2 1 0 ? nALL : 3 3 7 15 15 16 ? nStart: 3 -2 7 15 6 16 ? nStart = max(arr[i], arr[i]+

返回一个整数数组最大子数的和

题目要求:返回一个整数数组最大子数的和 题目分析:通过累加,加上一个数看它的值得大小来解决问题 原文地址:https://www.cnblogs.com/yzhztoutlook/p/9769929.html

设计一个程序,让它能够返回一个整数数组最大子数的和,并能完成几项测试

实验人员:常啸帆,毕文强 实验要求:必须能处理1000个元素: 每个元素是int32类型的,出现子数组之和大于显示最大范围会出现什么情况: 输入一个整形数组,有正也有负: 数组中连续的一个或多个整数组成一个数组,每个子数组都必须有一个和: 求所有子数组和的最大值,要求时间复杂度为o(n).实验过程:在本次实验中,我们两人通过所学的c++知识来编写程序,在过程中我们发现了一下问题并逐步解决 在编写的过程中,首先会发现数组中少了一个元素,那是因为在循环时length写成了length-1,     

返回一个整数数组最大子数和。(新)

一.要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果数组A[0]--A[j-1]首尾相邻,允许A[i-1],......A[n-1], A[0]--A[j-1]之和最大. 二.设计思想: 如果数组首尾相连,那么每一个元素都可以当成是开头即从A[n]开始,到A[n-1]结束,这样的话,就相当用剪子在一开始的数组中的元素的前一位剪开.这样的话,可以建立新的三个数组,前两个数组分别盛放剪开的两部分,第三个数组则是

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

返回一个整数数组中子数组的最大值

要求: 输入整数数组,子数组求和,求子数组的最大值,时间复杂度为0, 设计思想: 随机生成N个整数,规定子数组的个数最大值为3的随机值,先生成一个数n1,在用for循环将前n个数向加赋值给sun[i],再生成一个随机数n2,,将n1到n2 之间的数相加赋值给sun[j++],依次循环,如果n1+n2+······大于N那将最后的和在赋值给sun[j],然后判断sun[]中的最大值,最后输出 public class Test { /** * @param args */ final static

环形数组最大子数组之和

题目:返回一个整数数组中最大子数组的和.要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 合作伙伴:孟西鑫 博客地址:http://home.cnblogs.com/u/wanzitou/feed/blog/ 结对编程要求: 两人结对完成编程任务. 一人主要负责

最大子数组和2.0

//求最大子数组和 张鹏宇 武于微 /**************************************************************** 题目要求: 用户输入整数组,首尾相接,寻找最大子数组,求出其和,并返回子数组位置 思路: 用户随机输入num个整数(num由用户确定),存入数组number[][] 用循环实现二维数组转化,目的是实现数组收尾相接,找出最大子数组 用两个循环实现寻找每一个整数作为初始值得最大子数组,并将结果存入CMax[] 最后输出CMax中的最大