8

同僚から、forループが1つ1 2 3 4 .... 15 15 ..... 4 3 2 1だけで、関数なく、gotoステートメントがなく、条件ステートメントや3項演算子を使用せずに値を出力するように指示されました。

そこで、型キャストを使って解決しましたが、15は2回印刷されないため、正確な解決策ではありません。

int main()
{
    int i, j;
    for(i = 1, j = 0;j < 29;j++, i += int(j/15)*-2 + 1)
        cout<<i<<endl;
}

出力1 2 3 4 ... 15 14 13 .... 2 1

代替ソリューションはありますか?

4

11 に答える 11

32

1 から 30 までループし、(i/16) が昇順部分では「0」、降順部分では「1」になるという事実を使用できます。

for (int i = 1; i < 31; i++)
{
    int number = (1-i/16) * i + (i/16) * (31 - i);
    printf("%d ", number);
}
于 2012-04-11T12:00:17.017 に答える
25
for (int i=0; i<1; i++)
{
    std::cout << "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1"
}
于 2012-04-11T11:49:26.253 に答える
8

これはどう:

std::string first;
std::string second;

for ( int i = 1 ; i <= 15 ; i++ )
{
   std::ostringstream s;
   s << i;
   first += s.str();
   second = s.str() + second;
}

std::cout << first << second;
于 2012-04-11T11:55:39.033 に答える
5

別:

static int bla[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

for (int i = 0; i < 30; i++) 
{        
    printf("%d\n", bla[i]);
}

良いものは、すべてに比べて実行が高速です...

于 2012-04-11T11:48:32.677 に答える
3

j & 0x10ビット 3:0 とのXOR ビット #4 (すなわち)。そのビットを 4 つの位置に「繰り返す」方法を見つける必要があります。

于 2012-04-11T11:49:34.907 に答える
2
#include <iostream>

int main()
{
    for(int i = 1; i < 31; i++) std::cout << ((i/16)-1)*-i+(i/16)*(i^0x1F) << " ";
    std::cout << std::endl;
}
于 2012-04-11T12:10:12.500 に答える
2
const int N = 15;
for(int i = 1; i <= 2 * N; ++i)
    printf("%d ", i + (i > N) * (1 + 2 * (N - i)));
于 2012-04-11T14:05:14.090 に答える
2

私は多くの複雑な答えを見てきましたが、対称性をそのまま利用した人は誰もいません。

std::string head = "1";
std::string tail = "1";

for (unsigned i = 2; i != 16; ++i) {
  std::string const elem = boost::lexical_cast<std::string>(i);

  head = head + " " + elem;
  tail = elem + " " + tail;
}

std::cout << head << " " << tail << "\n";

イデオンでの動作中(マイナスlexical_cast):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

これは単純に機能し、上限の任意の大きさに対して (コンピュータが十分なメモリを持っている限り) 動作します。

于 2012-04-11T12:45:30.210 に答える
1
for (int i = 1; i < 30; i++)
    printf("%d\n", (-((i & 16) >> 4) + 1) * i + ((i & 16) >> 4) * (14 - (i & 15)));
于 2012-04-11T12:03:04.950 に答える
1
int main()
{

    for(int i = 15, j = 30, k = 15; i <= 30; i++, j--, k -= 2)
    {
        cout << (j - i) * (k % 2) << endl << (j - i - 1) * (k % 2) << endl;
    }

    return 0;
}

これは私が思いついたものです。それは逆になります。つまり、15 -> 0 -> 15 です。負の数の場合は、mod と k を使用して解決します。I-Jが途中で合流。それは決して完璧ではなく、他のより良い答えがいくつかあります。

于 2012-04-11T14:17:59.077 に答える