[英]optimize code to get following output in c
我上周接受了采訪。 他們讓我寫一個這樣打印的代碼
input :5
0
101
21012
3210123
432101234
54321012345
我寫了下面的代碼,但他說我可以進一步優化。 我想不通。 ,
int main(){
int n,i,j,k,lim,num;
scanf("%d",&n);//getting input starting number of last row
lim=n;
int collen=n+2;//it denotes end of row
for(i=0;i<n+1;i++)
{
num=i;
k=0;
for(j=0;j<collen-1;j++){
if(j<lim)
printf(" ");
else if(num<0){
printf("%d",++k);
}
else{
printf("%d",num--);
}
}//j for
printf("\n");
collen++;
lim--;
}//i for
}// main end
我第一次嘗試有不同的代碼,我使用標志來檢測 num 何時達到遞增和遞減,這很復雜,如果在第二個循環內大約有 4 個,所以我將該代碼優化為上述代碼。 他說你能優化更多嗎? 我不知道優化它。
我的問題:可以優化嗎?如果可以,請發布代碼
這看起來優化到邊緣:
int main( int argc, char **argv )
{
puts( "input :5");
puts( " 0");
puts( " 101");
puts( " 21012");
puts( " 3210123");
puts( " 432101234");
puts( "54321012345");
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Print a pyramid */
int
main(int argc, char **argv)
{
int size = argc > 1 ? strtol(argv[1],NULL,10) : 5;
if( size > 9 || size < 0) {
fprintf(stderr, "Invalid size\n");
return EXIT_FAILURE;
}
for(int line = 0; line <= size; line++) {
char template[]="9876543210123456789";
char *s = template + 9 - size;
template[10 + line] = '\0';
memset(s, ' ', size - line);
if(puts(s) == EOF) {
perror("puts");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}
<
比較for
循環相比,for 循環更多。 for(i=0;i<n+1;i++)
寫得更清楚for (i = 0; i <= n; i++)
。int collen=n+2;
,然后像collen-1
一樣使用它,保存減法並對其進行初始化調整。if
s 將這個復雜的內部循環分隔到它們自己的循環中。現在是我的解決方案,但就像你的解決方案一樣,它只能處理從 0 到 9 的輸入:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n;
printf("input :");
if (scanf("%d", &n) != 1 || n < 0 || n > 9) {
printf("input not recognized or invalid\n");
return EXIT_FAILURE;
}
for (int i = 0; i <= n; ++i) {
printf("%*d", n - i + 1, i);
for (int j = i - 1; j >= 0; --j) {
printf("%d", j);
}
for (int j = 1; j <= i; ++j) {
printf("%d", j);
}
printf("\n");
}
return EXIT_SUCCESS;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.