全文目录
🎁主要知识点
📓简单输入输出
📓循环的使用
📓输入的判定之EOF
📓输入的判定2
📓Leetcode的书写方式
📓课后习题
371. 两整数之和
面试题 08.05. 递归乘法
📑写在最后
🎁主要知识点
📓简单输入输出
#include <stdio.h> // 标准输入输出 int main() { // 主函数 第一个运行的函数 int a, b; // 声明两个整形变量 scanf("%d %d", &a, &b); // 读入两个变量 printf("%d\n", a + b); // 输出值 return 0; // 正常结束的标志 }
📓循环的使用
#include <stdio.h> int main() { int a, b, t; scanf("%d", &t); // 标准输入 while (t--) { // 循环输入 scanf("%d %d", &a, &b); printf("%d\n", a + b); } return 0; }
📓输入的判定之EOF
这个主要适用于OJ 因为OJ是利用文件去输入输出的,在文件结束的时候会右一个结束符,当读到这个东西的时候scanf会返回EOF。以此判断是否输入结束。
群里非常多人问我调试怎么输入这个,在win下按ctrl+z 然后回车就能达到测试的目的。
#include <stdio.h> int main() { int a, b; while(scanf("%d %d", &a, &b) != EOF) { printf("%d\n", a + b); } return 0; }
📓输入的判定2
与上面的区别是有特别要求,a和b不同时为0
#include <stdio.h> int main() { int a, b; while (scanf("%d %d", &a, &b) && (a || b) ) { // 读到数字且两者不同时为0 printf("%d\n", a + b); } return 0; }
📓Leetcode的书写方式
Leetcode的判定方式和自己调试是完全不同的。
Leetcode更重视思路,所以需要写的只有接口函数(不需要头文件和main函数)
所谓接口函数就是我给你传基础数据,你给我我想要的结果
int add(int a, int b) { //传入两个数字 return a + b; //返回我要的a+b }
📓课后习题
371. 两整数之和
371. 两整数之和
给你两个整数a 和b ,不使用 运算符+和- ,计算并返回两整数之和。
解题思路1
这个其实就是上面说的熟悉一下力扣的使用方式。请忽略它说的不能用xxx。这只是第一天,别给自己加戏。
int add(int a, int b) { //传入两个数字 return a + b; //返回我要的a+b }
解题思路2
这个方法是我花了一段时间后回来看才出来的方式。不建议第一天的小白查看!!!
从二进制的角度来看,两个数字的加和当前位的值有关系。半加器就是两个数的异或结果。比如1 + 0 = 1、1 + 1 = 0、0 + 0 = 0、0 + 1 = 1。然后进位就是两个位都是1的时候会产生进位。两个数的和其实就是进位+加完的值。直到进位为0。
有兴趣的同学可以了解一下
int getSum(int a, int b){ while(b){ unsigned temp = ((unsigned)a&(unsigned)b) << 1;//进位 a = a ^ b; //当前位结果 b = temp; //进入下一轮 变成 进位+ 值 } return a; }
面试题 08.05. 递归乘法
面试题 08.05. 递归乘法
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
解题思路1
这个同样不要理这些要求。
int add(int a, int b) { //传入两个数字 return a * b; //返回我要的a+b }
解题思路2
这个是我回头只会给的一个思路 模拟手算乘法。
int multiply(int a, int b){ int sum = 0; for(int i = 0;a >> i;i++) if((a >> i) & 1) sum += b << i;//如果这位有数字 就加b的左移i位 return sum; }