变种水仙花例题来简化代码
根据上述题目,首先想到就是这个数取余和除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>。
小结
日后刷题中,注重代码的美观和可读性,多熟悉库函数的用法。