C语言实现求解 最复杂的数

C语言实现求解 最复杂的数

先上题目:
把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。
例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的。
如图:
在这里插入图片描述
先看这道题,就是说给你一个数,要把1到这个数之间所有数的数的约数个数求出来,再进行比较,选出最大的那个数,当然这个数就是题目中的约数的数量 :
在这里插入图片描述
,那我们还有
在这里插入图片描述这个数没求,这个数就是刚刚求出最大约数对应的那个数
这里没看懂的话要多看看。把题目吃透再往下进行!

不多说了,直接上代码:

#include<stdio.h>	
#include <math.h>
int yue(int n){ //此函数能求出一个数的约束个数 
	int i;
	int m;
	int num;
	num = 0;
	m = sqrt(n);
	for (i=2; i<=m; ++i){
		if (n % i == 0){
		num += 2;
		if (i * i == n){
			--num;
		}
		}
	}
	if (n != 1){
		num += 2;
	}else{
		++num;
	}
	return num;
}
int main(){
	int i,j,u;//循环时候的变量
	int T;  //表示有多少个数要进行计算
	int test;    //这个变量是为了从1加到给定的数,方便把之间的每个数的约数都求出来
	scanf("%d",&T); //输入T
	//因为输入输出格式要求,将它存在数组中,数组的声明 
	int a[T];
	int yueshu[T];
	int small[T]; 
	for(u=0;u<T;u++){   //输入T个数
		scanf("%d",&a[u]);
		yueshu[u]=1;  //把他赋值一下,因为下面要进行比较大小,实际意义不大
	}
	for(u=0;u<T;u++){  //通过这个循环,获得复杂程度最高的数约数个数  
		for(test=1;test<=a[u];test++) {
		int m=0;      //初始一下约束个数
		m=yue(test);
		if(m>yueshu[u]){   //进行比较,取复杂程度最高的数的约数的数量 
			yueshu[u]=m;
		}
	}
	}
	for(u=0;u<T;u++){  //通过这个循环,获得复杂程度最高的数 
		for(test=1;test<=a[u];test++) {
			int m=0;      
			m=yue(test);
			if(yueshu[u]==m){
				small[u]=test;//把test值存入数组
				break;   //符合条件跳出这个循环,得到含有最多公约数的最小的数 
			}
		}
	}
	for(u=0;u<T;u++){
		printf("%d %d\n",small[u],yueshu[u]);  //按照标准打印输出 
	}
}

现在来解释一下函数部分yue(int n):
(之前我在写求一个数的约数,我用了两个for循环嵌套,算比较大的数的约数时太费时间。)这个算法比较巧妙,对于这个问题我们只需要暴力从2到根号n这个闭区间的所有整数就行了!!
接下来就是主函数部分,要说的是注意数组的使用,声明数组时,因为我们这个数组含有参数T,那么数组的长度就是个变量,注意!!如果在声明时初始化数组,比如 int a[T]={1},这样在有的编译器中是不允许的。
具体理解卸载了函数后面,还是比较容易理解的,加油!!!
结果:
在这里插入图片描述
运行速度还是比较不错的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值