百度笔试1

本文详细介绍了如何使用C语言解决数学计算复杂度问题,即求一个整数N的阶乘末尾连续0的个数;实现两棵树的相等性比较算法;以及在GBK编码的字符串中去除所有ANSI编码的字母和数字的方法。通过实例代码解释了这些操作的实现细节和复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。(不用考虑数值超出计算机整数界限的问题)

思路:就是求N中5的个数

解答:

int num;//结尾0的个数
num=0;
while(N)
{
num+=N/5;
N/=5;

 

2、请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度。
数据结构为:
typedef struct_TreeNode{
       char c;
       TreeNode *leftchild;
       TreeNode *rightchild;
}TreeNode;
函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2);
注:A、B两棵树相等当且仅当Root->c==RootB-->c,而且A和B的左右子树相等或者左右互换相等。

解答:

int CompTree(TreeNode* tree1,TreeNode* tree2){

  if(!tree1&&!tree2) return 1;

      else if((tree1->c==tree2->c)&&(CompTree(tree1->leftchild,tree2->leftchild)&&(CompTree(tree1->rightchild,tree2->rightchild))) return 1;

      else return 0;

}

 

 

3、已知一个字串由GBK汉字和ansi编码的数字字母混合组成,编写c语言函数实现从中去掉所有ansi编码的字母和数字(包括大小写),要求在原字串上返回结果。
函数接口为:int filter_ansi(char* gbk_string)
注:汉字的GBK编码范围是0x8140-0xFEFE

我这里没有区别编码的问题,汉字就是占两个字节,并且最高位为1
 

#include <stdio.h>
#include <stdlib.h>

int isnum(int ch)
{
  if(ch>='0' && ch<='9')
   return 1;
  else
   return 0;
}

int iszimu(int ch)
{
  if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
    return 1;
  else
   return 0;
}

int filter_ansi(char* gbk_string)
{
  int i = 0;
  int filter = 0;
  char* tmp = gbk_string;
  while(*tmp)
  {
    if(isnum(*tmp) || iszimu(*tmp))
     {
       filter++;
       tmp++;
      }
    else if(*tmp&0x80)
      {
       gbk_string[i] = *tmp;
       i++;
       tmp++;
       gbk_string[i] = *tmp;
       i++;
       tmp++;
      }
     else
      tmp++;
  }
  gbk_string[i] = '\0';
  return filter;
}
 
int main(int argc, char *argv[])
{
  char gbk_string[] = "a1我b2是c3A谁";
  printf("original str is %s\n", gbk_string);
  printf("filter %d chars\n", filter_ansi(gbk_string));
  printf("after the str is:%s\n", gbk_string);
  system("PAUSE");    
  return 0;
}

这是个编码问题,你可以查看下

编码名称   第一字节                第二字节
gb2312     0xB0-0xF7            0xA0-0xFE
GBK          0x81-0xFE            0x40-0xFE
BIG5         0x81-0xFE            0x40-0x7E or 0xA1--xFE
我这里简单起见,就直接用第一个字节的高位为1了....
如果没记错的话,全角输入的汉字,符号都是高位为1。如这里的(,。)

*tmp&0x80 是为了确定*tmp最高位是否为1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值