#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//#include <string.h>
//int main()
//{
// char str[] = "hello heihei";
// memset(str, '-', 3);
// printf("%s", str);
// return;
//}
//交换函数
void swap(int *pa, int*pb)
{
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 20;
int b = 10;
printf("a=%d b=%d\n", a, b);
swap(&a, &b);
printf("a=%d b=%d\n", a, b);
return 0;
}
我之前错误的在if后面跟了个else
但其实是错误的
//判断是否为素数
int is_prime(int n) {
int a = 2;
for (a = 2; a < n; a++) {
if (n % a == 0) {
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++) {
if (is_prime(i) == 1) {
printf("%d\n", i);
}
}
return 0;
}
当然也可以用开平方的形式,降低了算法的时间复杂度
原理就是i = a*b
如果把根号i个数都判断完了都没有,那另一半肯定也没有
#include <math.h>
int is_prime(int n) {
int a = 2;
for (a = 2; a <=sqrt (n); a++) {
if (n % a == 0) {
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++) {
if (is_prime(i) == 1) {
printf("%d\n", i);
}
}
return 0;
}
先把函数怎么用写出来,然后再写出具体的函数
这个代码错误的原因
int binary_search(int arr[], int k)
{
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int mid = 0;
while (left<=right) {
mid = (right + left) / 2;
if (arr[mid] == k) {
return mid;
}
else if (arr[mid] > k) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,89 };
int k = 6;
int ret = 0;
ret = binary_search(arr, k);
if (ret == -1) {
printf("不存在这个数");
}
else {
printf("下标是%d", ret);
}
return 0;
}
正确代码,秒到家了
int binary_search(int arr[], int k,int sz)
{
int left = 0;
int right = sz - 1;
int mid = 0;
while (left<=right) {
mid = (right + left) / 2;
if (arr[mid] == k) {
return mid;
}
else if (arr[mid] > k) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,89 };
int k = 6;
int ret = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
ret = binary_search(arr, k,sz);
if (ret == -1) {
printf("不存在这个数");
}
else {
printf("下标是%d", ret);
}
return 0;
}
函数链式访问
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
结果是4321
原因是printf的返回值是
源文件 .c
头文件.h
函数的递归
//函数的递归
//输入一个数字,如4321,打印出4 3 2 1
void print(int n)
{
if (n > 9) {
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int i = 0;
scanf("%d", &i);
print(i);
return 0;
}
编写程序,不创建临时变量,求字符串长度
用递归的方法写n!
这种感觉很妙,咋说呢,就是简简单单几行代码,因为不断地进入函数,当进入到最内层也就是终于到了该返回的时候,每一步都出来了的感觉,真奇妙!
int Fac(int i)
{
if (i <= 1) {
return 1;
}
else {
return i * Fac(i - 1);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fac(n);
printf("%d", ret);
return 0;
}
斐波那契数列
递归的方式
int Fib(i)
{
if (i <= 2) {
return 1;
}
else {
return Fib(i - 1) + Fib(i - 2);
}
}
int main()
{
int n = 0;
int ret;
scanf("%d", &n);
ret = Fib(n);
printf("%d", n);
return 0;
}
但是效率太低了,重复计算太多了
用迭代(循环)的方式
下面是我的,鹏哥的话,没有if,直接将c初始值设为1,更好?我也不知道
int Fib(int i)
{
int a = 1;
int b = 1;
int c = 0;
if (i <= 2) {
return 1;
}
while (i > 2) {
c = a + b;
a = b;
b = c;
i--;
}
return c;
}
int main()
{
int n = 0;
int ret;
scanf("%d", &n);
ret = Fib(n);
printf("%d", ret);
return 0;
}
递归可能会造成栈溢出