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

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<assert.h>
#include<stdio.h>
#include<string.h>
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<right)
 {
  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 < k;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 < right; left++, right--)
 {
  int min = left;
  int max = right;
  for (int i = left; i <= right; i++)
  {
   if (p[min]>p[i])
    min = i;
   if (p[max] < p[i])
    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 << i << endl;
    ++count;
   }
   tmp = tmp / 10;

  }
 }
 cout << count << endl;
 return count;
}34.程序接收一个整数输入,输出该整数的每一位。
如:接收数字:1234     输出:1、2、3、4四个数字。///递归!!
/*void test(int n)
{
 if (n<0)
 {
  cout << "-" << endl;
  n = -n;
 }

 if (n > 10)
  test(n / 10);
 cout << n % 10 <<endl;
}*/
void  test(int n)
{
 if (n<0)
 {
  cout << "-" << endl;
  n = -n;
 }
 int a = n;
 int num = 1;
 while (a>10)
 {
  num *= 10;
  a = a / 10;
 }
 while (n)
 {
  cout << n / num << endl;
  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 < right; left++, right--)
 {
  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 < i; j++)
 {
  printf("%c", p[j]);
 }
 for (int j = 0; j < i; j++)
 {
  if (p[j] >= 65 && p[j] <= 91)
  {
   p[j] += 32;
  }
 }
 for (int j = 0; j < i; j++)
 {
  printf("%c", p[j]);
 }

39.编写程序:当输入小写字母a,输出大写字母Z,当输入小写字母b,输出大写字母Y,以此类推,当输入小写字母z,输出大写字母A。
时间复杂度0(1)
void Exchange()
{
 char a = ‘z‘;

 char c = getchar();
 cout << endl;
 printf("%c", 187 - c);

}40.实现字符串的拷贝,功能类似strcpy,不能使用任何库函数(函数原型自己设计)
void Mystrcpy(char *dst, char *src)
{
 assert(dst);
 assert(src);
/* if (strlen(dst) < strlen(src))
 {
  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 < right)
 {
  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 << ret << endl;
 //char p[] = "q";
 //int ret = StrLength(p);
 //cout << ret << endl;
 //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 << p << endl;
 //char p[] = "helloworld";
 //char q[] = "wel";
 //substr(q, p, 20);
 //cout << q << endl;

 //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 << t << endl;
 char p[] = "student a am i";
 Reverse(p);
 system("pause");
 //getchar();
 return 0;
}
时间: 2024-09-30 05:47:41

c语言常见50题 及答案(递归 循环 以及常见题目)的相关文章

需掌握 - JAVA算法编程题50题及答案

[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题public class lianxi01 {public static void main(String[] args) {System.out.println("第1个月的兔子对数: 1");System.out.println("第2个月的兔子对数: 1");int f1

最新JAVA编程题全集(50题及答案)

[程序1]??? 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少???? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数:??? 1"); System.out.println("第2个月的兔子对数:???

50题(ACM学习推荐题)

POJ推荐50题 1. 标记"难"和"稍难"的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉. 2. 标记为 A and B 的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目. 3. 列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制. 4. 这里不少题目在 BUPT ACM FTP 上面都有代码,请大家合理利用资源. 5. 50个题目要求每个题目都要写总结,养成良好的习惯. 9. 这个列表的目的在于让

微软等数据结构+算法面试100题全部答案集锦

1.把二元查找树转变成排序的双向链表. 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 10  / \  6 14  / \ / \  4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode  {  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child

LeetCode面试常见100题( TOP 100 Liked Questions)

LeetCode面试常见100题( TOP 100 Liked Questions) 置顶 2018年07月16日 11:25:22 lanyu_01 阅读数 9704更多 分类专栏: 面试编程题真题合集 常见算法问题 LeetCode试题 LeetCode常见试题 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lanyu_01/article/details/81062232 这篇文章

Javascript基础练习之实现C语言经典程序题

前言: 最近在学习Javascript语言,看到网上很多都是在介绍Javascript如何解决网页上问题的代码,所以想另辟蹊径,用Javascript代码来实现C语言经典程序题.当然,这些C语言程序题也是比较简单,主要想通过Javascript语言实现,起到语法练习作用,也想来对比一下C语言和Javascript语言实现的相同点和不同点,从而巩固记忆,加强学习效果!!! 一.C语言经典程序题1 1. 题目描述: 马克思的手稿中有这样一道有趣的数学题:有30个人,其中有男人,女人,小孩.他们在一家

sql语句练习50题

sql语句练习50题 Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) 教师表 练习内容: 1.查询“某1”课程比“某2”课程成绩高的所有学生的学号: SELECT a.sid FROM (SELECT sid,score FROM SC WHERE cid=1) a,(SELECT sid,score FROM SC WHERE cid=3) b

C语言每日一题之No.9

再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出"abdefghjkmnptwy". 二.思路:既然是已经排好序的,就用二分法查找的思想 将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入 三.程序 1 #include <stdio.h> 2 #include <string.

C语言每日一题之No.1

鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C这东西毕竟是练出来的,所以从今天开始,每日一道C语言题目,从题目入手来补知识漏洞.题目比较基础,如不堪入目,还请见谅. 题目:输入三个整数,输出最大的数 思路:定义三个变量用来存储输入的整数 比较三个变量的大小,找到最大的数 定义一个变量存储来存储最大的数 程序: 1 #include <stdio