簡體   English   中英

有什么方法可以縮短時間?

[英]Any ways to make this shorter?

輸出應該以這種方式

I
IN
IND
INDI
INDIA
INDIA
INDI
IND
IN
I

我想知道是否有什么可以使我的程序更短。

也許使用2個while循環或2個for循環,而不是4個。

#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
    char a[]={'I','N','D','I','A'};
    int r,c;
    for(r=1;r<=5;r++)
    {
        for(c=0;c<r;c++)
            cout<<a[c]<<" ";
        cout<<endl;
    }

    for(r=5;r>=0;r--)
    {
        for(c=0;c<r;c++)
            cout<<a[c]<<" ";
        cout<<endl;
    }
    _getch();
}

如果您使用的是C ++ 11,這很好而且簡短:

#include <stdio.h>
#include <initializer_list>
int main() {
    for (int i : {1,3,5,7,9,9,7,5,3,1})
        printf ("%.*s\n", i, "I N D I A") ;
}

將此鏈接放在ideone上。

“作弊” ;-)但很短的解決方案是

#include <cstdio>
int main() {
    puts("I\nIN\nIND\nINDI\nINDIA\nINDIA\nINDI\nIND\nIN\nI\n");
}

基於TonyK美好想法的另一種解決方案(可在C和C ++中使用):

#include <stdio.h>
int main() {
    for (int i = 1; i < 11; ++i)
        printf("%.*s\n", i < 6 ? i : 11 - i, "INDIA") ;
}

更新:(在TonyK評論后):

如果需要空格,則用此替換上面的printf

printf("%.*s\n", 2*(i < 6 ? i : 11 - i), "I N D I A ");

更新:無循環的解決方案:

#include <stdio.h>
int main(int i, char**) {
    return printf("%.*s\n", i < 6 ? i : 11 - i, "INDIA") - 1 && main(i + 1, 0);
}

以下是對初學者有利的詳細說明。

最重要的一點是,這是一次“學術”練習。 該代碼是晦澀的,應該避免編寫像這樣的嚴肅代碼。

該標准並未為main函數修復特定簽名。 它僅表示必須返回一個int ,並且編譯器必須接受兩種特殊形式:

  1. int main();
  2. int main(int argc, char** argv);

我正在使用第二個。 更加流行的形式int main(int argc, char* argv[])等效於(2)。 實際上,通常,將用作函數參數的T數組隱式轉換為指向T的指針 在此示例中, char* argv[]指向char指針的數組,該數組變為指向 char指針的指針 上面的程序雖然沒有使用第二個參數(它要么被忽略,要么被賦予NULL,即0值)。

該程序沒有進行循環,而是遞歸調用main 實際上,這是非法的,但是主要的編譯器對此視而不見(如果您要求使用選項-Wpedantic對其進行竊,則至多GCC都會發出警告)。 當從命令行中不帶參數的情況下調用該程序時,操作系統將調用main傳遞1 (即1 +參數的數量)和指向char指針的指針 ,正如所指出的那樣,此程序會忽略它。 因此,在第一次通話時, i = 1

隨后, main可能會調用每次遞增i自身。 總之, main被順序調用i1234 ,...

