我的同事给出了打印值1 2 3 4 .... 15 15 ..... 4 3 2 1
,只有一个用于循环,没有函数,没有goto语句和,不使用任何条件语句或三元运算符。
所以我使用类型转换来解决它,但它不是一个精确的解决方案,因为15不会打印两次。
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
任何替代解决方案?
答案 0 :(得分: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);
}
答案 1 :(得分:26)
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"
}
答案 2 :(得分: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;
答案 3 :(得分: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]);
}
好的,与所有人相比,执行速度更快......
答案 4 :(得分:3)
XOR位#4(即j & 0x10
),位3:0。你需要找到一种方法将这个位“重复”到4个位置。
答案 5 :(得分:3)
for (int i=1;i<31;++i)
{
cout<<(((i<<27>>31|i)&(~i<<27>>31|~i))&15)<<" ";
}
答案 6 :(得分: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;
}
答案 7 :(得分: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";
ideone的行动(减去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
它的工作原理很简单,对于上限的任何大小(就计算机而言,只要有足够的内存)。
答案 8 :(得分:2)
const int N = 15;
for(int i = 1; i <= 2 * N; ++i)
printf("%d ", i + (i > N) * (1 + 2 * (N - i)));
答案 9 :(得分:1)
for (int i = 1; i < 30; i++)
printf("%d\n", (-((i & 16) >> 4) + 1) * i + ((i & 16) >> 4) * (14 - (i & 15)));
答案 10 :(得分: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 - &gt; 15.更多值得思考的东西。使用mod和k来计算负数。我 - J在中间见面。它绝不是完美的,还有其他更好的答案。