1( )=1( )等于100( ))

解题:不用循环、递归,如何从 1 打印到 100?(8月10日更新)
在 Quora 上看到有个程序员的提问:
如果不用循环、递归、goto,我如何才能用 C++ 从 1 打印到 100 ?
原题主问的是用 C++ 来实现。
【 更新】:补充国外程序员的一些方案:
Mark Gordon, ICPC 2011 Gold Medalist (msg555)
#include &stdlib.h&
int main() {
/* Cross your fingers and hope seq exists! */
return system("seq 1 100");
#include &stdlib.h&int main() {&&/* Cross your fingers and hope seq exists! */&&return system("seq 1 100");}
第二种:下面这个方案在我电脑上没问题,但不保证你们电脑上也OK
#include &iostream&
#include &stdlib.h&
void(**rptr)();
void foo() {
if(num &= 100) exit(0);
std::cout && ++num && std::
int main() {
rptr = (void(**)())alloca(sizeof(*rptr) * 200) - 1;
1234567891011121314
#include &iostream&#include &stdlib.h&int num;void(**rptr)();void foo() {&&if(num &= 100) exit(0);&&std::cout && ++num && std::endl;&&*rptr++ = foo;}int main() {&&rptr = (void(**)())alloca(sizeof(*rptr) * 200) - 1;&&foo();&&return 0;}
#include &iostream&
#include &stdlib.h&
int main() {
int x = 0;
x |= !fork() && 0;
x |= !fork() && 1;
x |= !fork() && 2;
x |= !fork() && 3;
x |= !fork() && 4;
x |= !fork() && 5;
x |= !fork() && 6;
if(1 &= x && x &= 100) std::cout && x && std::
1234567891011121314
#include &iostream&#include &stdlib.h&int main() {&&int x = 0;&&x |= !fork() && 0;&&x |= !fork() && 1;&&x |= !fork() && 2;&&x |= !fork() && 3;&&x |= !fork() && 4;&&x |= !fork() && 5;&&x |= !fork() && 6;&&if(1 &= x && x &= 100) std::cout && x && std::endl;&&return 0;}
第四种:similar to bashing templates you can bash the preprocessor
#include &stdio.h&
#define F4 "%dn%dn%dn%dn"
#define F20 F4 F4 F4 F4 F4
#define F100 F20 F20 F20 F20 F20
#define X4(y) , y, y + 1, y + 2, y + 3
#define X20(y) X4(y) X4(y + 4) X4(y + 8) X4(y + 12) X4(y + 16)
#define X100(y) X20(y) X20(y + 20) X20(y + 40) X20(y + 60) X20(y + 80)
int main() {
printf(F100 X100(1));
1234567891011
#include &stdio.h&#define F4 "%dn%dn%dn%dn"#define F20 F4 F4 F4 F4 F4#define F100 F20 F20 F20 F20 F20#define X4(y) , y, y + 1, y + 2, y + 3#define X20(y) X4(y) X4(y + 4) X4(y + 8) X4(y + 12) X4(y + 16)#define X100(y) X20(y) X20(y + 20) X20(y + 40) X20(y + 60) X20(y + 80)int main() {&&printf(F100 X100(1));&&return 0;}
第五种:Advanced preprocessor bashing
#if (__COUNTER__ == 0)
#include &stdio.h&
int main() {
#include __FILE__
#elif (__COUNTER__ & 300)
printf("%dn", __COUNTER__ / 3);
#include __FILE__
12345678910
#if (__COUNTER__ == 0)#include &stdio.h&int main() {&&#include __FILE__&&return 0;}#elif (__COUNTER__ & 300)printf("%dn", __COUNTER__ / 3);#include __FILE__#endif
Divye Kapoor 的补充:
Mark Gordon 给出了一些非常好的方案,我也来补充一些
第六种:Using the alarm system call.
#include &stdio.h&
#include &stdlib.h&
#include &unistd.h&
#include &sys/types.h&
#include &signal.h&
int i = 0;
void sig_alarm_handler(int signal) {
printf("%dn", i);
if(i & 100)
int main() {
signal(SIGALRM, sig_alarm_handler);
scanf(" %d",&x);
123456789101112131415161718192021222324
#include &stdio.h&#include &stdlib.h& #include &unistd.h&#include &sys/types.h&#include &signal.h& int i = 0;void sig_alarm_handler(int signal) {&&&&++i;&&&&printf("%dn", i);&&&&if(i & 100)&&&&&&&&alarm(1);&&&&else&&&&&&&&exit(0);} int main() {&&&&signal(SIGALRM, sig_alarm_handler);&&&&alarm(1);&&&&int x;&&&&scanf(" %d",&x);&&&&return 0;}
第七种:Using fread and fwrite
#include &stdlib.h&
#include &stdio.h&
int main() {
FILE* fd = fopen("data.txt", "r");
char buf[10000];
size_t n = fread(buf, sizeof(char), 10000, fd);
fwrite(buf, sizeof(char), n, stdout);
fflush(stdout);
fclose(fd);
123456789101112
#include &stdlib.h&#include &stdio.h& int main() {&&&&FILE* fd = fopen("data.txt", "r");&&&&char buf[10000];&&&&size_t n = fread(buf, sizeof(char), 10000, fd);&&&&fwrite(buf, sizeof(char), n, stdout);&&&&fflush(stdout);&&&&fclose(fd);&&&&return 0;}
第八种:Using queued SIGUSR calls
#include &stdio.h&
#include &stdlib.h&
#include &assert.h&
#include &string.h&
#include &sys/types.h&
#include &unistd.h&
#include &signal.h&
void signal_handler(int signal, siginfo_t* siginfo, void* extra) {
printf("%dn", siginfo-&si_int);
sigval_t signal_
memcpy(&signal_value, &siginfo-&si_value, sizeof(signal_value));
++signal_value.sival_
if(signal_value.sival_int &= 100)
sigqueue(mypid, SIGUSR1, signal_value);
int main() {
mypid = getpid();
bzero(&sa, sizeof(sa));
sa.sa_sigaction = signal_
sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART;
sigaction(SIGUSR1, &sa, NULL);
sigval_t signal_
signal_value.sival_int = 1;
sigqueue(mypid, SIGUSR1, signal_value);
sleep(1000);
123456789101112131415161718192021222324252627282930313233343536373839
#include &stdio.h&#include &stdlib.h&#include &assert.h&#include &string.h& #include &sys/types.h&#include &unistd.h&#include &signal.h& int mypid; void signal_handler(int signal, siginfo_t* siginfo, void* extra) {&&&&printf("%dn", siginfo-&si_int);&&&&sigval_t signal_value;&&&&memcpy(&signal_value, &siginfo-&si_value, sizeof(signal_value));&&&&++signal_value.sival_int;&&&&if(signal_value.sival_int &= 100)&&&&&&&&sigqueue(mypid, SIGUSR1, signal_value);&&&&else&&&&&&&&exit(0); } int main() {&&&&mypid = getpid(); &&&&struct sigaction sa;&&&&bzero(&sa, sizeof(sa));&&&&sa.sa_sigaction = signal_handler;&&&&sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART; &&&&sigaction(SIGUSR1, &sa, NULL); &&&&sigval_t signal_value;&&&&signal_value.sival_int = 1;&&&&sigqueue(mypid, SIGUSR1, signal_value);&&&&sleep(1000);&&&&return 0;}
第九种:Memory mapping a file
#include &stdio.h&
#include &stdlib.h&
#include &sys/types.h&
#include &sys/stat.h&
#include &sys/mman.h&
#include &fcntl.h&
#include &unistd.h&
int main() {
int fd = open("data.txt", O_RDONLY);
struct stat stat_
fstat(fd, &stat_data);
off_t file_size = stat_data.st_
// Memory map the file
void* baseaddr = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
// Copy the memory mapped region to stdout
fwrite((char*)baseaddr, sizeof(char), file_size, stdout);
fflush(stdout);
// Unmap the memory mapped region
munmap(baseaddr, file_size);
// Close the file
close(fd);
12345678910111213141516171819202122232425262728
#include &stdio.h&#include &stdlib.h& #include &sys/types.h&#include &sys/stat.h&#include &sys/mman.h&#include &fcntl.h&#include &unistd.h& int main() {&&&&int fd = open("data.txt", O_RDONLY);&&&&struct stat stat_data;&&&&fstat(fd, &stat_data);&&&&off_t file_size = stat_data.st_size; &&&&// Memory map the file&&&&void* baseaddr = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0);&&&&// Copy the memory mapped region to stdout&&&&fwrite((char*)baseaddr, sizeof(char), file_size, stdout);&&&&fflush(stdout); &&&&// Unmap the memory mapped region&&&&munmap(baseaddr, file_size); &&&&// Close the file&&&&close(fd);&&&&return 0;}
下面这这些,我看其他网友也有提到,但发现可以优化一下
第十种:The standard template metaprogram
#include &stdio.h&
template&int N&
struct X : X&N-1& {
X() { printf("%dn", N); }
template&&
struct X&0& {};
int main() {
1234567891011121314
#include &stdio.h& template&int N&struct X : X&N-1& {&&&&X() { printf("%dn", N); }}; template&&struct X&0& {}; int main() {&&&&X&100& x;&&&&return 0;}
第十一:用静态变量和数组
#include &stdio.h&
struct X {
X() { ++i; printf("%dn", i); }
int X::i = 0;
int main() {
X arr[100];
1234567891011121314
#include &stdio.h& struct X {&&&&static int i; &&&&X() { ++i; printf("%dn", i); }}; int X::i = 0; int main() {&&&&X arr[100];&&&&return 0;}
其他方案可参见 Quora 帖子:
char buf[512] = {0};
strcat(buf, "1\n");
strcat(buf, "2\n");
strcat(buf, "3\n");
strcat(buf, "100\n");
printf("%s", buf);
12345678910111213
char buf[512] = {0};&strcat(buf, "1\n");&strcat(buf, "2\n");&strcat(buf, "3\n");&...&strcat(buf, "100\n");&printf("%s", buf);
关于伯乐小组
这里有好的话题,有启发的回复和值得信任的圈子。
新浪微博:
推荐微信号
(加好友请注明来意)
- 好的话题、有启发的回复、值得信赖的圈子
- 分享和发现有价值的内容与观点
- 为IT单身男女服务的征婚传播平台
- 优秀的工具资源导航
- 翻译传播优秀的外文文章
- 国内外的精选博客文章
- UI,网页,交互和用户体验
- 专注iOS技术分享
- 专注Android技术分享
- JavaScript, HTML5, CSS
- 专注Java技术分享
- 专注Python技术分享
& 2018 伯乐在线在什么情况下“100-1=0”?
 作者: 佚名 编辑:
  【IT168 评论】在什么情况下“100-1=0”?  这不是脑筋急转弯,不要告诉我“在算错的情况下等于零”。  这是一个经典的产品质量的等式,源自日本经营之神松下幸之助所曾说过的一句名言:“对于产品质量来说,不是100分就是0分”。  其含义在于,在100件产品中,如果有1件不合格,那么产品的质量并不会成为99,而是之前所有的努力都有可能化为泡影,即“100-1=0”。  对于一些无伤大雅的消费品,我们通常都不会表现得太过苛刻,“差不多”即可。  但是,并不是对每一件产品,我们都能表现出“差不多即可”的容忍。  如果你新买的不到一周就变砖,你可能很长一段时间都不会选择这个牌子。  如果你从一份大餐中吃到一根头发,你可能会胃口全无,在自己的食谱中永远拉黑这家餐馆。  而如果你的爱车存在着质量问题......  1980年,某汽车品牌发现大约有2100万辆从年间制造的各型汽车中存在驻车后会无故倒溜的问题。当时,美国公路交通安全管理局共接受2.3万起相关的投诉,其中包括6000桩意外事故,1710人受伤,98人因此丧失。该品牌由此不得不启动史上最大规模的汽车召回,为此付出了17亿美金的代价——这起事件导致大批消费者终生不会购买此品牌汽车。  所以,如果产品涉及人身和财产安全,我们一定对其要求极为苛刻,绝不会给予“差不多即可”的宽容。在这些场景,“100-1=0”这条看似老套和理想化的等式注定是一条铁律,无法打破。  如何避免“100-1=0”?  对于普通消费者来说,汽车、药品、食品等产品的质量关乎人身安全,而对于企业来说,数据是最宝贵的财产,服务质量则是关乎企业生存的第一要务。  故而,企业对于IT基础架构核心装备——的产品质量也没有“差不多即可”的宽容,时下,5个9(99.999%)的可靠性已经成为的普遍SLA标准,因为对于服务器来说,5个9和4个9的差距,并不是小数点后一位数字那样简单。  所以,没有哪家服务器厂商不将“产品质量”作为天条,因为在服务器市场,“100-1=0”这个等式绝对是成立的。  那么,如何才能保证交付给客户的每一台服务器都稳定可靠,从而避免“100-1=0”这种情况出现?  ——做一道好菜,厨师要选用上好的食材,再加上精准的火候把握;  ——铸一把好剑,要有上好的铁矿,上好的松烫,和上好的水;此外,还有一道至关重要的工序,“锻打”。工匠往往要挥锤数十万次,对剑坯反复锻打,才能铸就一把 “锋刃锐利,刚柔并济”的好剑。  从某种程度上来看,要造就一台好的服务器,和铸一把好剑有着共通之处。  “千锤百炼成一剑”,造服务器亦如此  相传两千年前,铸剑大师欧冶子走遍名山大川,最终在龙泉的秦溪山下找到了铸剑最好的材料“铁英”,最终铸就名剑龙泉。  铸服务器如铸剑,首先也要从选材开始。  例如,华为服务器在器件供应商的选择上遵循了TQRDC-ES原则,分别从技术、质量、响应、供货表现、社会责任、环境保护等多个层面进行严格筛选。器件首选高分子电容、X7R电容和镀金连接器,以提升器件寿命和可靠性。华为采用先进的设备对器件进行分析和验证,所有原材料选型选材必须100%检验。  除了选材,在铸剑过程中,有一道工序是必不可少的,即“制范”,剑器能否达到设计要求,协调、匀称、美观,取决于制范是否精细。造服务器同理,高品质原料和精准工艺是保证产品质量的基础,但对于服务器来说,要获得高RAS特性,仅靠这两点还远远不够,还要有科学的系统设计。  为进一步提升可靠性,华为服务器融入了大量创新的自研可靠性设计,从底层(BMC、SSD控制等)到均采用了可靠性设计,如BMC芯片可以通过固件优先模式先于发现并处理故障,存储芯片采用了均衡型读写磨损算法,以提升存储设备寿命。  另外在一些细节设计上,能够看到华为服务器在可靠性设计上的独到之处。  例如,在部分地区的雨季(如梅雨季节)或海边的机房环境中,空气中水分含量高,湿度大。高湿度空气如果在服务器中凝结为水滴,对电路板有致命威胁。针对此挑战,华为服务器在元器件选择上,均采用适应高湿度的器件并进行严格筛选测试,并在服务器内部进行了独特的风道设计,消除服务器内部的冷区,避免高湿度空气凝结为水滴,从而提升服务器的抗湿性。  在机房机架上、在途运输、车载舰载等振动环境中,机械是服务器中最易受损的部件。为提升机械的抗振性,华为服务器从三个方面进行了特殊设计:内部振源的风扇使用减振螺钉以减少风扇转动产生的振动对风扇框的影响;通过加强机框强度,以及破坏机框与硬盘模组的共振点,降低机框振动对硬盘模组的影响;硬盘托架上***金属弹片及阻尼减振垫,降低硬盘托架对硬盘储介质振动的影响。  俗话说,细节决定成败,也正是这些细节设计,让华为服务器在一些特殊的应用场景中能够游刃有余。  荷兰Acta Marin是欧洲最大的海上特种船只制造商之一,为海上石油平台、海上风力发电等特殊行业制造特种船,为提升企业运行效率,Acta Marin在船上构建了私有云平台。然而,海上盐分含量高,设备极易受到盐腐蚀寿命短;此外,海上天气情况恶劣,常年在海上运行,对服务器的抗振性、可靠性要求极高。  华为服务器的耐湿、抗振等细节设计正好能够满足了荷兰Acta Marine海上的特殊要求,经受住了海上多次恶劣天气考验。  “选材”和“制范”之后,铸剑仅仅是做好了准备工作,而接下来的工序则更能决定剑器的品质。  如今,“炉火纯青”常用来比喻工匠对于某项技艺的掌握程度,而最初这条成语就是用来描述铸剑熔炼的火候。在剑器的成型过程中,“火候”决定着剑器的工艺水平,也是一名大师和普通工匠的区别。  “火候”,或者说工艺,对于服务器来说,同样是决定产品质量的一项重要考量标准。为提升服务器的质量,华为服务器除了采用高品质的原料,还引入了大量自动化生产线提升装配工艺。如华为东莞生产工厂拥有300多条业界领先的生产线,、硬盘等关键部件自动装配,从而减少了人工装备引发问题的几率,进一步保证了产品的可靠性。  有了上好的材料,精确的制范,以及对火候的精准把控,是否足够铸就一把好剑了呢?当然不,所谓百炼成钢,要铸就一把好剑,需要千锤百炼。而铸就一款好的服务器,也需要经过反复“锤炼”,唯有通过严苛的质量管控和测试,才能保证每一台交付到客户手中的产品都有过硬品质。  华为服务器从来料、加工、装配、测试等每个环节,以及人员、场地、设备等每个要素都有严格的质量管控。每一台产品在交付之前,都要经历严苛的可靠性测试:从芯片到整机,要经历3次温循测试以及超过2000项全覆盖测试,包括振动试验、温度循环、交变湿热、电磁环境等测试,不合格产品将全部销毁。  换句话说,唯有通过层层考验的精品,才会最终交付到客户手中。  考验之一:常规安规测试  电气设备通常要进行安规测试,目的是为了确保使用者安全和环境安全,这是电气设备上市前必不可少的一步。通过安规测试,厂商也能够发现产品存在的安全隐患,从而对产品提出改进方案。  华为服务器在上市之前,会参照国际电工委员会(IEC)及GB/T规范进行24项常规安规测试,来检验电容、、外壳、把手、导轨、风扇、端口等部件的强度和安全性,以保证服务器更加坚固耐用。  考验之二:非常规安规测试  常规安规测试主要衡量的是服务器在机房环境中的安全性,而面对一些极端的环境,如上文所提的海上数据中心,这些常规标准就不一定适用了。为了让产品更加可靠,适应极端环境,华为服务器在常规安规测试基础上又增加了12项模拟真实环境的极端考验:  风吹雨:模拟下雨同时伴有吹风的场景,如现实中的暴风雨、飓风等场景,验证产品的抗风防雨能力。  结冰模拟:模拟冬季设备结冰情况下,产品是否能够正常工作和维护。  包装运输:模拟产品运输、搬运过程,验证产品包装和结构是否可以应对振动、冲击等应力带来的破坏。  工作振动:验证产品在工作状态下,是否可以承受周边机械或者人带来的振动应力影响。  HALT(Highly accelerated Life Test):高效激发产品可靠性潜在缺陷,识别产品的短板,将设计问题在研发阶段暴露,实现快速定位解决。  针焰:验证在易燃部件被引燃的情况下,是否只出现有限程度的燃烧,不会扩大为火焰或大范围的延烧。  整机燃烧:测试设备是否有着火扩散的可能性,通过改进使失火危险程度降到最低。  液体滴落测试:验证在漏雨滴水、鼠尿滴落的情况下,设备是否有发生着火的危险。  暗室:模拟自由空间的标准化测试场地,确定受试设备是否满足规定的辐射发射和辐射抗扰度限值。  ESD测试:对设备进行静电放电,确定设备在指定试验条件下能否满足标准规定的限值。  冲击电流:模拟自然雷击放点,测试设备在指定试验条件下是否满足标准规定的限值。  火箭引雷:采用业界领先的现场雷击测试技术创造自然雷击环境,用真实雷击波形、幅值验证产品的抗雷电流冲击能力。  这12重严苛考验,看上去甚至有些残酷,然而我们并能不排除客户会遭遇这种极端状况。华为服务器预先做好这些非常规的安规测试,显然为客户增加了更多的保障,让服务器在各种极端环境中都能安全无忧。  考验之三:EMC测试  电磁兼容(EMC)是对电子产品在电磁场方面干扰大小(EMI)和抗干扰能力(EMS)的综合评定,曾被定义为“设备和系统在其电磁环境中能正常工作且不对环境中任何事物构成不能承受的电磁骚扰的能力”,是产品质量最重要的指标之一,因此,服务器在出厂之前都需要要经过EMC测试。  华为服务器建造了10米EMC测试暗室,参照国际电工委员会(IEC)规范,对每一台服务器进行包括辐射骚扰测试(RE)、传导骚扰测试(CE)、谐波电流骚扰测试(Harmonic)等在内的12项EMC测试,让服务器能够更加稳定的运转,减小辐射污染。  考验之四:路谱测试  华为服务器具有业内领先的全球供应链体系,拥有中国、巴西、欧洲、北美四大制造交付中心,和遍布全球的物流网点,能够快速响应客户需求。依托自动化技术、条码技术、无线射频RF设备等多项业界领先的物流中心技术,确保产品质量跟踪和货物收发的高效与精准。  但在服务器销往全球过程中,由于各地区运输条件差异较大,不免要经历飞机起降、轮船摇晃、高温高湿颠簸等恶劣状况,这对服务器的可靠性提出不小挑战;而有时客户的要求也十分苛刻,如日本客户要求服务器表面不能有一丝划痕。  为应对运输中的种种恶劣状况,降低服务器故障率,华为服务器引入了路谱测试和大数据分析。其中,华为服务器在服务器外侧的不同位置***布置了多个,记录整个运输途中对应部位的颠簸和摆动数据;之后对这些数据进行分析,识别出不同线路中颠簸、摆动幅度大的位置,对包装箱对应位置做针对性的设计与处理,并作为服务器包装运输与测试标准固化下来。  如今华为服务器已经针对全球170多条典型线路,如中欧长途铁路、中国-中南半岛、中国-俄罗斯铁路、中国-巴基斯坦公路、尼泊尔公路、中印公路等进行了详细的路谱测试,而随着华为服务器销售范围的扩大,华为也正在对新的热门线路进行新线路数据采集与分析,新增包装运输与测试标准。  ………  正如“千锤百炼成一剑”,每台华为服务器也要经过繁杂苛刻的测试才能“出炉”,这使得华为服务器故障率低于业界平均值15%,成为华为服务器最引以为豪的资本。  “质量是和平占领市场最有效的武器”  华为服务器走进大众视线,好像只是近几年的事。  实际上,2002年,华为就已经发布了首款电信级服务器,年,华为服务器仅用于自有业务。2008年,华为服务器开始对外销售,但主要面向和大型互联网企业。2011年,华为企业业务成立,华为服务器开始大举进军企业市场,从近几年的表现来看,其增速可以用“冲刺”来形容。  2014年第三季度,华为服务器出货量首次进入全球前四;2015年,华为服务器首次进入Gartner魔力象限特定领域者(Niche Players)象限;2016年,华为服务器凭借业务驱动的持续创新和稳定上升的市场份额,从特定领域者象限迈入到挑战者(Challengers)象限。  近日,Gartner发布了2017第一季度全球服务器市场报告,全球服务器收入同比下降4.5%,出货量较2016年第一季度下滑4.2%。但华为服务器依旧逆势增长,出货量同比增长19.7%,位居全球第三,营收同比增长39.4%,在全球首屈一指。  ——市场数据已经能够充***释,华为缘何用“苛刻”的态度来要求服务器质量。  美国著名质量管理学家约瑟夫朱兰博士曾经指出:“20世纪是生产率的世纪,21世纪是质量的世纪,质量是和平占领市场最有效的武器。”  我想,这正是华为服务器能够成为服务器市场最快黑马的原因。  据悉,华为将于7月6日将在北京解读其服务器战略,我很期待华为服务器这次又能带来哪些让人眼前一亮的消息。有关详情,请点击
IT168企业级

参考资料

 

随机推荐