寒假题练——day(5)

题目 1:

输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

我的解题代码:

#include
#include
#include
char* get_char_from_int(int x)
{
    int y = x;
    int count = 0;
    if (x == 0)
    {
        count = 1;
    }
    else
    {
        while (y)
        {
            count++;
            y = y / 10;
        }
    }
    char* p = (char*)malloc(sizeof(char) * count+1);
    int i = 0;
    for (i = 0; i < count; i++)
    {
        int tmp = (int)pow(10, i);
        p[i] = x / tmp%10 + '0';
    }
    p[i] = '\0';
    return p;
}
int main()
{
    int n;
    scanf("%d", &n);
    char* p = get_char_from_int(n);
    printf("%s", p);
    free(p);
    p = NULL;
    return 0;
}

答案思路:
这道题只需要循环取出一个数字的每一位进行单独打印,打印完毕后换行即可。而获取数据的每一位,可以通过取每次对数字模和除以 10 来完成
示例: 129 , 129%10 得到 9 , 129/10 得到 12 ,循环进行操作直到数字除以 10 得到 0 为止

#include 
int main()
{
  int num;
  while(~scanf("%d", &num)) {
    if (num == 0) {//0的情况特殊处理,因为0不会进入while循环计算余数,因此不会被打印
      printf("%d", num % 10);
      continue;
   }
    while(num > 0) {
      printf("%d", num % 10);//打印一个数字的个位数 129 % 10 得到9
      num /= 10;//通过除以10的方式去掉个位数 例如:129/10 得到12
   }
    printf("\n");
 }
  return 0;
}

题目 2:

对字符串中的所有单词进行倒排。

说明:

1、构成单词的字符只有26个大写或小写英文字母;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

我的解题代码:

#include
#include
void get_fomat_char(char arr[])
{
	int len = strlen(arr);
	int i;
	for (i = 0; i < len; i++)
	{
		if (!(arr[i] >= 'a' && arr[i] <= 'z' || arr[i] >= 'A' && arr[i] <= 'Z'))
		{
			arr[i] = ' ';
		}
	}
	
	for (i = 0; i < len-1; i++)
	{
		if (arr[i] == arr[i + 1] && arr[i + 1] == ' ')
		{
			int j;
			for (j = i; j < len; j++)
			{
				arr[j] = arr[j + 1];
			}
			i--;
		}
	}

}
void reverse(char arr[], int len)
{
	int left = 0;
	int right = len-1;
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main() 
{
	char arr[10001];
	gets(arr);
	get_fomat_char(arr);
	int len = strlen(arr);
	reverse(arr, len);
	char* p=arr;
	char* q=arr;
	while (1)
	{
		while (*q != ' '&&*q!='\0')
		{
			q++;
		}
		reverse(p, q - p);
		if (*q == '\0')
		{
			break;
		}
		p = q + 1;
		q = p;
	}
	printf("%s\n", arr);
}

答案解题思路:
定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母字符全部替
换成为字符串结尾标志,则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多
个字符串,最终对字符指针数组进行逆序打印每个单词即可。

#include 
#include 
int main()
{
  char str[10001] = {0};//字符串最长10000
  int row = 0;
  while(gets(str) > 0) {
    char *ptr = str;
    char *word[10000] = {NULL};
    while(*ptr != '\0') {
      //如果是个字母字符,则是单词的起始字符
      if (('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A')){
        word[row++] = ptr;//保存每个单词的起始地址
        //把本次的单词字母字符走完,直到遇到非字母字符
        while(*ptr != '\0' &&
          (('z' >= *ptr && *ptr >= 'a') ||('Z' >= *ptr && *ptr >= 'A'))) {
          ptr++;
       }
        continue;//不能继续向下,因为下边的ptr++会跳过当前的非字母字符
     }
      *ptr = '\0';//把非字母的数据全部替换为结尾标志
      ptr++;
   }
    for (int i = row - 1; i >= 0; i--) {
      printf("%s ", word[i]);//针对所有单词的起始地址逆序开始打印即可
   }
    printf("\n");
 }
}

你可能感兴趣的:(c语言题目分享,c语言)