很容易看出,對於i這個值序列,表達式i < 6 ? i : 11 - i i < 6 ? i : 11 - i計算結果為12345543210 ,...(這也可被表示為5.5 - abs(5.5 - i)按德魯Dorman的解決方案但使用三元運算符避免了需要#include <cmath> ,這節省了一行;-)這些數字是每次應顯示的“ INDIA”字符數。

調用printf("%.s\\n", j, "INDIA") ,其中j = i < 6 ? i : 11 - i j = i < 6 ? i : 11 - i ,顯示“ INDIA”的前j字符,后跟新行,並返回有效打印的字符數(包括新行),即j + 1 拿走1產生j

現在我們回想起a && b的語義對於整數ab的重要意義。 如果a == 0則不評估 b 否則,將評估b 對於我們來說, a = printf("%.*s\\n", j, "INDIA") - 1 (即a = j )和b = main(i + 1, 0)

現在,讓我們將這些片段放在一起。

1.最初, i = 1j = 1 printf的調用輸出“ I \\ n”並返回2 拿走1 ,得到a = 1 != 0 因此,對b = main(2, 0)進行求值(即,調用main(2, 0) )。

2.好吧,對於第二次調用main ,我們有i = 2j = 2printf顯示“ IN \\ n”, a = 2 != 0b = main(3, 0)

重復此參數,在每次調用main我們都有:

3. i = 3j = 3 ,打印“ IND \\ n”, a = 3 != 0並調用main(4, 0)

4. i = 4j = 4 ,打印“ INDI \\ n”, a = 4 != 0並調用main(5, 0)

5. i = 5j = 5 ,打印“ INDIA \\ n”, a = 5 != 0並調用main(6, 0)

6. i = 6j = 5 ,打印“ INDIA \\ n”, a = 5 != 0並調用main(7, 0)

7. i = 7j = 4 ,打印“ INDI \\ n”, a = 4 != 0並調用main(8, 0)

...

10. i = 10j = 1 ,打印“ I \\ n”, a = 1 != 0並調用main(11, 0)

11. i = 11j = 0 ,打印“ \\ n”, a = 0 現在main(12, 0) 12,0 main(12, 0)不執行, main返回

請注意, main在步驟1調用main在步驟2中,它調用main在步驟3 ,...它調用main在步驟11中。因此, main在步驟11返回到main在步驟10中,其返回到main步驟9中, ...,它返回到步驟1中的main 。最后,步驟1中的main返回到操作系統。

如果您對更多混淆的代碼感興趣,請參閱IOCCC的現有和過去獲獎者。 請享用!

短一點

#include <iostream>
#include <cmath>

int main()
{
    char a[]={'I','N','D','I','A'};
    for(int r=1;r<=10;r++)
    {
        int c = 5.5 - std::abs(5.5 - r);
        std::cout << std::string(a, 0, c) << std::endl;
    }
}

您可以使用substr

另外,如果要在字符之間添加空格(如現在的代碼所示),則可以對整個單詞執行一次操作,然后對修改后的字符串進行處理:

input = "INDIA";
modifiedInput = ...; // Figure out a way to get "I N D I A " here
for (int i = 1; ...)
    cout << substr(modifiedInput, 0, 2 * i) << endl;
...

像這樣:無論如何,很難做到2個循環)

 int i=1;
bool ind=0;
     for(r=0;r<10;r++)
      {
if (ind == 0){
          for(c=0;c<i;c++)
              cout<<a[c]<<" ";
    i++; }


    if (ind == 1){
          for(c=0;c<i;c++) cout<<a[c]<<" ";
    i--;
        }
    if (i % 5 == 0) ind=1;
        cout<<endl;
      }

這是使用兩個循環的示例:

#include<iostream>

using namespace std;
int main()
{
  char a[]={'I','N','D','I','A'};
  int arr_length=5;
  bool two_times=false;//if you want to output INDIA twice
  for(int i=2*arr_length-1; i>=1; i--)
  {
      for(int j=0; j<arr_length-abs(arr_length-i); j++)
      {
            cout << a[j];
      }
      if(i==arr_length && !two_times){ two_times=true; i++;}//if you want to output INDIA twice
      cout << endl;
  }
  return 0;
}

輸出:

I
IN
IND
INDI
INDIA
INDIA
INDI
IND
IN
I

您可以這樣:

void main()
{
  char a[]={'I','N','D','I','A'};
  int r,c;

  int x = 0;  // initially x is 0 
  int l = 5;
  for(r=1;r<= 11 ;r++)  //loop runs for 5*2 + 1 times
  {
     if(r>=6){
       x = l - r % 6;  //set x to remaining length 
       l--;
     }
     for(c=0;c< (r % 6) + x; c++)  // add x 
         cout<<a[c]<<" ";
     cout<<endl;
  }
}

您可以在這里找到它的工作方式。

基於TonyK答案的另一種解決方案。 您可以輸入所需的字符串。

#include <stdio.h>
#include <string.h>
int main() {
    char s[100];
    gets(s);
    for (int i = 0; i < strlen(s) * 2; i++)
        printf ("%.*s\n", i < strlen(s) ? i + 1: 2 * strlen(s) - i, s);
}

http://ideone.com/Zsg5Lu

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM