c语言递归例题分数_c语言常见50题 及答案(递归 循环 以及常见题目)

本文通过一系列C语言编程问题展示了递归和循环的运用,包括小球落地问题、猴子吃桃问题、斐波那契数列、回文数字与字符串判断、字符串操作等。每个问题都有详细的解决方案,帮助读者深入理解递归和循环的概念及其在实际问题中的应用。
摘要由CSDN通过智能技术生成

#define _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

#include

#include

#include

15.一小球从100米高度自由落下,每次落地后反跳回

原高度的一半,再落下,求它在第10次落地时,共经过多少米?

第10次反弹多高?

void test1()

{

float  Higth = 100;

float totil = 100;

int count = 10;

while (--count)

{

totil += Higth;

Higth = Higth / 2;

}

printf("%f \n", totil);

printf("%f \n", Higth/2);

}16.猴子吃桃问题:猴子第一天摘下若

干个桃子,当即吃了一半,还不够过瘾,又多吃了一个;第二天早

上又将剩下的桃子吃了一半,又多吃一个。以后每天都吃了前一天剩

下的一半多一个。到第10天想再吃是,见只有一个桃子了。求第一天共

摘了多少个桃子?

1

void test1() houzichitaowenti

{

int count = 10;

int x1 = 0;

int x2 = 1;

while (--count)

{

x1 = (x2 + 1) * 2;

x2 = x1;

count;

}

printf("%d \n", x1);

// printf("%d \n", EachDay);

}

int fun(int day)

{

if (day == 1)

return 1;

else

{

return (fun(day - 1) + 1) * 2;

}

}

求解:1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5…… + 1 / 99 - 1 / 100的值。

void test1()

{

float flag = 1;

int count = 100;

float ret = 0;

int   i = 1;

while (count--)

{

if (i % 2 == 0)

flag = -1;

float sum = 1 / (i*flag);

ret += sum;

i++;

}

printf("%f", ret);

}

18.阶乘问题:求1 + 2! + 3! + 4! + …… + 20!的和。

int fun(int x)

{

if (x == 1)

return 1;

else return x*fun(x - 1);

}

19.回文数字:判断一个数字是不是回文数。(回

文数的特点是正反序是同一个数字,如:12321, 3443)。

void test1(int n)

{

int i = n;

int j = 0;

while (n)

{

j = j * 10 + n % 10;

n = n / 10;

}

if (j == i)

printf("是回文");

else

{

printf("不是回文");

}

}

20.回文字符串:判断一个字符串是不是回文字符

串。(回文字符串特点是原字符串与字符串逆序之

后一样,如:"abcba", "cddc")。

int test1(char *str)

