首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

隆重建议,以后给作业贴的提供连老师也看不懂的源代码.该如何处理

2012-02-25 
隆重建议,以后给作业贴的提供连老师也看不懂的源代码.当然结果是要正确的.先帮忙征集此题答案1.任意输入一

隆重建议,以后给作业贴的提供连老师也看不懂的源代码.
当然结果是要正确的.

先帮忙征集此题答案

1.任意输入一个八位数(长整形)输出他的每一位
例如:12345678
输出:1   2   3   4   5   6   7   8


一个星期后结贴,
参与者均有奖励,如果我也看不懂,另有大奖.

[解决办法]
这个地,呵呵,okokok
[解决办法]
^_^
[解决办法]
int main()
{
string str;
cin > > str;

for (string::const_iterator cit = str.begin(); cit != str.end(); ++ cit)
{
cout < < *cit < < " ";
}
cout < < endl;

return 0;
}
[解决办法]
1+1等于多少,硬要用别人看不懂的方式描述出来,
有难度啊。。。
先占个座,看看高人们表演吧。。。
[解决办法]
int main()
{
string str;
cin > > str;
copy(str.begin(),str.end(),ostream_iterator <char> (cout, " ") );
};
[解决办法]
#include <sstream>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
int x;
cin> > x;
stringstream c;
c < <x;
copy( istream_iterator <char> (c) , istream_iterator <char> (),ostream_iterator <char> (cout, " "));
return 0;
}

[解决办法]
cout < <cin.rdbuf();
[解决办法]
cout < <cin.rdbuf();
==================
mark之
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int
main( int argc, char *argv[] )
{
int c;

while (1) {
int option_index = 0;
static struct option long_options[] = {
{ "help ", 0, 0, 'h ' },
{ "version ", 0, 0, 'v ' },
{ "traditional ", 0, 0, 't ' },
{ "next-generation ", 0, 0, 'n ' },
{ 0, 0, 0, 0 }
};

c = getopt_long( argc, argv, "hvtn ",
long_options, &option_index );
if (c == -1)
break;

switch (c) {
case 'h ':
printf( "``hello ' ' is a greeting program which wrote by flw.\n "
"\n "
"Usage: hello [OPTIONS]\n "
" -h, --help display this message then exit.\n "
" -v, --version display version information then exit.\n "
"\n "
" -t, --traditional output a greeting message with traditional format.\n "
" -n, --next-generation output a greeting message with next-generation format.\n "
"\n "
"Report bugs to <flw@cpan.org> \n "


);

break;

case 'v ':
printf( "hello - flw 's hello world. 0.8 version\n " );
break;

case 't ':
printf( "hello, world\n " );
break;

case 'n ':
printf(
"+---------------+\n "
"| Hello, world! |\n "
"+---------------+\n "
);
break;

default:
break;
}
}

if ( optind < argc ){
fprintf( stderr,
"Too many arguments\n "
"Try `hello --help ' for more information.\n "
);
exit(1);
}

if ( optind == 1 ){
printf( "Hello, world!\n " );
}

exit (0);
}
[解决办法]
路过……顶一下,向高手致敬!
[解决办法]
看着眼晕,学习之
[解决办法]
我觉得比较bt的是写lex,然后用flex处理一下,得到的C代码.
[解决办法]
好玩!顶!
[解决办法]
呵呵,才疏学浅,来这里学习来了,帮顶~~~
[解决办法]
楼主. 还是你毒
[解决办法]
怎么又一个扯淡的
[解决办法]
OK的马甲吧。。。。
[解决办法]
用IOCCC风格的吧,那就有意思了(just for fun)
[解决办法]
怎么感觉逐渐变成了泛型的表演...
[解决办法]
这个好玩


