C语言练级之路(num6)10个基础小题目等你来挑战

简介: 首先今天有点迟了,原因就是去看了一下别的大佬的有关十六进制转八进制的博客,看的我现在人都有点不正常,要不是我目前还不会写,我觉得有的博主的写法我属实不能理解,等我哪天研究会了,……

首先今天有点迟了,原因就是去看了一下别的大佬的有关十六进制转八进制的博客,看的我现在人都有点不正常,要不是我目前还不会写,我觉得有的博主的写法我属实不能理解,等我哪天研究会了,……

1.第一题:(直接来一个十六进制转八进制),虽然目前还不是很懂


#include<stdio.h>
#include<string.h>
char h[100002], b[400002], e[400002];
int main()
{
    int n, j;
    scanf("%d", &n);
    while (n--) {
        scanf("%s", h);
        int i, len = 0;
        for (i = strlen(h) - 1; i >= 0; i--) {
            int v;
            if (h[i] >= '0' && h[i] <= '9')
                v = h[i] - '0';
            else v = h[i] - 'A' + 10;
            for (j = 0; j < 4; j++) {
                b[len++] = v % 2 + '0';
                v /= 2;
            }
        }
        b[len] = '\0';
        int x = 0, cnt = 1;
        int l = 0;
        for (i = 0; i < len; i++) {
            if (cnt == 4 || i == len - 1) {
                x = cnt * (b[i] - '0') + x;
                cnt = 1;
                e[l++] = x + '0';
                x = 0;
            }
            else {
                x = cnt * (b[i] - '0') + x;
                cnt *= 2;
            }
        }
        i = l - 1;
        while (i >= 0 && e[i] == '0')
            i--;
        if (i < 0)
            printf("0");
        for (; i >= 0; i--) {
            printf("%c", e[i]);
        }
        printf("\n");
    }
    return 0;
}

2.第二题:

87.png


#include<stdio.h>
int main()
{
  int i, j, n, m;
  scanf("%d%d", &n, &m);
  char ch[100][100];
  for (i = 0; i < n; i++)//行
  {
      //然后就是利用这个字母图形的规律来解题了
    if (i == 0)//二维数组的角度来看,此时的这个意思就是第一行的每一个元素
    {
      for (j = 0; j < m; j++)//列(列,也就是控制第一行的每一个元素)
      {
        //这边没人叫你是输入一个字符串,让你去排序(不敢太搞笑),这边只是想要a到某个字母而已
        //所以这边可以直接给这个二维数组进行赋值(就是有点像杨辉三角那样,利用图形规律,对这个图形直接进行赋值操作,充分可以看出你没有真正的掌握杨辉三角的真谛)
        ch[0][j] = 'a' + j;//这步就是充分去利用了什么是ascii码值(当然你也可以不写a ,直接写ascii码值也是一样的)
      }
    }
    else
    {
      for (j = 0; j < m; j++)
      {
        //并且此时把这个二维数组的第一行给赋值完成后,这边还有两种情况
        if (j == 0)
        {
          ch[i][0] = ch[i - 1][0] + 1;
        }
        else
        {
          ch[i][j] = ch[i - 1][j - 1];
        }
      }
    }
  }
  //以上这个for循环就把我的二维数组中的每一个元素都给搞定了
  //所以这边就可以对二维数组进行打印了
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < m; j++)
    {
      printf("%c",ch[i][j]);//这边是打印字符(不敢写成打印整形了,不然就完了)
    }
    //上述为打印一行
    //所以要进行下一行的打印这边就要有有个换行
    printf("\n");
  }
  return 0;
}

3.第三题:

88.png