{

int n = strlen(str);

char *left = str;

char *right = str + n-1;

while (left

{

if (*left == *right)

{

left++;

right--;

}

else

{

return -1;

}

}

return 1;

}

void BubbleSort(int *p, int n)//冒泡排序的优化

{

int flag = n;

//int k = n;

while (flag>0)

{

int k = flag;

flag = 0;

for (int i = 1; i 

if (p[i - 1]>p[i])

{

swap(&p[i - 1],&p[i]);

flag = i;

}

}

}

24.将多个字符串排序输出。

比如:有三个字符串分别是:“Hello”、"bit-tech"、"world"。

void swap(char *p, char *q)

{

char *tmp = p;

p = q;

q = tmp;

//                                                          }

void StrSort(char **p)

{

if (strcmp(p[0], p[1]) > 0)

{

swap(p[0], p[1]);

}

if (strcmp(p[1], p[2]) > 0)

{

swap(p[1], p[2]);

}

if (strcmp(p[0], p[1]) > 0)

{

swap(p[0], p[1]);

}

}

25.用递归的方式求斐波那契数列的第n个数。

定义:

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

特别指出:第0项是0,第1项是第一个1。

这个数列从第2项开始,每一项都等于前两项之和。

int fibonaqi(int n)

{

if (n == 1)

return 0;

if (n == 2)

return 1;

else

{

return fibonaqi(n - 1) + fibonaqi(n - 2);

}

}非递归

int fibonaqi(int n)

{

int a=0, b=1, c;

if (n == 1)

return a;

if (n == 2)

return b;

for (int i = 3; i <= n;i++)

{

c = a + b;

a = b;

b = c;

}

return c;

}28.不允许创建临时变量求一个字符串的长度。   递归!!!

int StrLength(char *p)

{

if (

p == NULL)

return 0;

if (*p == '\0')

return 0;

else

{

return StrLength(p + 1) + 1;

}

}29.对任意一个整型数组排序(使用选择排序)

若每次取一个最大一个最小 则最好构建临时整型数组

void SlectSort(int *p, int n)

{

int right = n-1;

int left = 0;

for (; left 

{

int min = left;

int max = right;

for (int i = left; i <= right; i++)

{

if (p[min]>p[i])

min = i;

if (p[max] 

max = i;

}

if (min != left)

{

swap(p[min], p[left]);

if (max == left)

max = min;

}

if (max != right)

{

swap(p[max], p[right]);

}

}

}30.求一个数的二进制序列中1的个数。

int NumberOfOne(int n)

{

int count = 32;

int number = 0;

while (count--)

{

if (n & 1 == 1)//此位为1

++number;

n >>= 1;

}

return number;

}

31.编写程序判断你的电脑的存储方式是大端存储还是小端存储? 大小端存储

union var

{

char a;

int b;

};

union  var data;

//data.b = 1; 联合不能在函数外定义?

void test()

{

data.b = 1;

32.不允许创建第三方变量交换两个数的值。(注意:数的类型)

void swap(void *x, void *y)

{

(int *)x;

(int *)y;

*(int *)x = *(int *)x ^ (*(int *)y);

*(int *)y = *(int *)x ^ (*(int *)y);

*(int *)x = *(int *)x ^ (*(int *)y);

}

void swap(char *x, char *y,char )

{

*(char *)x = *(char *)x ^ (*(char *)y);

*(char *)y = *(char *)x ^ (*(char *)y);

*(char *)x = *(char *)x ^ (*(char *)y);

}

void test()

{

char a = 0;

char b = 1;

swap(&a, &b,char );

33.求1-100这100个整数中9出现的次数。//如何输出???

int NumberOfNine(int n)

{

int i = 1;

int count = 0;

for (; i <= 1000; i++)

{

int tmp = i;

while (tmp)

{

if (tmp % 10 == 9)

{

//if (tmp==)

cout <

++count;

}

tmp = tmp / 10;

}

}

cout <

return count;

}34.程序接收一个整数输入,输出该整数的每一位。

如:接收数字:1234     输出:1、2、3、4四个数字。///递归!!

/*void test(int n)

{

if (n<0)

{

cout <

n = -n;

}

if (n > 10)

test(n / 10);

cout <

}*/

void  test(int n)

{

if (n<0)

{

cout <

n = -n;

}

int a = n;

int num = 1;

while (a>10)

{

num *= 10;

a = a / 10;

}

while (n)

{

cout <

n = n%num;

num /= 10;

}

}

35.在字符串中查找一个指定的字符第一次出现的位置,并返回字符所在的位置,如果不存在则返回NULL。

int FindFirst(const char *str,char q)//"sadqweqsadsadas"//注意空  字符串

{

if (str == NULL)

return NULL;

int Add = 0;

while (*str)

{

++Add;

if (*str == q)

return Add;

str++;

}

if (*str == q)

{

++Add;

return Add;

}

return NULL;

}36.将一个字符串内容逆序。如:一个字符数组内容是:arr[]="bit-tech";经过逆序之后数组的内容变为:"hcet-tib"。

void Reverse(char *str)

{

int Length = strlen(str);

int left = 0;

int right = Length - 1;

for (; left 

{

swap(str[left], str[right]);

}

}

37.编写一个函数,它从一个字符串中提取一个子字符串。函数原型如下:

int substr(char dst[], charsrc[], int len){}

目标是:从src数组起始位置向后偏移start个字符的位置开始,最多复制len个非NULL字符到dst数组。

在复制完毕之后,dst数组必须以NULL字节结尾。函数的返回值是存储于dst数组中的字符串的长度。

int substr(char dst[], char src[], int len)

{

assert(dst);

assert(src);

int start = 2;

int count = 0;

//if (len > strlen(src))

// return 0;

while (start--&&src)

{

++src;

}

while (*dst&&*src&&len--)

{

*dst = *src;

dst++;

src++;

++count;

}

*dst = NULL;

return count;

}38.编写程序:从标准输入读取字符,并把它们写到标准输出。。除了大写字母转换成小写字母外,其他的原样输出。

void test()

{

char c;

char p[20];

int i = 0;

while ((c=getchar()) != '\n'&&i<=20)// i为个数

{

p[i] = c;

++i;

}

p[i] = '\n';

for (int j = 0; j 

{

printf("%c", p[j]);

}

for (int j = 0; j 

{

if (p[j] >= 65 && p[j] <= 91)

{

p[j] += 32;

}

}

for (int j = 0; j 

{

printf("%c", p[j]);

}

39.编写程序:当输入小写字母a,输出大写字母Z,当输入小写字母b,输出大写字母Y,以此类推,当输入小写字母z,输出大写字母A。

时间复杂度0(1)

void Exchange()

{

char a = 'z';

char c = getchar();

cout <

printf("%c", 187 - c);

}40.实现字符串的拷贝,功能类似strcpy,不能使用任何库函数(函数原型自己设计)

void Mystrcpy(char *dst, char *src)

{

assert(dst);

assert(src);

/* if (strlen(dst) 

{

return;

}*/

while (*src&&*dst)

{

*dst = *src;

src++;

dst++;

}

*dst = '\0';

}实现字符串的链接,功能类似strcat,不能使用任何库函数。

void Mystrcat(char *dst, char *scr)

{

assert(dst);

assert(scr);

while (*dst)

{

dst++;

}

while (*scr)

{

*dst++ = *scr++;

}

*dst = '\0';

实现字符串的比较,功能类似strcmp,不能使用任何库函数。实现字符串的比较,功能类似strcmp,不能使用任何库函数。

int Mystrcmp(char *str1, char* str2)

{

assert(str1);

assert(str1);

while (*str1&&*str2&&(*str1==*str2))//str1='\0'

{

str1++;

str2++;

}

if (*str1 == *str2)

return 0;

else if (*str1>*str2)

{

return 1;

}

else

{

return -1;

}

}

实现内存的拷贝,功能 类似memcpy,可以不实现内存重叠拷贝,不能使用任何库函数。

void MYmemcpy(char *dst,char *src)

{

}//将一个数字字符串转换为对应的数字,不考虑溢出。(比如:"12.34"转换为数字:12.34),功能类似库函数atof,考虑异常输出。

1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水?

int NumberOf(int Money)

{

int Empty = Money/1;

int totil = Money;

while (Empty>=2)

{

totil += Empty / 2;

Empty = Empty / 2 + Empty % 2;

}

return totil;

}49.编程求解:有一个字符串是"student a am i", 现变邪恶代码将字符串转换为"i am a student"。 i ma  o tneduts要求:空间复杂度O(1).

void swap(char *left, char *right)

{

while (left 

{

char tmp = *left;

*left = *right;

*right = tmp;

left++;

right--;

}

}

void Reverse(char *str)

{

char*tmp = str;

int Length = strlen(str);

int right = Length - 1;

int left = 0;

swap(str+left, str+right);

while (*str)

{

char *first = str;

char *second = NULL;

while (*first!=' '&&*first!='\0')

{

first++;

}

second = first-1;

swap(str, second);

str = ++first;

}

}

int main()

{

//int ret=test1("4454545");

//int ret = fun(10);

//char p[] = "abcde";

//char q[] = "abc";

//char a[] = "ab";

//char *r[3];

//r[0] = p;

//r[1] = q;

//r[2] = a;

//StrSort(r);

//int ret = fibonaqi(1);

//cout <

//char p[] = "q";

//int ret = StrLength(p);

//cout <

//int arr[] = { 4, 7, 8, 5, 6, 9, 3, 21, 12, 45, 68, 411, 256 };

//SlectSort(arr, 13);

//int ret = NumberOfOne(7);

// NumberOfNine(9);

//char *p = "qwerty";

//

//int ret=FindFirst(p, '\0');

//test(-1234);

//test(-1234);

//char p[] = "hello world";

//Reverse(p);

//cout <

//char p[] = "helloworld";

//char q[] = "wel";

//substr(q, p, 20);

//cout <

//Exchange();

//char p[] = "Hello World";

//char q[] = "welcome";

//Mystrcpy(q, p);

//char p[6] = "hello";

//char q[] = " world";

//strcat(p, q);

//printf("%s\n", p);

//char p[] = "aaa";

//char q[] = "aaa";

//int ret=Mystrcmp(p, q);

//int t = NumberOf(20);

//cout <

char p[] = "student a am i";

Reverse(p);

system("pause");

//getchar();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值