變種水仙花例題來簡化代碼

根據上述題目,首先想到就是這個數取余和除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>,
小結
日后刷題中,注重代碼的美觀和可讀性,多熟悉庫函式的用法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/264533.html
標籤:其他
上一篇:動態規劃---01背包/完全背包
