关于VS2022
调试技巧
步骤一
步骤二
快捷键在下图已标出
步骤三
先按F10开始调试,然后再按窗口,选择你所想看到的弹窗/按快捷键
关于Debug和Release版本区别
(1)Debug为调试版本,一般在开发完成后发布工程前,调试代码都是在Debug模式下进行的
(2)Release版本最终是要发送给用户的,发给用户的版本必须要没有问题,测试人员就是最后一个把关的
(3)Debug版本是调试版本,编译器编译时会增加一些调试信息,编译器基本不会对其进行优化
(4)Release版本是不能调试的,一般都是在Debug版本下调试的,Release版本一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快
编程题
1.计算求和
求Sn=a+aa+aaa+aaaa+aaaaa+...的前n项之和,其中a是一个数字,
思路及总结
int main() { int a = 0, n = 0; printf("请输入正整数a和n(a为数字,n为多少项的累加):"); scanf("%d %d", &a, &n); int k = 0, i = 0, sum = 0; for (i = 0; i < n; i++) { k = k * 10 + a; sum += k; } printf("sum=%d\n", sum); return 0; }
2.水仙花数
“水仙花数”是指一个n位数,其各位数字的n次方之和等于该数本身。
如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
1)判断数字位数
2)计算每一位数的次方和
3)最后求和sum判断与i是否相等(sum == i ?)
2) 一个数n
n % 10 = n的个位数
n / 10 = 表示n的小数点向前移动一位
while循环体条件为:temp,直至为0
int main() { int i = 0; for (i = 0; i <= 999999; i++) { int count = 1; int temp = i; int sum = 0; //判断i是否为水仙花数 //1. 求判断数字的位数 while (temp / 10) { count++; temp = temp / 10; } //2. 计算每一位的次方和 temp = i; while (temp) { sum += pow(temp % 10, count); temp = temp / 10; } //3. 判断 if (sum == i) printf("%d ", i); } return 0; }
3.打印菱形
#include <stdio.h> int main() { int line = 0; scanf("%d", &line); //上半部分 int i = 0, j = 0; for (i = 0; i < line; i++) { //打印空格 for (j = 0; j < line - 1 - i; j++) { printf(" "); } //* for (j = 0; j < 2 * i + 1; j++) { printf("*"); } printf("\n"); } //下半部分 for (i = 0; i < line-1; i++) { //打印空格 for (j = 0; j <= i; j++) { printf(" "); } //* for (j=0;j<2*(line-1-i)-1;j++) { printf("*"); } printf("\n"); } return 0; }
4.喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水
int main() { int money = 0; int total = 0; int empty = 0; scanf("%d", &money); total = money; empty = money; while (empty > 1) { total += empty / 2; empty = empty / 2 + empty % 2; } printf("total = %d\n", total); return 0; }
递归题组
(1)关于递归的描述
(2)打印一个整数的每一位
关于取得该整数的个位数在 编程题2.水仙花数 2)已经解释过 (需要了解请往上翻阅)
int Print(int a) { if (a > 9) Print(a / 10); printf("%d ", a % 10); } int main() { int a = 0; printf("请输入一个整数:"); scanf("%d", &a); Print(a); printf("\n"); return 0; }
(3)求阶层
①递归方式
int jiec(int n) { if (n == 0 || n == 1) return 1; if (n >= 2) return n * jiec(n - 1); } int main() { int n = 0; printf("请输入一个非负整数:"); scanf("%d", &n); int result = jiec(n); printf("result=%d\n", result); return 0; }
②非递归方式
int main() { int n = 0; int ret = 1, i = 0; printf("请输入一个非负整数:"); scanf("%d", &n); if (n == 0 || n == 1) printf("result=1\n"); else { for (i = 2; i <= n; i++) { ret *= i; } printf("result=%d\n", ret); } return 0; }
(4)计算一个数的每位之和
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例:调用DigitSum(1729),则应该返回1+7+2+9=19
int DigitSum(n) { if (n > 0) return n % 10 + DigitSum(n / 10); else return 0; } int main() { int n = 0; printf("请输入一个非负整数:"); scanf("%d", &n); int result = DigitSum(n); printf("result=%d\n", result); return 0; }
(5) n的k次方
int pow(int n, int k) { if (k>1) return n * pow(n, k - 1); else return n; } int main() { int n = 0, k = 0; printf("请输入一个n和k:"); scanf("%d %d", &n,&k); int ret = pow(n, k); printf("result=%d\n", ret); return 0; }
(6)
这题的结果是什么呢?
操作符讲解
(1)进制位的转化
(2)原码,反码,补码
(3)按位异或^
(4)按位或与&
编程题
(1)交换两个变量
注:不创建临时变量!!!
总结:(a^b)^a=b
int main() { int a = 0, b = 0; scanf("%d %d", &a, &b); printf("a=%d b=%d\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("a=%d b=%d\n", a, b); return 0; }
(2)统计二进制中1的个数
①第一种方法
int main() { int a = 0; printf("请输入一个整数:"); scanf("%d", &a); int i = 0, count = 0; for (i = 1; i <= 32; i++) { if ((a >> i) & 1 == 1) { count++; } } printf("count=%d\n", count); return 0; }
②第二种方法
int count_one_bit(unsigned int n) //unsigned无符号类型,当输入是负数,保证二进制的补码是有效位 { int count = 0; while (n) { if (n % 2 == 1) //因为是计算机存储的码为二进制,%2得到补码最后一位,在while再/2得到上一位 count++; n /= 2; } return count; } int main() { int num = 0; scanf("%d", &num); int n = count_one_bit(num); printf("%d\n", n); return 0; }