算法入门100例(打卡第11天第一题)


和英雄哥一起学算法

The number of divisors(约数) about Humble Numbers

hdu

A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, … shows the first 20 humble numbers.
Now given a humble number, please write a program to calculate the number of divisors about this humble number.For examle, 4 is a humble,and it have 3 divisors(1,2,4);12 have 6 divisors.

今天的题面是英文的,大致意思就是说给你一个数能让你求出他的因数的个数,这些因数(包括他本身)可以给至少2,3,5,7中的一个数整除或者为1.
更清楚的,比如12有6个分别为【1,2,3,4,6,12】
非常熟悉有一点好因子的味道了,我们可以按照求丑数运算时,直接讲n分别不断的 / 2, / 3, / 4, / 7.在他们余对应除数为0的情况,分解成以因数乘积的形式。

例如 24=23 *31 *50 *70

那么我们求出对应的因子个数,我们可以用组合的方法求出由因子之间乘积组成的个数,那么按照组合已经有了以下三个

2 * 3 = 6 ,2 * 2 * 3 = 12,2 * 2 * 2 * 3 = 24

我们知道24满足条件的数字还有1 2 3 8 ,这4个数又该如何求呢,仔细研究我们发现
1=20 *30 2=21 *30 3=20 *31 8=23*30

那么我们可以让因子数的计算从0开始算起上面6 12 24 个数的计算我们可以用 24=23 *31 *50 *70 中因子个数乘积 3 ×1得到 3
我们如果从0计算起就应该 对应各个因字数加1
即(3+1) ×(1+1) ×(0+1)×(0+1)我们可以发现如果因子个数为0加一后乘积并不影响。
注意数据范围为in the range of 64-bits signed integer.因此我们需要用到long long

代码

#include<stdio.h>
typedef long long ll;
ll deal(ll n){
	int a=0,b=0,c=0,d=0;
	while(n%2==0){
		n>>=1;
		a++;
	}
	while(n%3==0){
		n/=3;
		b++;
	}
	while(n%5==0){
		n/=5;
		c++;
	}
	while(n%7==0){
		n/=7;
		d++;
	}
	return (a+1)*(b+1)*(c+1)*(d+1);
}
int main(){
	ll n;
	while(scanf("%lld",&n) != EOF&&n!=0){
		printf("%lld\n",deal(n));
	}	
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第二十二算法训练营主要涵盖了Leetcode目中的三道目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209目要求在给定的数组中找到长度最小的子数组,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值