注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

时间记录器

记录我的Linux、Android学习之路

 
 
 

日志

 
 

华为上机:电话号码判断、数组比较约瑟夫问题等  

2012-08-24 14:08:47|  分类: C语言相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

From:lsf

/*
首先电话号码长度为13,然后判断是否以86开头,最后判断是否有其他字符
*/
#include <stdio.h>
#include <string.h>

int phone_num_test(char num[])
{
int i, len, result = 0;
len = strlen(num);
if(len == 13 && num[0]=='8' && num[1]=='6')
{
for(i=2; i<len; i++)
 if(num[i] >= '0' && num[i] <= '9')
  continue;
 else
 {
  result = 1;
  break;
 }
}
else
result = 1;
printf("Result is %d\n",result);
return result;
}

void main(void)
{
 char str[13];
 int result = 0;
 printf("Please enter the phone number:\n");
 scanf("%s",str);
 printf("%s\n",str);
 result = phone_num_test(str);
 printf("The phone number is %s\n", result ? "Wrong" : "Right");
}

   

/*
1. 数组比较(20分)
o 问题描述:
比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。
请编程实现上述比较,并返回比较中发现的不相等元素的个数
比如:数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3
o 要求实现函数:
int array_compare(int len1, int array1[], int len2, int array2[])
o 示例
1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5      函数返回:0
2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6     函数返回:3
*/

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

int array_compare(int len1, int array1[], int len2, int array2[])
{
 int len, i, count=0;
 if(len1 < len2)
  len = len1;
 else
  len = len2;

 for(i=0; i<len; i++)
 {
  if(array1[len1-1-i] != array2[len2-1-i])
   count++;
 }
 return count;
}

void main(void)
{
int array1[] = {2,1,2,5,9,4,5};
int array2[] = {77,21,9,3,5};
int len1 = sizeof(array1)/sizeof(int), len2 = sizeof(array2)/sizeof(int), result;
result = array_compare(len1,array1,len2,array2);
printf("result is %d\n",result);
}

   

/*
2. 约瑟夫问题
o 问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。
从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,
然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。
请编程实现上述计数过程,同时输出数值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。
o 要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】 int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值
【输出】 int output_array[]:输出的数值出列顺序
o 示例
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}
*/

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

void array_iterate(int len, int input_array[], int m, int output_array[])
{
int i, j=0, finish =0, count=1;
do
{
 finish = 0;
 for(i=0; i<len; i++)
 {
  if(input_array[i] == 0)
   continue;
  finish += input_array[i] ;
  count++;
  if(count == m)
  {
   output_array[j++] = input_array[i] ;
   input_array[i] = 0 ;
   count = 0;
  }
 }
}
while(finish);

}

main()
{
int input_array[] = {3,1,2,4};
int m, len=sizeof(input_array)/sizeof(int);
int output_array[sizeof(input_array)/sizeof(int)] = {0};
printf("Please input the number:");
scanf("%d",&m);

printf("input_array:");
for(m=0; m<len; m++)
printf(" %d",input_array[m]);

array_iterate(len, input_array, m, output_array);

printf("\noutput_array:");
for(m=0; m<len; m++)
printf(" %d",output_array[m]);
printf("\n");
}

   

 /*
3. 简单四则运算
o 问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除
按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
o 要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
o 示例
1) 输入:char *expStr = "1+4*5-8/3"    函数返回:19
2) 输入:char *expStr = "8/3*3"     函数返回:6
*/

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

int calculate(int len,char *expStr)
{
 int i=0, j=0, k=0, result = 0;
 int num[20],str[20];
 char*p;
 p=expStr;
 //乘除 运算
 while(*p)
 {
  if(*p >= '0' && *p <= '9')
   num[i++] = *p-'0';
  else if(*p=='+' || *p=='-')
   str[k++] = *p ;
  if(*p=='*')
  {
   num[i-1] = num[i-1] * (*(p+1)-'0');
   p++;
  }
  if(*p=='/')
  {
   num[i-1] = num[i-1] / (*(p+1)-'0');
   p++;
  }
  p++;
 }

 for(j=0; j<i; j++)
  printf("num[%d]= %d  ",j,num[j]);
 printf("\n");

 //加减运算
 for(i=0; i<k; i++)
 {
 if(result == 0)
  result = num[0];
 if(str[i] == '-')
  result = result - num[i+1];
 else
  result = result + num[i+1];
 }

 return result;

}

void main(void)
{
//char expStr[] = "1+4*5-8/3";
char *expStr = "8/3*3+2*3*6/2-7";
int result;
result = calculate(sizeof(expStr)/sizeof(char), expStr);
printf("The result is %d\n",result);
}

   

昨天晚上华为上机考试:

第一题:判断一个字符串中某个位置的字符的大小写

第二题:找出数组中所有的2的N次方的元素的个数

第三题:找出一个字符串中的最长的回文数

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

void find(char in[], int len, char out[])
{
 int i=0,j=0,m=0,count=0,flag=0;
// printf("%s\n",in);
 for(i=0; i<len; i++)
  for(j=0; j<len-i-1; j++)
  {

   if(in[i] == in[len-1-j])
   {
    for(count=1; count<(len-j-i)/2; count++)
     if(in[i+count] != in[len-1-j-count])
      break;
     if(count >= (len-j-i)/2)
     {
      count=len-j-i;
      if(flag < count)
      {
       for(m=0; m<count; m++)
        out[m] = in[i+m];
       flag = count;
      }
      break;
     }

   }

  }
}

void main(void)
{
 char input[]="aaaadcdcdsccccccc" ;
 int len = strlen(input);
 char output[200]={0};
 find(input, len, output);
 printf("%s\n",output);
}

  评论这张
 
阅读(835)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017