c++洛谷入门题复盘(考前必看!

张开发
2026/6/7 16:06:17 15 分钟阅读
c++洛谷入门题复盘(考前必看!
1#include iostream #include cmath // 可能用不到但以防万一 using namespace std; int main() { double num; cin num; // 分离整数和小数部分 int intPart (int)num; double fracPart num - intPart; // 提取小数部分的数字一位 int digit_frac (int)(fracPart * 10 1e-6); // 加微小量防误差 // 翻转整数部分 int reversedInt 0; int temp intPart; while (temp 0) { reversedInt reversedInt * 10 temp % 10; temp / 10; } // 输出 cout digit_frac . reversedInt endl; return 0; }(int)是一种强制类型转换C风格告诉编译器“把 num 当作整数处理”结果就是截断小数部分留下整数部分。这正是我们需要的。double num 123.456; int intPart (int)num; // intPart 123知识模块二分离整数和小数部分int intPart (int)num; // 整数部分 double fracPart num - intPart; // 小数部分知识模块三提取小数点后一位数字int digit (int)(fracPart * 10 1e-6);1e-6是0.000001很小的数刚好弥补浮点数存储误差让3.999999变成4.000000取整后得到4。这种做法是竞赛中处理浮点数精度的常用技巧。知识模块四循环取模翻转整数目标将123变成321。1. 逐位提取数字整数除以10取余可以得到个位数字。int temp 123; int digit temp % 10; // digit 3 temp temp / 10; // temp 12重复这个过程可以依次得到个位、十位、百位……直到 temp 变成 0。2. 重新构建反转后的数我们想得到新数字3→32→321。每次将已有结果乘以10再加上新的个位。int reversed 0; reversed reversed * 10 digit; // 第一次0*1033 reversed reversed * 10 digit; // 第二次3*10232 reversed reversed * 10 digit; // 第三次32*1013213. 完整循环int reversedInt 0; int temp intPart; // 假设 intPart 123 while (temp 0) { int digit temp % 10; // 取出当前最低位 reversedInt reversedInt * 10 digit; // 追加到新数末尾 temp / 10; // 去掉最低位 }执行过程temp123 → digit3 → reversed3 → temp12temp12 → digit2 → reversed3*10232 → temp1temp1 → digit1 → reversed32*101321 → temp0 → 循环结束。我的问题缺少类型转换frac*101e-6是double类型不能直接赋给int应该用(int)(frac*101e-6)。更简单的是直接输出first . rv。2#include iomanipcout fixed setprecision(1) 你的浮点数;注意机考的时候要最后检查拼写错误不要忘了int main(){}!!!注意题目要求比如输入五行输出四行。31.计算顺序错误C 5/9(F-32); cinF;你在读取F之前就使用了F进行计算此时F是未初始化的垃圾值计算结果毫无意义。必须先输入F再计算C。2.表达式语法错误在 C 中5/9(F-32)并不是合法的乘法表达式。5/9是整数除法结果为0因为5和9都是整数。正确写法应为5.0 / 9.0 * (F - 32)或(5.0 / 9.0) * (F - 32)。小心有的时候按照写高数题的方式忘了加*号3.浮点数除法问题整数除法5/9得到0导致结果恒为0。即使修正语法如果仍用整数除法结果也会是0。修正后用了5.0 / 9.0这是正确的做法只要操作数中有一个是浮点数整个除法就会变成浮点除法保留小数部分。4的作用是取地址运算符它的作用就是获取一个变量在内存中的地址。int ival 42; int *p ival; // ival 取出 ival 的地址赋值给指针 p如果去掉写成int *p ival;编译器会把ival的值42当作地址赋给p这通常不是我们想要的而且会引发错误。 为什么*p输出 42int ival 42; int *p ival; // p 存的是 ival 的地址 cout *p; // *p 是“解引用”取出 p 所指的对象即 ivalp是一个指针变量它里面装的是ival的地址比如0x7ffd1234。*p的意思是“去p里存的地址那里取出那个地址里存的值”也就是ival的值42。所以cout *p;输出42。❓ 如果不用解引用符直接写cout p;会怎样cout p; // 没有 *这时输出的是指针p本身的值也就是ival的内存地址。地址通常是一个十六进制数例如0x7ffd1234。注意不同机器上每次运行地址都可能不同但结果肯定不是42。#include iostream using namespace std; int main() { int a, b, c; cin a b c; int *biggest; // 先定义一个指针变量 // 让 biggest 指向最大值 if (a b a c) biggest a; else if (b a b c) biggest b; else biggest c; // 通过指针输出最大值 cout *biggest endl; return 0; }当考试中涉及多个if else时注意检查有没有少花括号{}的小尾巴~~~~在代码中biggest a; // 把变量 a 的地址存入指针 biggest改变指针指向这里我们想改变指针 指向谁所以操作的是指针本身不需要*。而在输出时cout *biggest endl; // 输出指针指向的变量的值我们想输出“被指向的那个变量”的值所以必须用*解引用。真的易错折腾我一会

更多文章