一个不算恶心的面试题

chyanog 2012-07-15 02:44:04
写一个函数,函数原型如下:

void fun(int n)
{

}

比如,当n=5时:打印
1
2
3
4
5
4
3
2
1
要求只允许使用一个循环
...全文
964 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2012-07-17
  • 打赏
  • 举报
回复
方法多种多样。。简单,容易!!
jia_xiaoxin 2012-07-17
  • 打赏
  • 举报
回复
void fun(int n)
{
for(int i = 1; i <= n; i++)
{
printf("%d\n", i);
}
for(int i = n - 1; i >= 1; i--)
{
printf("%d\n", i);
}
}
lvjing_CSDN 2012-07-16
  • 打赏
  • 举报
回复
递归的方法
void f(unsigned i ,unsigned n)
{
if(i != n)
{
printf("%u\n",i);
f(i+1,n);
}
printf("%u\n",i);
}

void fun(unsigned n)
{
f(1,5);
}

树先生 2012-07-16
  • 打赏
  • 举报
回复
void fun(int n)
{
int i = n * 2 - 1;
while(i != 0)
{
printf("%d \n",(i<n)?i:(n*2 -i));
i--;
}
}
ghg5050 2012-07-16
  • 打赏
  • 举报
回复
学习,论坛大神真多
chyanog 2012-07-16
  • 打赏
  • 举报
回复
我怒了,实现了一个BT的方法:

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
int x;
double t;
for (x=1;x<10;x++)
{
t=70 - (7717*x)/42. + (60194*pow(x,2))/315. - (3715*pow(x,3))/36. +
(4643*pow(x,4))/144. - (217*pow(x,5))/36. + (239*pow(x,6))/360. -
(5*pow(x,7))/126. + pow(x,8)/1008.;
printf("%.f\n",t);
}
return 0;
}

ks-ok-dear 2012-07-16
  • 打赏
  • 举报
回复
让我这个菜鸟贴个最长的,哈哈:

void fun(int n)
{
int i=1;
int indicator=0;

for (i=1;i<=n && i >0;i++)
{
if(indicator == 0 && i<n)
{
printf ("%d\n", i);
continue;
}
if(i == n )
{indicator=1;
printf ("%d\n", i);
i=i-2;
continue;
}
printf ("%d\n", i);
i=i-2;
}
}
一秒一次郎 2012-07-16
  • 打赏
  • 举报
回复
大神们已经给出很精彩的答案了,我就来幽默一下吧,一次循环也不用,也不用递归,速度也是杠杠的

cout<<1<<endl;
cout<<2<<endl;
cout<<3<<endl;
cout<<4<<endl;
cout<<5<<endl;
cout<<4<<endl;
cout<<3<<endl;
cout<<2<<endl;
cout<<1<<endl;
qiuyufei123 2012-07-16
  • 打赏
  • 举报
回复
for(int i=1;i<=(n*2-1);i++)
{
if(i<=n)
{
cout<<i<<endl;
}
else
{
cout<<2*n-i<<endl;
}
}
olderma 2012-07-16
  • 打赏
  • 举报
回复
方法很多,要考虑易读性及运行效率。等高手来个对比
Saleayas 2012-07-16
  • 打赏
  • 举报
回复
有循环不用??
为什么不出题说:不用编译器,打印这些呢?
2012-07-16
  • 打赏
  • 举报
回复
个人分析一下:
首先,要求只允许使用一次循环,就不应该使用if之类的判断语句。三目运算符也是如此。
其意图就是要你建立一个隐射。
从123456789 10 到 1234554321。
y=f(x)
只有一个表达式。
因为前后数据变化比较大。
比如6到5,7到4,这里最后设置一个减法。但是前面又不能设置,所以,这里需要一个控制。
就是让前面不进行减法,后面进行。
这样,我们可以用x/6完成。x/6=0,如果把需要减去的东西乘以x/6,我们基本上就可以让前面不减,后面减了。

然后再从 6789 10 到 5 4 3 2 1
这个明显是越减越多。减掉的数据为 1 3 5 7 9
所以,肯定有一个基数2.
因为这几个数据的差都是2.

可以设置一个变量t. t=x%6 那么从6到10,t=1,2,3,4
于是可以得到一个量。
2t+1,这刚好为后面的减法所需要的减去的数据。

综合前面的内容。

f(x)=x-(x/6)*[(x%6)*2+1]



void fun(int n)
{
int i=1;
for(;i<2*n+1;i++)
{
cout<<i-(i/6)*((i%6)*2+1)<<endl;
}
}
BullJordan23 2012-07-16
  • 打赏
  • 举报
回复
void fun(int n)
{
int i ;
for(i =1 ;i<=2*n -1 ;i++)
if(i>n)
printf("%d\n" , 2*n -i) ;
printf("%d\n" ,i) ;
}
sunylf 2012-07-16
  • 打赏
  • 举报
回复
17樓和我想的一樣.贊同17樓.
WizardOz 2012-07-16
  • 打赏
  • 举报
回复

void fun(int n)
{
static int a = 0;

if (1 == n) {
printf("%d\n",++a);
return;
}

printf("%d\n",++a);
fun(n - 1);
printf("%d\n",--a);
}


一个循环都不要
Mourinho 2012-07-16
  • 打赏
  • 举报
回复
课后习题吧~
诚朴勇毅 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

C/C++ code

return ((n==5&&printf("%d\n",n))||(printf("%d\n",n)&&p(n+1)&&printf("%d\n",n)));

更正下。
[/Quote]
不能返回哦 void
庄鱼 2012-07-15
  • 打赏
  • 举报
回复

void fn(int N)
{
for(int i=0,j=1;i<j;){
printf("%d,j-i);
j>=N?++i:++j;}
}
lx_616_at_yeah_net 2012-07-15
  • 打赏
  • 举报
回复
// 玩玩
#include <stdio.h>
void fun(int n);

int main(void)
{
fun(-5);
return 0&getchar();
}

void fun(int n)
{
int av=0,n1=n>0?1:-1,nv=n1>0?1:0,i=n1;
while(((((nv?i<n:i>n)&& i)||(!av&& (av=!av, n1=-n1)))&&(printf("%d\n", i),i += n1)));
}
CandPointer 2012-07-15
  • 打赏
  • 举报
回复




什么循环都不用,

学好goto,走遍天下都不怕
加载更多回复(7)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