码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-03-12 14:52:56      阅读:309      评论:0      收藏:0      [点我收藏+]

标签: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;
}


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

标签:c语言 50题  

原文地址:http://10955910.blog.51cto.com/10945910/1750217

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!