#include<stdio.h>
int main()
{
  int m, n;
  int i, j, tmp;
  char ch[10][10] = {0};
  scanf("%d %d",&n,&m);//这个输入就是输入n行n列的意思
  //这下就是具体的原理实现
  for (i = 0; i < n; i++)//n行   5
  {
    for (j = 0; j < m; j++)//这个表示每一行有几个元素,也就是有几列的意思   4
    {
      scanf("%c", &ch[j]);//这个表示我要输入的字符
      for (i = 0; i <n-1 ; i++)
      {
          tmp = ch[i + 1];
          //ch[m - 1 - i] = ch[m - 1 - 1 - i];
          ch[i+1] = ch[i];
      }
      ch[j] = tmp;
    }
    printf("%c", ch[i]);
  }
  return 0;
}

4.第四题:(复习二分查找

#include<stdio.h>
int search(int arr[], int k, int sz)
{
  //这个好像就是这样的,这个就是为了算这个数组中有几个元素而已
  int left = 0;
  int right = sz - 1;//这个就是最后一个元素的下标
  //接下来就是一个牛白的算法(二分查找法的经典一步)
  int mind = 0;
  while (left <= right)
  {
      mind = (left + right) / 2;
    if (k > arr[mind])//要记住几边的mind只是一个数组的下标,所以此时要把它放到数组中去
    {
      left = mind + 1;
    }
    else if (k < arr[mind])
    {
      right = mind - 1;
    }
    else
    {
      return mind;
    }
  }
  return 10;
}
int main()
{
  int ret;
  int  n;
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("请输入你要查找的数:");
  scanf("%d",&n);
  int sz = sizeof(arr) / sizeof(arr[0]);
  ret = search(arr, n, sz);
  if (ret == 10)
  {
    printf("找不到\n");
  }
  else
  {
    printf("找到了,下标是:%d", ret);  
  }
  return 0;
}

5.第五题:(复习迭代)

#include<stdio.h>
int main()
{
  int i, j, n;
  int a = 1, b = 1, c;
  printf("请输入你想知道的第几个斐波那契数列:");
  scanf("%d",&n);
  while (n> 2)
  {
    c = a + b;
    a = b;
    b = c;
    n--;
  }
  printf("%d",c);
  return 0;
}

6.第六题:(寻找一个数组中缺少的某个数)

#include<stdio.h>
int main()
{
  int i, j, n;
  int m = 0;
  int arr[10] = { 0,1,2,3,4,5,6,7,8,10 };
  for (i = 0; i <= 10; i++)
  {
    m ^= i;//这步搞定之后我的m中就有了这个arr中的所有数字了
  }
  printf("%d\n",m);
  for (i = 0; i < 10; i++)
  {
    m ^= arr[i];
  }
  printf("%d",m);
  return 0;
}

7.第七题:(复习三步翻转法)(区别于各类数据翻转)

#include<stdio.h>
void reverse(int arr[], int left, int right)//下次这边要去用指针,因为你已经很久没有用指针去写了,不敢把指着给忘记掉
{
  //这个函数这样写是属于一个下标的使用
  //所以当我们在进行元素位置的交换时一共有两种方法(一个使用下标进行交换,一个就是用指针,直接进行指针位置的交换)(这两种方法千万不敢混在一起用,不然真的是会完蛋的)
  //所以总的来说,旋转这一块知识中可以使用的方法种类非常的多,千万不敢混在一起了
  int tmp;
  while (left<right)
  {
    tmp = arr[left];//如果这边想要写成指针的话,这边就应该把left和right变成指针,直接进行指针位置的交换
    arr[left] = arr[right];
    arr[right] = tmp;
    left++;
    right--;
  }
}
int main()
{
  int i, j, n;
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  printf("请输入你要旋转的元素的个数:");
  scanf("%d",&n);//假如此时我要旋转5次(也就是最后要得到 6,7,8,9,10,1,2,3,4,5)这样的序列
  //这个位置一定要注意下标,千万不敢越界了
  //并且要注意当我的旋转个数大于我的元素个数时,我的程序就是有问题的
  //所以为了使我的代码完美(不出错),所以这边一定还要加一个条件上去
  if (n >= sz)
  {
    n %= sz;//例如此时我的这个n=sz=10,此时%一下就是想当与不进行旋转(确实是不需要旋转的,因为就算旋转10次,它其实还是原来的那个东西,当n大于sz时(15)所以此时就还是旋转5次,如果不进行%这个条件,就会导致我们下面的代码出问题,因为会越界)
  }
    reverse(arr,0,sz-n-1);//这步就是我要逆置我的那些本来不需要逆置的数
  reverse(arr,sz-n-1, n-1);//这步的意思就是表示我要逆置我本来就需要逆置的数
  reverse(arr,0, sz-1);//这步就是表示我将我的整个数组都给逆置一下(并且此时这样的逆置方法是属于左右逆置)前sz-k个先逆置,后k个逆置,最后所有元素逆置
  for (i = 0; i < sz; i++)
  {
    printf("%d ",arr[i]);
  }
  return 0;
}

8.第八题:(复习冒泡排序

#include<stdio.h>
int main()
{
  int arr[100] = { 1,2,3,4,5,6,7,8,9,10 };
  int i, j, n;
  int tmp = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
  for (i = 0; i < 9; i++)//这边就是为了控制数组中的每一个数而已
  {
    for (j = 0; j < 9-i; j++)//这个就是为了控制每一个数的交换的次数
    {
      tmp = arr[j];
      arr[j] = arr[j+1];
      arr[j + 1] = tmp;
    }
  }
  for (i = 0; i < 10; i++)
  {
    printf("%d ",arr[i]);
  }
  return 0;
}

9.第九题:(复习杨氏矩阵)

#include<stdio.h>
int Findname(int arr[][6], int n, int* px, int* py)//因为下面传上来的是两个地址,所以这边我也可以用我的指针来接收
{
  int x = 0;
  int y = *py - 1;
  while (x <= *px - 1 && y>=0)
  {
    if (arr[x][y]<n)
    {
      x++;
    }
    else if (arr[x][y] > n)
    {
      y--;
    }
    else
    {
      *px = x;
      *py = y;
      return 1;
    }
  }
  *px = -1;
  *py = -1;
  return 0;
}
int main()
{
  int arr[3][6] = { {1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18} };
  int  n;
  int ret = 0;
  int x = 3;
  int y = 6;
  printf("请输入你要查找的数字:");
  scanf("%d", &n);
  //有了我需要查找的数了,此时我就要把二维数组的坐标给弄出来
  //我们这边也可以直接包装一个函数
  ret = Findname(arr, n, &x, &y);
  if (1 == ret)
  {
    printf("找到了,该数的下标是:(%d ,%d)",x,y);
  }
  else
  {
    printf("找不到你想要的数!(%d ,%d)", x, y);
  }
  return 0;
}

10.第十题:(复习杨氏三角)

#include<stdio.h>
int main()
{
  int arr[100][100] = { 0 };
  int i, j, n;
  printf("请输入你需要的杨氏三角的行数:");
  scanf("%d", &n);
  for (i = 0; i < n; i++)//此时这个就是表示控制行数
  {
    for (j = 0; j < i; j++)//据杨氏三角特征n行就有n个元素(所以此时这个j变量就是用来控制每一行的元素的个数的,所以用j<i来控制)
    {
      if (0 == j || i == j)//根据特性
      {
        arr[i][j] = 1;
      }
      else
      {
        arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
      }
    }
  }
  //将数组利用特性赋值完,此时就是打印出来
  for (i = 0; i < n; i++)
  {
    for (j = n; j > i + 1; j--)
    {
      printf("   ");
    }
    for (j = 0; j < i; j++)
    {
      printf("%-6d",arr[i][j]);
    }
     printf("\n");
  }
  return 0;
}

89.png


这个图片好看,每天看一遍

11.今天题目就到这吧!

相关文章
|
6月前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
6月前
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
44 1
|
11月前
2.C语言题目---字符串左旋
2.C语言题目---字符串左旋
75 1
|
18天前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
11月前
|
存储
1.C语言题目---指针类(基础)
1.C语言题目---指针类(基础)
58 1
|
3月前
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
43 1
|
6月前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
5月前
|
C语言
c语言循环题目
c语言循环题目
|
6月前
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)