文章目录
作业
int cnt=0;
int fib(int n){
cnt++;
if(n==0)
return 1;
else if(n==1)
return 2;
else
return fib(n-1)+fib(n-2);
}
void main( ){
fib(8);
printf("%d" , cnt);}
明白这个变量是在干什么,不要蛮算,cnt实际在统计:斐波那契递归总的次数
F0递归1次,F1递归1次
F2: F0+F1=递归3次。F3: F2+F1=5,F4:F3+F2=1+5+3=9,F5:F4+F3=1+9+5=15,F6: F5+F4=1+15+9=25,F7: F6+F5=1+25+15=41,F8: F7+F6=1 +41 +25 = 67
45846 --Fibonacci数列
添加链接描述
F(n) = F(n - 1) + F(n - 2)。f = 斐波那契数 = 0,1, 1, 2, 3, 5, 8,13,若N = 10,f = 8 = 13,10 - 8 = l, 13 - 10 = r,
#include <iostream>
using namespace std;
int main(){
int N, f, l = 0,
r = 0, f0 = 0, f1 = 1;
cin >> N;
while (1)
{ f = f0 + f1; f0 = f1; f1 = f;
if(f < N)//找到比N小且距离N最近的数,求出距离
l = N-f;
else {
//找到比N大且距离N最近的数,求出距离
r = f - N;
break;
}
} //取最小距离
cout << min(l, r) << endl;
return 0;
}
3.矩阵的每行从左到右是递增的,矩阵从上到下是递增的,查找某个数字是否存在。时间复杂度小于O(N)
int FindData(int arr[][4], int row,int col, int target){
int i = 0;
int j = col - 1;//右上角
while (i<row && j >= 0){
if (target > arr[i][j])
i++;
else if (target < arr[i][j)
j--;
else{
return 1;
}
}
return 0;
}
int main(){
int arr[][4] = {
{ 1,2,3,4 },{ 5,6, 7,8 },{ 9,10,11,12},{13,14,15, 16 },
};
int target = 1://查找本质是“排除”[比较]
int res = FindData(arr,4,4,target) ;
printf("exist: %d\n", res); }
函数形参实例化:从右到左。凡是向显示器中打印的内容,全部都是字符;凡是键盘中输入的内容全部都是字符;显示器和键盘被称之为字符设备;printf、scanf:格式化;puts:非格式化;strtok:分割字符串,摒弃空串"",只会获取有效字符串;一个返回值,一次只能拿一个字符串地址;strtok需要多次调用,来进行字符串分割,第二次之后,如果还想分割历史string,参数必须设置为NULL;第2次调这个函数时,还记得上次的字符串:strtok内部有static变量,传入参数非空则初始化,是空则用上次的结果;设置分隔符为\0的方式,进行子串提取;main函数返回值return 0是给系统的,0=成功,错误码=计算机好处理,
4.qsort的功能实现一个通用的冒泡排序:
qsort=无类型排序,对任何类型数据排序,
void myqsort(void * base, size_t nitems, size_t size, int(*compar)(const void *, const void *))
{
int i, j;
char * st = (char *)base; //void *不方便加减,用char *加减轻松且字节跳转为1,方便控制。
char tmp[16]; //考虑到long double类型,临时空间做成16字节比较保险
for (i = 0; i < nitems - 1; i++)
{
for (j = 0; j < nitems - 1 - i; j++) //冒泡常用循环头
{
if (compar(st + j * size, st + (j + 1) * size)) //比较的时候跳转注意乘size
{
memcpy(tmp, st + j * size, size); //交换操作用memcpy完成就不会出问题。
memcpy(st + j * size, st + (j + 1) * size, size);
memcpy(st + (j + 1) * size, tmp, size);
}
}
}
}
int main(){
printf("%d\n",
printf("%d",
printf("43")));
}//结果:4321.链式调用从内向外
4、写一个函数打印arr整形一维数组的内容,不使用数组下标,使用指针
void ShowArr(int arr[],int num){//方法1
for (int i =0; i < num;i++)//前闭后开区间
printf("%d ",*(arr + i));
}
void ShowArr(int *p,int num){//方法2
int *start =p:
whiel(start < p+num)//指向数组最后一个元素的下一个位置,前闭后开区间:差值:元素个数
printf("%d ”,*start):}
void ShowArr(int *p,int num){//方法3
for (int i =0; i < num;i++)
printf("%d ",p[i]);
}
int main(){
int arr[]={10,9,8,7,6,5,4,3,2, );
int num = sizeof (arr) / sizeof (arr[O]);//元素个数
ShowArr (arr,num);}
6、调整数组使奇数全部都位于偶数前面
void Exchange(int arr[],int num)
{ int left = 0;
int right = num - 1;
while (left < right)
{ //判断奇偶:检测最低比特位=0,即偶数
while (left < right && (arr[left] & 1))//(arr[left] & 1)是真时,数=奇数
left++;
while (left < right && !(arr[right] & 1))
right--;
if (left 〈 right){
arr[left] ^= arr[right];
arr[right] ^= arr[left];
arr[left] ^= arr[right]; }
}
}
int main(){
int arr[]={10,9,8,7,6,5,4,3,2, );
int num = sizeof (arr) / sizeof (arr[O]);//元素个数
Exchange (arr,num);}
7、模拟实现库函数strcpy拷贝
char*my _strcpy(char *dst,const char *src){
assert(dst);
assert(src);
char *ret = dst;
while (*dst++ = *src++);//判断*dst真假,src给dst之后,再++
return ret;
}
int main(){
const char *src = "abcd1234xyz";
char dst[32];
my_strcpy(dst,src);//需要拷贝\0
}
9、求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
int main(){
int a = 2;
int result = 0;
for (int i = 0; i < 5; i++) {
int temp = a;
int j = 0;
while (j < i){
temp = temp * 10 + a;
j++;
}
result += temp;
printf("=%d\n",result);
}
10、水仙花数
0~100000之间的所有“水仙花数”并输出。“水仙花数”:一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。
int ExpCount(int x){
int count = 0; while (x){
x /= 10;
count++;
}
return count;
}
void ShowFlower(int start, int end){
for (int i = start; i <= end; i++)
{
if (IsFlower(i))
printf("%d ", i);
}
}
int IsFlower(int x){
int sum = 0; int tmp = x;
int exp =ExpCount(x) ;//n
while (x){
sum += (int)pow(x % 10, exp);
x /= 10;
}
return sum == tmp;
}
int main(){
ShowFlower(0,1000) ;system("pause") ;
return 0;}
11、打印菱形
void Show(int n){//上半部分
for (int i = 0; i< = n / 2; i++){
int j = 0;
for (j = n / 2 - i; j > 0; j--){
printf("");//输出空格
}
for (j = 0; j < 2 * i + 1; j++){
printf(""*"");
}
printf("\n");
}
//下半部分
for (int i = 1; i <= n / 2; i++){
int j = 0;
for (; j <i; j++){
printf("");//输出空格
}
for (j = 0; j < n-2 * i ; j++){
printf(""*"");
}
printf("\n");
}