4 solutions
-
7
这道题是一道基础题!!
在 C++ 中,"Hello, World!" 程序是学习这门语言的经典入门示例,它展示了 C++ 程序的基本结构和输出功能。下面是具体实现及详细讲解:
这里有三种做法:
1
正常输出
#include <bits/stdc++.h> using namespace std; int main() { cout << "Hello,World!"; return 0; }
2
最短输出
#include<cstdio> main(){printf("Hello,World!");}
3
字符串做法
#define NDEBUG #import <bits/stdc++.h> #ifdef __linux__ #endif using namespace std; using std::cin, std::cout; using i64 = signed long long; #define false 0 typedef signed long long IntPtr; IntPtr i; main(i64) { #ifdef __linux__ std::ios(false), cin.tie(nullptr), cout.tie(nullptr); ios::sync_with_stdio(0); cin.tie(nullptr); char s[12] = {'h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!'}; for (i = 0; i < 12; ++i) { if (i == 0 || i == 6) { if (s[i] >= 'a' && s[i] <= 'z') { s[i] -= 32; } } } for (i = 0; i < 12; i++) { if (i == 5) { cout << s[i]; } else { cout << s[i]; } } cout << endl; #endif return false; }
4
字符瞎做法
#define NDEBUG #import <bits/stdc++.h> #ifdef __linux__ #endif using namespace std; using std::cin, std::cout; using i64 = signed long long; #define false 0 typedef signed long long IntPtr; IntPtr n; main(i64) { #ifdef __linux__ #endif std::ios(false), cin.tie(nullptr), cout.tie(nullptr); ios::sync_with_stdio(0); cin.tie(nullptr); char a[] = "Hello,World!"; int b = 0, c = 0, d = 0, e = 0; i64 f = 0, g = 0, h = 0, i = 0; while (b < 1) { for (c = 0; c < 1; c++) { do { if (d < 12) { while (e == 0) { if (a[d] != '\0') { std::cout << a[d]; e = 1; } else { e = 1; } } e = 0; d++; } else { break; } } while (d < 12); } for (f = 0; f < 5; f++) { if (f % 2 == 0) { g = f + 1; } else { g = f - 1; } while (h < g) { if (h == 2) { i = 1; } else { i = 0; } h++; } h = 0; } b++; } i64 j = 0; while (j < 10) { if (j > 5) { j += 2; } else { j++; } for (i64 k = 0; k < j; k++) { if (k == j / 2) { i64 l = k * 2; } } } i64 m = 5; do { if (m % 3 == 0) { m--; } else { m = m - 2; } } while (m > 0); return false; }
-
5
这题非常难,其他的两篇题解使用了cout或者printf的高级算法,这里介绍一个基础的做法——手搓 64 位 0.5MB 内存的机器码虚拟机。
这是虚拟机框架:
#include<bits/stdc++.h> using namespace std; #define int long long #define ull unsigned int #define N 65536 int memory[N]; ull code[N] = { }; /* 0 Input 1 Output 2 Write 3 Copy 4 Calculate (& | ~ ^ << >>) 5 Calculate (+ - * / %) 6 Goto 7 If-goto 8 x++ 9 x-- f Exit */ signed main() { for(int i=0;;i=(i+1)%N) { int op=code[i]>>60; if(op==0) //Input { int p=code[i]&65535; cin >> memory[ (code[i]>>56)&1 ? memory[p] : p ]; } else if(op==1) //Output { int p=code[i]&65535, val = memory[ (code[i]>>56)&1 ? memory[p] : p ]; if((code[i]>>57)&1) { cout<<char(val&127); } else { cout<<val; } } else if(op==2) //Write { int p = (code[i]>>32)&65535, val = code[i]&((1ll<<32)-1); memory[ (code[i]>>56)&1 ? memory[p] : p ] = val; } else if(op==3) //Copy { int pf = (code[i]>>16)&65535, pt = code[i]&65535; int val = memory[ (code[i]>>55)&1 ? memory[pf] : pf ]; memory[ (code[i]>>56)&1 ? memory[pt] : pt ] = val; } else if(op==4) //Calculate (& | ~ ^ << >>) { int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535; int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ], val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ], val3; int op2 = (code[i]>>52)&15; if(op2==0) { val3=val1&val2; } else if(op2==1) { val3=val1|val2; } else if(op2==2) { val3=~val2; } else if(op2==3) { val3=val1^val2; } else if(op2==4) { val3=((val2>>6)?0:val1<<val2); } else { val3=((val2>>6)?0:val1>>val2); } memory[ (code[i]>>56)&1 ? memory[p3] : p3 ] = val3; } else if(op==5) //Calculate (+ - * / %) { //想要乘方的建议自己写一个快速幂, 应该是能写的 int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535; int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ], val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ], val3; int op2 = (code[i]>>52)&15; if(op2==0) { val3=val1+val2; } else if(op2==1) { val3=val1-val2; } else if(op2==2) { val3=val1*val2; } else if(op2==3) { val3=(val2?val1/val2:0); } else { val3=(val2?val1%val2:0); } memory[ (code[i]>>56)&1 ? memory[p3] : p3 ] = val3; } else if(op==6) //Goto { int p=code[i]&65535; i = (code[i]>>56)&1 ? memory[p] : p; i = (i+N-1)%N; } else if(op==7) //If-goto (> < == >= <= !=) { int p1 = (code[i]>>32)&65535, p2 = (code[i]>>16)&65535, p3 = code[i]&65535; int val1 = memory[ (code[i]>>58)&1 ? memory[p1] : p1 ], val2 = memory[ (code[i]>>57)&1 ? memory[p2] : p2 ]; int op2 = (code[i]>>52)&15; bool flag; if(op2==0) { flag=(val1>val2); } else if(op2==1) { flag=(val1<val2); } else if(op2==2) { flag=(val1==val2); } else if(op2==3) { flag=(val1>=val2); } else if(op2==4) { flag=(val1<=val2); } else { flag=(val1!=val2); } if(flag) { i = (code[i]>>56)&1 ? memory[p3] : p3; i = (i+N-1)%N; } } else if(op==8) //x++ { int p=code[i]&65535; memory[ (code[i]>>56)&1 ? memory[p] : p ]++; } else if(op==9) //x-- { int p=code[i]&65535; memory[ (code[i]>>56)&1 ? memory[p] : p ]--; } else if(op==15) //Exit { break; } else { cout<<"\n\nError: Invalid code\n\n"; } } return 0; }
这是这题的实现:
// 将其复制进代码的第 8 行即可 0x2000000000000048, 0x1200000000000000, //H 0x2000000000000065, 0x1200000000000000, //e 0x200000000000006c, 0x1200000000000000, //l 0x200000000000006c, 0x1200000000000000, //l 0x200000000000006f, 0x1200000000000000, //o 0x200000000000002c, 0x1200000000000000, //, 0x2000000000000057, 0x1200000000000000, //W 0x200000000000006f, 0x1200000000000000, //o 0x2000000000000072, 0x1200000000000000, //r 0x200000000000006c, 0x1200000000000000, //l 0x2000000000000064, 0x1200000000000000, //d 0x2000000000000021, 0x1200000000000000, //! 0x200000000000000a, 0x1200000000000000, //[\n] 0xf000000000000000 //exit
拓展阅读:
将 code 数组设为 0x0000000000000000, 0x0000000000000001, 0x5000000000010002, 0x1000000000000002, 0xf000000000000000 即可达到 A+B Problem 的要求。逐行解析:
0x0000000000000000:输入一个整数,将其存放于内存的 0 号位置; 0x0000000000000001:输入一个整数,将其存放于内存的 1 号位置; 0x5000000000010002:将内存的 0,1 号位置的数相加,并将结果存放在内存的 2 号位置; 0x1000000000000002:将 2 号位置的数以数字形式输出; 0xf000000000000000:退出程序。
- 1
Information
- ID
- 11909
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 1
- Tags
- # Submissions
- 168
- Accepted
- 58
- Uploaded By