#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int
main( int argc, char *argv[] )
{
int c;

while (1) {
int option_index = 0;
static struct option long_options[] = {
{ "help ", 0, 0, 'h ' },
{ "version ", 0, 0, 'v ' },
{ "traditional ", 0, 0, 't ' },
{ "next-generation ", 0, 0, 'n ' },
{ 0, 0, 0, 0 }
};

c = getopt_long( argc, argv, "hvtn ",
long_options, &option_index );
if (c == -1)
break;

switch (c) {
case 'h ':
printf( "``hello ' ' is a greeting program which wrote by flw.\n "
"\n "
"Usage: hello [OPTIONS]\n "
" -h, --help display this message then exit.\n "
" -v, --version display version information then exit.\n "
"\n "
" -t, --traditional output a greeting message with traditional format.\n "


" -n, --next-generation output a greeting message with next-generation format.\n "
"\n "
"Report bugs to <flw@cpan.org> \n "
);

break;

case 'v ':
printf( "hello - flw 's hello world. 0.8 version\n " );
break;

case 't ':
printf( "hello, world\n " );
break;

case 'n ':
printf(
"+---------------+\n "
"| Hello, world! |\n "
"+---------------+\n "
);
break;

default:
break;
}
}

if ( optind < argc ){
fprintf( stderr,
"Too many arguments\n "
"Try `hello --help ' for more information.\n "
);
exit(1);
}

if ( optind == 1 ){
printf( "Hello, world!\n " );
}

exit (0);
}


[解决办法]
这个世道越来越有意思了...........
int main()
{
string str;
cin > > str;

for (string::const_iterator cit = str.begin(); cit != str.end(); ++ cit)
{
cout < < *cit < < " ";
}
cout < < endl;

return 0;
}
[解决办法]
哈哈,顶
[解决办法]
hehe..


mark.....


[解决办法]
extern "C " const int main[];
const int main[] =
{
0x68909090 , (int)(main+5) ,
0xb8909090 , (int)printf ,
0xc358d0ff , 0x6c6c6548 ,
0x6f57206f , 0x21646c72 ,
0x0000000a
};


[解决办法]
#include <stdio.h>
#define _ while
#define ll(l1) /**?/**/spr??=??=??/
int??=#f
#define l1(ll) ll??=#??/
char /*WARNING: don 't write code like this!!!*/
main()?? <l1() f[11+1]={1}, *l = f;unsigned long __;scanf( " ??/
%l "/*put(int(f));*p++;*/ "u ",&__);ll(int)(f, "%l "??/
"u ", __);_((l!=f?l1(put)(11[f??) < <5):(sizeof(f)-sizeof(*l))??(l]),l1(put)(*l++));}

[解决办法]
我的代码在VC 6.0和MinGW GCC 4.1.2下编译通过。其中GCC编译时必须加入-ansi选项(真是ft)。


Chiyer(星羽)写的代码相当于写了一段汇编,不过说实话我这儿Windows下的两个编译器都不能正常编译运行。还是写机器无关的代码比较好。
[解决办法]
星羽的在我这儿改成这样才能通过 :(
话说当年IOCCC一道获奖作品就是这样的。

#include <stdio.h>
const int main[] =
{
0x68909090 , (int)(main+5) ,
0xb8909090 , (int)printf ,
0xc358d0ff , 0x6c6c6548 ,
0x6f57206f , 0x21646c72 ,
0x0000000a
};

[解决办法]
hehe
------解决方案--------------------


看不懂几个,

[解决办法]
用c编:)
[解决办法]
再发个简洁版的,注意只能在int为32位以上的编译器上使用。否则声明要改成long。这个其实也比较好懂。

main(lO,l0){l0&&(lO&&scanf( "%d ",&l0),main(0,l0/10),printf( "%d ",l0%10));}
[解决办法]
强,这个简洁版,能否解释下
[解决办法]
递归喽,十分简单的算法。

先解释一下&&运算符,利用它的“短路”性质可以代替if语句,即前一半若为1才执行后一半。
再说逗号运算符,它的求值次序也是固定的,从左向后,从而可以用一个表达式代替一串语句。
最后说明main()函数的参数,本来是整数的argc和char **类型的argv,不过可以重定义。第一个参数argc在运行时得到的值就是参数总数+1,从而总是正数;后面的argv是指向命令行参数的指针,一般也非0。

简洁版把混淆的变量名整理以后,就是这样:

main(int flag, int n)
{
if (n) { // 一般外界调用n值也非0
if (flag) // 外界调用,flag非0,则要求输入数字
scanf( "%d ", &n);
main(0, n / 10); // 递归输出前面的位,传flag = 0,则不会再执行scanf
printf( "%d ",n%10)); // 输出末一位
}
}

