【C语言刷题训练】——————水仙花数

变种水仙花例题来简化代码

在这里插入图片描述
根据上述题目,首先想到就是这个数取余和除10000,1000,100,10.
代码如下:

int main()
{
	int i = 0;
	for (i = 10000; i <= 99999; i++)
	{
		int a = i;
		int b = i;
		int c = i;
		int d = i;
		int e = i;
		int f = i;
		int j = i;
		int k = i;
		a %= 10000;
		b /= 10000;
		c %= 1000;
		d /= 1000;
		e %= 100;
		f /= 100;
		j %= 10;
		k /= 10;
		if (i == (j*k) + (e*f) + (c*d) + (a*b))
		{
			printf("%d ", i);
		}
	}

	return 0;
}

会发现代码太难看了,占用内存多。思考一下,发现while循环应该可以简化!
1.每次循环可以将10000循环到10。
2.不用创建那么多变量,只需一个变量每次累加就行。
简化如下:

int main()
{
    int i=0;
    for(i=10000;i<=99999;i++)
    {
        int k=10000;
        int a=0;
        while(k>=10)
        {
            a+=(i%k)*(i/k);
            k/=10;
        }
        if(a==i)
        {
            printf("%d ",i);
        }
    }
    return 0;
}

这才算上个正常代码,哈哈哈!

库函数简化代码量

看题:
在这里插入图片描述
本题刚开始切入的时候有些困扰,因为秉承着不浪费空间的想法,创建了arr[n]的数组,但是[]里是常量!后来干脆大数组arr[50]怼上,给前n个赋值就好了。后面的话创建了个排序函数,进行排序,并输出前五名。
看代码:

void order(int arr[100], int s)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	for (i = 0; i<s; i++)
	{
		for (j = 0; j<s - i - 1; j++)
		{
			if (arr[j]<arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	i = 0;
	for (i = 0; i<s; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int n = 0;
	scanf("%d ", &n);
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int sz = n;
	//传数组排序
	order(arr, sz);
	return 0;
}

采用了一个自定义冒泡排序。
后来查阅了一下,库函数中有冒泡排序函数,如下;在这里插入图片描述
base代表要比较的首元素地址,采用void*类型,是可以接受任何类型比较的数据,num表示比较的个数,width表示要比较类型的字节数,后面comp函数是我们自己去定义如何比较的。
总的来说,还是库函数香!
代码如下:

#include <stdio.h>
#include <stdlib.h>
int cmp(const void*elem1,const void*elem2)
{
    return *(int*)elem2-*(int*)elem1;
}
int main()
{
    int n=0;
    scanf("%d ",&n);
    int sz=n;
    int arr[50]={0};
    int i=0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //传数组排序
    qsort(arr,n,sizeof(int),cmp);
    for(i=0;i<5;i++)
    {
     printf("%d ",arr[i]);
    }
    return 0;
}

这里多引入了一个头文件<stdlib.h>。

小结

日后刷题中,注重代码的美观和可读性,多熟悉库函数的用法。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值