华为历年机试题型总结系列(四)

10.输入m个字符串和一个整数n,把字符串M化成以N为单位的段,不足位数用0补齐

输入:123456789, n=8 输出:12345678 90000000, 输入:123,n=8 输出:12300000

#include<stdio.h>
#include<string.h>

void NumberDivide(char *pInputStr, int StrLength, int N, char *pOutputStr)
{
      int i,j=0,section_number,string_left_number,k;

      if(StrLength<N)  //如果输入字符串长度不足N
      {
             for(i=0;i<N;++i)
             {
                    if(i>=StrLength)  //不足的位数补0
                         pOutputStr[j++]='0';
                    else
                         pOutputStr[j++]=pInputStr[i];
             }
       }else         //输入字符长度大于分段N
       {
               section_number=StrLength/N;   //可整段输出的段数
                string_left_number=StrLength-N*section_number;     //整段输出后剩余的字符数
                
                for(i=0;i<section_number;++i)    //输出完整的section_number段长度为N的字符
                {
                       for(k=0;k<N;++k)
                             pOutputStr[j++]=pInputStr[i*N+k];        //将输入字符串N段输出
                        pOutputStr[j++]=' ';  //N段字符之间用空格隔开
                 }

                 for(i=section_number*N;i<section_number*N+N;++i)   //输出剩余字符串,不足补0
                 {
                       if(i>=section_number*N+string_left_number)
                            pOutputStr[j++]='0';
                       else
                            pOutputStr[j++]=pInputStr[i];
                 }
        }

        pOutputStr[j]='\0';
}

int main(void)
{
      char pInputStr[20],pOutputStr[20];
      int StrLength,n;

      printf("Input the number sequences:\n");
      gets(pInputStr);
      StrLength=strlen(pInputStr);

      printf("Input the n:\n");
      scanf("%d",&n);

      NumberDivide(pInputStr,StrLength,n,pOutputStr);

      puts(pOutputStr);

      return 0;
}

11. 电话号码

输入:OneTwoThree 输出:123 ,输入:OneTwoDoubleTwo 输出:1222。有空格,非法字符,两个Double相连,Double位于最后一个单词都错误

#include<stdio.h>
#include<string.h>

int NumberTrans(char *pInputStr, int StrLength, char *pOutputStr)
{
     int i,j=0,k=0;
     char pOutputStr_Reverse[20];     //逆向存放输出数组
     
      for(i=StrLength;i>=0;--i)   //逆向输出是为了解决Double问题
      {
             switch (pInputStr[i])
             {
                 case 'O':pOutputStr_Reverse[j++]='1';break;
                 case 'T':pOutputStr_Reverse[j++]=(pInputStr[i+1]=='w')?'2':'3';break;
                 case 'F':pOutputStr[j++]=(pInputStr[i+1]=='o')?'4':'5';break;
                 case 'S':pOutputStr_Reverse[j++]=(pInputStr[i+1]=='i')?'6':'7';break;
                 case 'E':pOutputStr_Reverse[j++]='8';break;
                 case 'N':pOutputStr_Reverse[j++]='9';break;
                 case 'D':
                          if(j==0 || pInputStr[i+6]=='D')    //如果Double在最后或者连续两个Double,则返回1
                                   return 1;
                          else
                                   pOutputStr_Reverse[j++]=pOutputStr_Reverse[j-1];   //连续两个输出一样
                            break;

                     case '0':return 1;break;
                     case '1':return 1;break;
                     case '2':return 1;break;
                     case '3':return 1;break;
                     case '4':return 1;break;
                     case '5':return 1;break;
                     case '6':return 1;break;
                     case '7':return 1;break;
                     case '8':return 1;break;
                     case '9':return 1;break;

                     default:break;
             }
      }

      pOutputStr_Reverse[j]='\0';
      for(i=j-1;i>=0;--i)
          pOutputStr[k++]=pOutputStr_Reverse[i];     //正向输出结果

      pOutputStr[k]='\0';
}

int main(void)
{
    char pInputStr[20],pOutputStr[20];
    int StrLength,flag=0;
    
    printf("Input the numbers:\n");
    gets(pInputStr);
    StrLength=strlen(pInputStr);

    flag=NumberTrans(pInputStr,StrLength,pOutputStr);        //flag用于判断是否输入字符合法

   if(flag==1)    //非法返回值
       puts("ERROR");
   else
       puts(pOutputStr);

    return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值