[解决办法]
经验,谢谢
[解决办法]
都够强的!!
[解决办法]
强的一塌糊涂
[解决办法]
不好意思 我写不出老师看不懂的正确的代码
不过参与者 就有分 你说的哦 我就来凑热闹了!
[解决办法]

星羽的在我这儿改成这样才能通过 :(
话说当年IOCCC一道获奖作品就是这样的。

#include <stdio.h>
const int main[] =
{
0x68909090 , (int)(main+5) ,
0xb8909090 , (int)printf ,
0xc358d0ff , 0x6c6c6548 ,
0x6f57206f , 0x21646c72 ,
0x0000000a
};

[解决办法]
不是吧, 这是我前不久写的啊 ...

--------------------------------------------------
星羽的在我这儿改成这样才能通过 :(
话说当年IOCCC一道获奖作品就是这样的。

#include <stdio.h>
const int main[] =
{
0x68909090 , (int)(main+5) ,
0xb8909090 , (int)printf ,
0xc358d0ff , 0x6c6c6548 ,
0x6f57206f , 0x21646c72 ,
0x0000000a
};

[解决办法]
int main()
{
string str;
cin > > str;
copy(str.begin(),str.end(),ostream_iterator <char> (cout, " ") );
};
[解决办法]
坐在一边看高手表演。。
[解决办法]
printf( "hello - flw 's hello world. 0.8 version\n " );

又见 flw 这个 XX 。。
[解决办法]
潜力贴,等找人把他吊起来...
[解决办法]
回复人:Wolf0403(废人:独活十年~心如刀割) ( 两星(中级)) 信誉:115 2007-06-18 14:26:41 得分:0
printf( "hello - flw 's hello world. 0.8 version\n " );

又见 flw 这个 XX 。。
————————————————————
不好意思,无意中看到他这个代码,贴过来的。
[解决办法]
你们都在发浪!!!!!!!!
------解决方案--------------------


这是IOCCC 1984年的获奖作品“mullender”,比星羽贴的那个要更难看一些。
原程序是运行在Vax-11或pdp-11机上的(我也不知道是什么机器),现在的电脑都运行不了了。

short main[] = {
277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
-113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004,
14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9,
4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419,
0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0,
4, 0, 0, 0, 0x8, 0, 4, 0, ', ', 0, 12, 0, 4, 0, '# ',
0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712,
'p ', 072163, 'r ', 29303, 29801, 'e '
};

[解决办法]
PDP-11,DEC的名牌,最早的UNIX就是在PDP系列上实现的。
[解决办法]

#include <iostream>
#include <cstdlib>
using std::cout;
using std::cin;
using std::endl;

int main()
{
long n;
cout < < "input number: ";
cin > > n;


long r = rand();
long x = 1.728*6.354;// magic number 1
r /= x--;
r *= x;
long c = x;
long y = x;
c++;

while (r > = c)
{
x = 0;
while (r > 0)
{
x += r % c;
r /= c;
}
r = x;
}

c /= r;

x *= 123456.78;// magic number 2
x *= r;
x++;

while (x > r)
{

long p = x;
long t = c;
y -= y;

while (n > p)
{
p < <= c;
t < <= c;
}

while (n > x)
{
while (n < p)
{
p > > = c;
t > > = c;
}

n -= p;
y += t;
}

cout < < y < < " ";
x /= r+c;
}

cout < < n < < endl;
system( "pause ");

return 0;
}


[解决办法]
以上程序可以得到LZ要求的结果。

算法是不久前在CSDN中看到的,借来用了。
两处magic number是我好不容易凑出来的,均由1,2,3,4,5,6,7,8组成。

如果之前没看过类似的算法,那么要理解它还是有些难度的。
[解决办法]
高明!

其实也不是不能看懂,程序前一半是没用的,就算了几个常数,不说了;后一半用了二进制分解,算法比较有趣。

试整理如下:

#include <iostream>
#include <cstdlib>
using std::cout;
using std::cin;
using std::endl;

// 本程序总的算法是把十进制的每一位用二进制展开
int main()
{
long n;
cout < < "input number: ";
cin > > n;

// 循环输出个位前面的位,这里n不大于8位
// x是位数与待输出的最高位数相同的10的幂,如输出第3位就是100
for (long x = 10000000; x != 1; x /= 10) {
long p = x;
long t = 1;
long y = 0;

// 此循环计算出不小于n的最小的p
// 无妨设x = 100,则p的取值为100, 200, 400, 800, 1600
// t则为相应的1, 2, 4, 8, 16
while (n > p) {
p *= 2;
t *= 2;
}

// 此循环把n的最高位用二进制分解,
// 把x最高位减去,并用y记下减得的数字
while (n > x) {
// 得到不大于n的最大的p,t与之相应
while (n < p) {
p /= 2;
t /= 2;
}

n -= p; // n的最高位减去一个二的整幂
y += t; // y对减掉的数记数
}

cout < < y < < " "; // 输出前面的位
}

cout < < n < < endl; // 输出最后一位


system( "pause ");

return 0;
}

[解决办法]
LS分析得很好,呵呵。

这个算法是用来做大数(大于内建类型直接支持的位数)除法的。由于只使用了比较、移位和加减法,避免了乘除法和取模。因此这个算法提供了高效率。
LS分析得很清楚了的,此外我的Blog中也有大数除法原始代码的注释,可供参考。

数学对于计算机还是很有用的,在算法中就有所体现。
期待算法方面的力作,呵呵。
[解决办法]
潜力贴!,终于看到有意思的部分了。

同意ls, 期待有更多的好算法!
[解决办法]
目前大家的算法还都是比较有条理的,没有用到什么特别混乱的算法。当然这个问题本来也比较简单。

混乱的代码,可以是写法上的混乱(如使用宏、混淆的变量名和缩进,以及语法中的隐秘部分),也可以是算法上的混乱,也可以是利用人的思维定势误导。其中算法上的混乱最值得一写,所以我也期待新奇的算法出现。但我觉得还是应该尽量避免写大段无用的代码(如卫亭的程度前面一段算几个常数),毕竟这种东西总能凑出来。
[解决办法]
int main()
{
char sb[8];
cout < < "input number: ";
for(int i=0;i <8;++i)
sb[i] = getchar();
for(int i=0;i <8;++i)
cout < <sb[i] < < " ";
}

嘿嘿,我这个管你是不是LONG都能输出,8位就行
[解决办法]
我按卫亭的算法又改了改,利用位运算去除了除法(原来有个除以10的运算),以提高效率(这本身是个高效的算法),并压缩了代码。现在这个样子可能会更难看一些,不过如果熟悉了前面的程序这个也不太难理解。

#include <stdio.h>

int main()
{
long n,x=0x2FAF0800l,p=0;
scanf( "%d ",&n);
do n> =x&&(p+=8,n-=x),n> =(x> > =1)&&(p+=4,n-=x),n> =(x> > =1)&&(p+=2,n-=x),
n> =(x> > =1)&&(++p,n-=x),printf( "%d ",p),x*=01463146315l;
while(p=0,~(x < <=2)&010l);
printf( "%d\n ",n);
return 0;
}

[解决办法]
哦,有个小BUG,所有格式串 "%d "要改成 "%ld ",否则在16位的编译器下面会出错。
[解决办法]
我的程序,开头的部分果然还是被批了,呵呵。

它源于一个数论上的命题,我在刚学乘法时就知道这个命题了。它很简单,真的。可是,在中学时有一次碰到以这个命题为基础的智力题,我想了很长时间才得出答案(汗……)。所以简单地未必就容易,因为简单的常常会被遗忘。所以我把它放在这里,以表达“一切的算法都是从最简单的开始的”这一感受。
至于两个magic number,纯粹是用来迷惑的,以模糊重点(不过好象没什么用,呵呵,我果然是比较老实的,骗不了人……)。第一个magic number就是为了算一个10;不过第二个确实比较巧,我想里面是有内在原因的。我的程序中唯一没有出现的数字,才是真正的魔数,我刚才所说的命题,就是描述它的性质。

milksea(航航 | 啥都不会咋办) 的程序比较强悍,与大数除法有异曲同工之妙,可以显示9位的数字,呵呵。不过我是借用,他这个是原创;所以我要说:佩服啊!

老实说,我写不出如此紧凑的代码,因为不太习惯。不过我却喜欢看紧凑的代码,不太想看大段的,可能很多人会和我一样,呵呵。我想,能把代码写短,一定是对语言和算法等等理解很深才能做到的,这方面,我要继续学习。
特别看好这句 x*=01463146315l ;这是算术和计算机低层原理的完美结合。

算法大多是高深的,但是原理都是简单的。
只要不怕麻烦,勇敢前进,你就会发现,一切都是从最基本的开始的,没什么可怕的,呵呵。
[解决办法]
我哪里是原创,总的算法还是用那个二进制分解的东西,不过由于循环很少,就利用一些代码技巧把内循环直接换成四个相似的表达式了。

另外,x *= 01463146315l,这个是计算常数精确除法的一个特别高效的算法,我从《Hacker 's Delight》这本书上抄的,果然比较迷惑人,呵呵。

x *= 01463146315l(8进制比16进制看上去混乱些^^),或写为x *= 0xCCCCCCCDL,原理是作模为2^32的整数运算(这里假定long的大小是32位,在64位机器下常数需改为0xCCCCCCCCCCCCCCCDL),那个常数就是5的乘法逆元,作乘法相当于除以5。后面又有移位运算,相当于除2。注意这里用乘法代替除法的办法只适用整除的情形。

参考:《Hacker 's Delight》第10章。
[解决办法]
其实最后讨论下来,这个问题的算法就是二进制数到十进制数的转换问题。这种转换问题当然是有很成熟高效的算法的,为此我查阅了TAOCP。现在这个算法就改编自TAOCP第二卷上的算法和后面的一个习题,当然在输出方面用了一点小花招。算法本身是十分平凡的:不断除以10,求余数。但除法全部用加减法和位运算代替了。输出利用了一个很短的栈,为了输出空格又做了一点变化。

必须指出的是,这个算法的确是十分高效的。除了压缩代码,我没有加入多余的混淆代码,因为它本身已经不容易理解了。

本程序为32位整数而写,但容易改为64位整数的程序。

#include <stdio.h>

main()
{
char s[20]={32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0},
*p=s+18;
unsigned __int32 u,v,q,r; /* 若支持C99可用uint32_t,__int32一般可用long代替 */


scanf( "%u ",&u);
while(u) v+=(v+=(v+=(v+=(v=u+1)> > 1)> > 4)> > 8)> > 16,r=u-((q=v> > 4) < <3),
*--p=(r-=(u=q) < <1)+48,--p;
puts(p+1);
return 0;
}

[解决办法]
果然牛!
[解决办法]
其实在现代一般的机器上,内置的除法运算只比加减法慢10倍左右(需要同时算商和余数用div函数,可以优化到较好的效率),所以用加减法和移位运算并不一定比直接用除法运算来得高效,只是在没有除法运算的处理器上,这种算法才是有实际价值的。
[解决办法]
这个,之前那个算法其实是用来做大数(任意长度、即任意个字的被除数和除数)除法的。
如果不用加减法和移位,用除法的话,就要执行多个除法和求余工作,才能计算出1个字;会比较慢的,位数越多越慢。



[解决办法]
milksea(航航 | 啥都不会咋办) 的第二个算法也很厉害,呵呵。

while里的第一个算式展示了计算机是如何做乘法的。我在解析时把它分解为十六个子项的和,从而可以看出它的乘数是某个分数的二进制展开,误差(-)在32位之外。其实我用了笨办法,只要用计算器算一下就可以得到乘数了;或者可以从后面几个算式结合题义逆推出来。
至于误差,主要有三点:移位的下溢误差(-),二进制展开误差(-),+1误差(+)。深入计算的话,一定可以证明这三项误差的合成误差小到足以保证了计算的正确性(不+1肯定不行,前两项足以影响结果)。应该有这方面的理论研究,需要好好学习一下。

非常敬仰高德纳(Donald E. Knuth)大师,最近想拜读他的巨作TAOCP 。不过,我大概每天只有1小时可以看这套书,不知要看到猴年马月(根据大师的说明,里面一道30分的题,平均水准下需要做2个小时,40分的题需要做1学期,50分…目前还没有人能够完成)……
[解决办法]
我对效率的解说只是对我后面写的那个小算法而言,那里做的只是一个普通整数除以10的运算。毋庸置疑,在大数运算时对除以10专门设计的算法(只用加减法和移位)比通用的除法运算高效得多了。

说到TAOCP,我始终没有做出好好去看它的打算,只是偶尔的时候,做为工具书查一下而已。实话说,这书确实很不好读。
[解决办法]
Mark~

热点排行