一道华为的笔试题

时间:2021-11-14 21:00:47
华为来我们学校的考题:随机输入一个数,判断它是不是对称数(如3,121,12321,45254)。不能用字符串库函数
试试看啊:)有人认为很简单吧 可惜我做错了

68 个解决方案

#1


做一个仿字符串的类也不行吗?

#2


#include <stdio.h>
#include <string.h>
bool f(char *s)
{
   int j = strlen(s);
   int middle = 0;
   int c = 0;
   if(j%2)
middle = j/2 + 1;
else
middle = j/2;
for(; c<j; c++)
if(s[c] != s[j - c -1])
return false;
return true;
}

int main(int argc, char* argv[]) 

   int i = 0;
   printf("input number:\n");
   scanf("%d", &i);
   char s[10];
   sprintf(s, "%d", i);
   if(f(s))
   printf("yes\n");
   else
   printf("no\n");
   return 0; 

#3


不能用字符串库函数
------------------
不好意思,没有看到这个!

#4


楼主可是漂亮的研究生哦!

#5


UPCC(杂食动物) ( ) 信誉:118  2005-03-09 20:21:00  得分: 0  
 
 
   楼主可是漂亮的研究生哦!
  
 
真得假得?

吼吼

#6


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

int main(int argc, char *argv[])
{
    char str[100], *start=str, *end;
    int len;
    char tab[][20]={"It is.\n\n","It's Not.\n\n"};
    while(scanf("%s", str)!=EOF)
    {
        start = end = str;
        while(*end++);
        len = (int)end-(int)start-1;
        end-=2;
        while((*start==*end) && (start<=end))
        {
            ++start;
            --end;
        }    
        printf("%s", tab[start<end]); 
    }    
system("PAUSE");
return 0;
}

#7


楼主可是漂亮的研究生哦!
~~~~~~~~~~~~~~

研究生可能会做错这个题目?
存在可能性吗?

#8


楼主前几天发了个帖子说得很清楚,研究生,问是否去华为合适!!!
你可以搜索看看!而且也不简单了,你看到“不能用字符串库函数”,看看你自己用了没有先……

#9


#include <iostream>
#include <cstdlib>
#include <string>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;

bool foobar( int a )
{
int  b[ 4 * sizeof( int ) ] , i = 0 , j;
if( a <= 0  ) return !a;
while( a ) b[i++] = a % 10 , a /= 10; 
for( j = 0 , --i; j < i && b[i] == b[j] ; ++j , --i );
return b[i] == b[j];
}

bool foobar( const char* s )
{
RegEx regex( "\\s*-?\\d+\\s*" );
if( !regex.Match( s ) ) return false;
return foobar( atoi( s ) );
}

int main( int argc , char* argv[] )
{
if( argc == 1 )
{
string snum ; int num;
cout << "input a number : " << flush;
cin >> snum; 
cout << snum << " : " << foobar( snum.c_str() ) << endl;
}
else for( int i = 1; i < argc; ++i )
{
cout << argv[i] << " : " << foobar( argv[i] ) << endl;
}
system( "pause" );
}

#10


非递归方法:

template< typename T >
bool IsRevNum( const T& Num )
{

int nUnit = 1; // used for picking up the digit in highest place
T n = Num;
while( n /= 10 ) nUnit *= 10;

n = Num;

bool bIsRevNum = true;
T Highest, Lowest;

while( bIsRevNum && n )
{
Highest = n / nUnit; // pick up the highest place digit 
Lowest = n % 10; // pick up the lowest place digit
if( Highest == Lowest )
{
n -= Highest * nUnit; // get rid of highest didigt
n /= 10; // get rid of lowest digit
nUnit /= 100;
}
else
bIsRevNum = false;
}

return bIsRevNum;
}

#11


bzCpp:
这种方式刚才我在洗澡的时候也想过,但觉得不比这样麻烦的,好象我看过这样的离子,是使用取反或者以为移位的,马上就解决了!我现在在回忆中。。。。

#12


不好,
我用了scanf("%s",..);
还有printf( );
还有system( );
别的函数就没有了吧。
不知道算不算字符串函数。

如果输入的数比如说是
1234567891011110198765432112345678910111101987654321
不可能用整形了吧,
只能用字符串了

#13


UPCC(杂食动物) :
    已经很简单了啊,一共才5行代码啊,效率也还好啊O(ln(N)),感觉取反或移位应该很难。

#14


#include<stdio.h>
void main()
{
char ch;
char str[10];
char *s=str;
char *t=str;
int flag=0;
printf("input a integer:\n");
scanf("%s",str);

while(ch=*s)
{
if(ch<'0' || ch>'9')
{
printf("Wrong input");
return;
}
s++;
}
s--;
while(s>t)
{
if(*s!=*str)
flag=1;
s--;
t++;
}
if(flag)
printf("NO");
else
printf("YES");
return;
}

#15


bzCpp:
帖子一上网页看起来就比较多!呵呵,我看别人代码的时候总喜欢帖到vc上看!

#16


哪贴一个短的,其它的只是用来输入并判断输入是否合法地嘛,咔咔:

bool foobar( int a )
{
int  b[ 4 * sizeof( int ) ] , i = 0 , j;
if( a <= 0  ) return !a;
while( a ) b[i++] = a % 10 , a /= 10; 
for( j = 0 , --i; j < i && b[i] == b[j] ; ++j , --i );
return b[i] == b[j];
}

#17


试一下,我不知道负数是不是对称数,还有初始化多少空间接收输入字符串,特郁闷

#include <stdio.h>

bool isValid(char * c,int length){
    int beg=0,end=length-1;
    for(;c[beg]==c[end]&&beg<end;beg++,end--);
    return c[beg]==c[end];
}

int main(){
    char in[50];
    int length=0;
    do{        
        printf("input:");
        scanf("%s",&in);
        while(in[length]>='0'&&in[length]<='9')length++;
        if(in[length]!='\0'){
            length=0;
            continue;
        }else{
            break;
        }
    }while(true);
    printf("%s",isValid(in,length)==true?"OK":"KO");
    return 0;
}

#18


负数当然不是了,
那个负号在后面不会出现第二次

#19


bool test(char * input)
{
char * p1, * p2;
p1 = input;
p2 = input;
int size = 0;
while(*p1++)size++;
for(int i=0;i<size/2;i++)
{
if(input[size-i-1] != p2[i])
{
return false;
}
}
return true;
}

#20


。。。。。。。。。。。
up!

#21


先读去长度,在取中点,直接比较中点两边是否全相同不就得了
嘿嘿

#22


回文算法
#include<stdio.h>
#include<malloc.h>
int HuiWen(char *p,int len)
{
  for(int i = 0;i<len/2;i++)
   {
     if(p[i]!=p[len-1-i]) return 0;
    }
   return 1;
}
void main()
{
  char *p;int n;
  printf("please input the length of the string:\n");
  scanf("%d",&n);
  p = (char*) malloc(n+1);
  printf("please input the string:\n");
  gets(p);
  if(HuiWen(*p,n))
   {printf("%s is HuiWen");}
  else
  {printf("Not");}
}

#23


用堆栈和队列
bool SymStringsMatch()
//P24-3.17,严蔚敏、吴伟民,《C语言版数据结构题集》,1999.2
{
SqStack S;
SqQueue Q;
SElemType se;
QElemType qe;
char c;
bool bRes = false;

InitStack(S);
InitQueue(Q);
cout << "Input Symmetric or Asymmetric string:" << endl;
c = getchar();
while (c != '@' && c != '&') {Push(S, c); c = getchar();}
if (c == '&')
{
c = getchar();
while (c != '@') {EnQueue(Q, c); c = getchar();}
while (!StackEmpty(S) && !QueueEmpty(Q))
{
Pop(S, se); DeQueue(Q, qe);
if (se != qe) break;
}
if (StackEmpty(S) && QueueEmpty(Q)) bRes = true;
}

return bRes;
}

#24


bool isvalid(const char *str)
{
char *head = str;
char *tail = str;

// 跳到最后
while (*tail) ++tail;
// 比较
while (*head++ == *tail--) ;
// 
return (head > tail);
}

#25


写错了,在帖
int isvalid(const char *str)
{
char *head = str;
char *tail = str;

// 跳到最后
while (*tail) ++tail;
//
while ( (*head == *tail) && (*head) )
{
// 校验数字
if ( '9' < *head || *head < '0') return false;
if (head == tail) return true;

++head;
// 相差1
if ((*head - *tail) == 1)
--tail;
else
return false;
}
//
return false;
}

#26


bzCpp 的方法好
虽然有的没有用库  但是我不知道题目的意思是不是只能把它当整形,比如实参来自一个整数。否则的话123321与 abccba没有区别 
其实可以先作为整形输入,再判断位数(这个不难,跟10的幂比较大小),比如得位数n
用n/(10的n-1次幂) 得最高位数字数值。n--
比较即可
效率我觉得比较高。

#27


用C语言可实现如下:
#define N 100  /*数组的大小,可根据输入位数的大小调节*/
main()
{ char a[N];int i,j,n,flag=0;
  scanf("%s",a);
  for(i=0;a[i]!='\0';i++);   /*统计输入数字的位数*/
  n=i;                       /*用n表示输入数字的位数*/
  for(i=0,j=n-1;i<n/2;i++,j--)   /*用一个循环,使数字的头尾分别相等,用变量flag作为标志*/
     if(a[i]!=a[j])
 { flag=1; break; }
  printf("%s",a);
  if(flag==0) printf("是对称数\n");
  else printf("不是对称数\n");
}

#28


太晚了,要睡觉了,有时间帮纠正纠正,算法烂死了,是个傻叉算法,没想到还不对,索引也有误,导致运行错误,正是不能活了~~
基本思路是这样的,MyStr将一个数弄成单个数组成的数组,如int* p = new int[3]; *p = 1;*(p+1)=2,*(p+3) = 4,其中124这个数断成了1,2,4存放在p指向的数组中

#include<assert.h>
#include<iostream>

using namespace std;

class MyStr
{
public:
MyStr(long val)
   { 
 long n = val/10;
 
 long temp = 0;
     
     long n1 = n;
     long val1 = val;
 static int count = 0;
     
 for(long i=0; i<=n; i++)
 {
   if( ( temp = (val-10*i) ) < 10 )
   {
     
         
 count++;
         
 for(int k1=1; k1<=n; k1++)
 {
           if( Muti(10,k1) > val && Muti(10,k1-1)<= val)
   {
       val -= Muti(10,k1-1)*temp;

   }
 }

 i = 0;

 n /= 10;
                          
   }
      
   else
     continue;
 }
    
 pIntArr = new int[count];

 _count = count;
     
 for(long i1=0; i1<=n1; i1++)
 {
   if( ( temp = (val1 - 10*i1) ) <10 )
   {
     
 *(pIntArr++) = temp;
 
 for(int k1=1; k1<=n1; k1++)
 {
           if( Muti(10,k1) > val1 && Muti(10,k1-1)<= val1)
   {
       val1 -= Muti(10,k1-1)*temp;

   }
 }

 i1 = 0;

 n1 /= 10;
                          
   }
      
   else
     continue;
 }     
      
   
   }
    
int Count()
{
 return _count;
}

static long Muti(long lobj,int n)
{
 long result = 1;

 for(int k1=0; k1<n; k1++)
 result *= lobj;
     
 return result;
}

~MyStr()
{
 delete[] pIntArr;
}

   int operator[](int index)
   {
       assert( index>=0 && index < _count);
   
   return *(pIntArr+index);
   }

private:
   int* pIntArr;

   int _count;
};

class Data
{
public:
Data(long val = 0) : mystrObj(val)
{
}

    bool IsSymmetry()
{
 
 //int* p = mystrObj.Get();
     cout<<mystrObj.Count()<<endl;

 if( mystrObj.Count() % 2 == 0 )
          return false;
     
 int i = 0;

 int j = mystrObj.Count() - 1;

     while(1)
 {

if(i==j)
           break;
if( mystrObj[i++] != mystrObj[j--] )
                             return false;                   


 }

 return true;
}

private:
MyStr mystrObj;
};

void main()
{
 Data d(1222);

 cout<<d.IsSymmetry()<<endl;


}

#29


回复人: UPCC(杂食动物) ( ) 信誉:118 
if(j%2)
middle = j/2 + 1;
else
middle = j/2;
for(; c<j; c++)
if(s[c] != s[j - c -1])  //看看这!中间middle都没用上!
return false;
return true;
这段代码有问题没?

#30


不知道这段代码行不行,绝对没用库函数的!
int main(int argc,char *argv[])
{
    char *r[1]=argv[1];         //将主函数参数做为输入值! 
    int i=-1;
    for(;*r!='/o';++i)
        ++r;
    r=r-i-1;
    for(int j=0;j<=i/2;++j) //不管数据长度为偶数还是奇数! 
    {                      //也就是不管i/2的模为0还是1, 
        if(r[j]!=r[i-j])  //因为我们不用考虑最中间那个数! 
            return false;
    }
    return true;        //不能用函数库,我不知怎么来输入出比较结果!
}  

请大家一起来讨论!

#31


噢!上面语法有点问题,
大家来修改一下!

#32


很多年没见过TC了,回忆着写一下不知行不行:
void main()
{
  char ch[256];
  int tatolnum=0;
  bool yes=true;
  for(;;tatolnum++)
  {
     ch[tatolnum]=getch();
     if(ch[tatolnum]==13)/*回车*/
      {
        tatolnum--;
        break;
      }
   }
   for(int i=0;i<tatolnum/2;i++
   {
      if(ch[i]!=ch[tatolnum-i])
     {
       yes=false;
       break;
      }
   }
   if(yes)
     printf("yes");
   else
     printf("no");
}

#33


不是不让用字符串库函数吗,设个指针,逐个把字符串读完,直到‘\0’,读的次数就是字符串长度,不就得到strlen()了吗?

#34


int regard(char * c)
{   
    int  n=0,i=0;
    char x;
    for(;c!='\0';c++)
     {
      n++;
      x=--c;
      }
    for(;i<n/2;i++)
     {
       if(!(* c)^(* x))  return 0;
       else
          {c++; x--;}
      }
     return 1
}
用异或的方法会快一点吧       

#35


晕倒
为什么都是程序  没有算法
cow cow.......
那起来就是程序
晕倒
,,,
pp的研究生
呀呀
。。。

#36


不好意思
char x;改成char * x;

#37


for(;c!='\0';c++)              for(;c!='\0';c++)
     {                             {
      n++;            ==>              n++
      x=--c;                        }
    }                           x=--c;

#38


算法,把这个数颠导看是不是和原来那个相等。相等就OK了

#39


这个是数据结构里面的例子啊 就用堆栈和队列很容易的啊!

#40


同意楼上的说法

#41


如果连这种题目你都做错,或者没有思路的话,我的建议是转行,做程序员会把你给郁闷死的,超级简单的题目

#42


题是很简单,我想华为的人也不是笨蛋,如何设计一种高效的算法才是本意

#43


看看高手们的回答!

#44


首先谢谢大家的回帖!谢谢你们给我的启发。

回pcboyxhy(-273.15℃):研究生会做错这样的题,有这样的可能性。我就是一个典型。对编程还是一个很糟糕的研究生。


回UPCC(杂食动物) :我不知道我不知道我算不算是一个漂亮的研究生,只是别人说我漂亮。我一直以为漂亮或者美丽不仅仅在于那张脸,还要看这个人是否善良,是不是很有修养,她是不是很受大家喜欢,是不是很有气质,是不是很有内涵。。。人的相貌是父母给的,我们不能改变,但是,有很多因素是我们可以让自己漂亮的,我希望自己变得更好。

这道题是我在最后10分钟做的,因为是最后一道,15分,我用双向链表实现的,些的有些乱,出来后感觉很不好。 
刚才看了大家的回帖,得到很多启发,再次谢谢你们!

也许太阳女孩不是一个好的研究生吧,不过两年以后会是,我相信自己!
希望大家给我加油!

#45


楼猪MM应聘华为的什么职位?

#46


好可爱的楼猪MM,
要是让我在宿舍里养这么头猪MM多好阿

#47


女人只要不做坏事就已经很PP了,
......................


#48


呵呵,收着,学习~

#49


pcboyxhy(-273.15℃) 
好可爱的楼猪MM,
要是让我在宿舍里养这么头猪MM多好阿
------------------
你或许是一个编程高手,或者在某个知名公司担任高职,但是说实话,我觉得你挺可悲的 
连对他人起码的尊重都不懂。
如果你觉得一个人不好,你可以保持沉默,但是不要伤害别人的自尊,谢谢

#50


我当时去华为的笔试也考了这道题.

#1


做一个仿字符串的类也不行吗?

#2


#include <stdio.h>
#include <string.h>
bool f(char *s)
{
   int j = strlen(s);
   int middle = 0;
   int c = 0;
   if(j%2)
middle = j/2 + 1;
else
middle = j/2;
for(; c<j; c++)
if(s[c] != s[j - c -1])
return false;
return true;
}

int main(int argc, char* argv[]) 

   int i = 0;
   printf("input number:\n");
   scanf("%d", &i);
   char s[10];
   sprintf(s, "%d", i);
   if(f(s))
   printf("yes\n");
   else
   printf("no\n");
   return 0; 

#3


不能用字符串库函数
------------------
不好意思,没有看到这个!

#4


楼主可是漂亮的研究生哦!

#5


UPCC(杂食动物) ( ) 信誉:118  2005-03-09 20:21:00  得分: 0  
 
 
   楼主可是漂亮的研究生哦!
  
 
真得假得?

吼吼

#6


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

int main(int argc, char *argv[])
{
    char str[100], *start=str, *end;
    int len;
    char tab[][20]={"It is.\n\n","It's Not.\n\n"};
    while(scanf("%s", str)!=EOF)
    {
        start = end = str;
        while(*end++);
        len = (int)end-(int)start-1;
        end-=2;
        while((*start==*end) && (start<=end))
        {
            ++start;
            --end;
        }    
        printf("%s", tab[start<end]); 
    }    
system("PAUSE");
return 0;
}

#7


楼主可是漂亮的研究生哦!
~~~~~~~~~~~~~~

研究生可能会做错这个题目?
存在可能性吗?

#8


楼主前几天发了个帖子说得很清楚,研究生,问是否去华为合适!!!
你可以搜索看看!而且也不简单了,你看到“不能用字符串库函数”,看看你自己用了没有先……

#9


#include <iostream>
#include <cstdlib>
#include <string>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;

bool foobar( int a )
{
int  b[ 4 * sizeof( int ) ] , i = 0 , j;
if( a <= 0  ) return !a;
while( a ) b[i++] = a % 10 , a /= 10; 
for( j = 0 , --i; j < i && b[i] == b[j] ; ++j , --i );
return b[i] == b[j];
}

bool foobar( const char* s )
{
RegEx regex( "\\s*-?\\d+\\s*" );
if( !regex.Match( s ) ) return false;
return foobar( atoi( s ) );
}

int main( int argc , char* argv[] )
{
if( argc == 1 )
{
string snum ; int num;
cout << "input a number : " << flush;
cin >> snum; 
cout << snum << " : " << foobar( snum.c_str() ) << endl;
}
else for( int i = 1; i < argc; ++i )
{
cout << argv[i] << " : " << foobar( argv[i] ) << endl;
}
system( "pause" );
}

#10


非递归方法:

template< typename T >
bool IsRevNum( const T& Num )
{

int nUnit = 1; // used for picking up the digit in highest place
T n = Num;
while( n /= 10 ) nUnit *= 10;

n = Num;

bool bIsRevNum = true;
T Highest, Lowest;

while( bIsRevNum && n )
{
Highest = n / nUnit; // pick up the highest place digit 
Lowest = n % 10; // pick up the lowest place digit
if( Highest == Lowest )
{
n -= Highest * nUnit; // get rid of highest didigt
n /= 10; // get rid of lowest digit
nUnit /= 100;
}
else
bIsRevNum = false;
}

return bIsRevNum;
}

#11


bzCpp:
这种方式刚才我在洗澡的时候也想过,但觉得不比这样麻烦的,好象我看过这样的离子,是使用取反或者以为移位的,马上就解决了!我现在在回忆中。。。。

#12


不好,
我用了scanf("%s",..);
还有printf( );
还有system( );
别的函数就没有了吧。
不知道算不算字符串函数。

如果输入的数比如说是
1234567891011110198765432112345678910111101987654321
不可能用整形了吧,
只能用字符串了

#13


UPCC(杂食动物) :
    已经很简单了啊,一共才5行代码啊,效率也还好啊O(ln(N)),感觉取反或移位应该很难。

#14


#include<stdio.h>
void main()
{
char ch;
char str[10];
char *s=str;
char *t=str;
int flag=0;
printf("input a integer:\n");
scanf("%s",str);

while(ch=*s)
{
if(ch<'0' || ch>'9')
{
printf("Wrong input");
return;
}
s++;
}
s--;
while(s>t)
{
if(*s!=*str)
flag=1;
s--;
t++;
}
if(flag)
printf("NO");
else
printf("YES");
return;
}

#15


bzCpp:
帖子一上网页看起来就比较多!呵呵,我看别人代码的时候总喜欢帖到vc上看!

#16


哪贴一个短的,其它的只是用来输入并判断输入是否合法地嘛,咔咔:

bool foobar( int a )
{
int  b[ 4 * sizeof( int ) ] , i = 0 , j;
if( a <= 0  ) return !a;
while( a ) b[i++] = a % 10 , a /= 10; 
for( j = 0 , --i; j < i && b[i] == b[j] ; ++j , --i );
return b[i] == b[j];
}

#17


试一下,我不知道负数是不是对称数,还有初始化多少空间接收输入字符串,特郁闷

#include <stdio.h>

bool isValid(char * c,int length){
    int beg=0,end=length-1;
    for(;c[beg]==c[end]&&beg<end;beg++,end--);
    return c[beg]==c[end];
}

int main(){
    char in[50];
    int length=0;
    do{        
        printf("input:");
        scanf("%s",&in);
        while(in[length]>='0'&&in[length]<='9')length++;
        if(in[length]!='\0'){
            length=0;
            continue;
        }else{
            break;
        }
    }while(true);
    printf("%s",isValid(in,length)==true?"OK":"KO");
    return 0;
}

#18


负数当然不是了,
那个负号在后面不会出现第二次

#19


bool test(char * input)
{
char * p1, * p2;
p1 = input;
p2 = input;
int size = 0;
while(*p1++)size++;
for(int i=0;i<size/2;i++)
{
if(input[size-i-1] != p2[i])
{
return false;
}
}
return true;
}

#20


。。。。。。。。。。。
up!

#21


先读去长度,在取中点,直接比较中点两边是否全相同不就得了
嘿嘿

#22


回文算法
#include<stdio.h>
#include<malloc.h>
int HuiWen(char *p,int len)
{
  for(int i = 0;i<len/2;i++)
   {
     if(p[i]!=p[len-1-i]) return 0;
    }
   return 1;
}
void main()
{
  char *p;int n;
  printf("please input the length of the string:\n");
  scanf("%d",&n);
  p = (char*) malloc(n+1);
  printf("please input the string:\n");
  gets(p);
  if(HuiWen(*p,n))
   {printf("%s is HuiWen");}
  else
  {printf("Not");}
}

#23


用堆栈和队列
bool SymStringsMatch()
//P24-3.17,严蔚敏、吴伟民,《C语言版数据结构题集》,1999.2
{
SqStack S;
SqQueue Q;
SElemType se;
QElemType qe;
char c;
bool bRes = false;

InitStack(S);
InitQueue(Q);
cout << "Input Symmetric or Asymmetric string:" << endl;
c = getchar();
while (c != '@' && c != '&') {Push(S, c); c = getchar();}
if (c == '&')
{
c = getchar();
while (c != '@') {EnQueue(Q, c); c = getchar();}
while (!StackEmpty(S) && !QueueEmpty(Q))
{
Pop(S, se); DeQueue(Q, qe);
if (se != qe) break;
}
if (StackEmpty(S) && QueueEmpty(Q)) bRes = true;
}

return bRes;
}

#24


bool isvalid(const char *str)
{
char *head = str;
char *tail = str;

// 跳到最后
while (*tail) ++tail;
// 比较
while (*head++ == *tail--) ;
// 
return (head > tail);
}

#25


写错了,在帖
int isvalid(const char *str)
{
char *head = str;
char *tail = str;

// 跳到最后
while (*tail) ++tail;
//
while ( (*head == *tail) && (*head) )
{
// 校验数字
if ( '9' < *head || *head < '0') return false;
if (head == tail) return true;

++head;
// 相差1
if ((*head - *tail) == 1)
--tail;
else
return false;
}
//
return false;
}

#26


bzCpp 的方法好
虽然有的没有用库  但是我不知道题目的意思是不是只能把它当整形,比如实参来自一个整数。否则的话123321与 abccba没有区别 
其实可以先作为整形输入,再判断位数(这个不难,跟10的幂比较大小),比如得位数n
用n/(10的n-1次幂) 得最高位数字数值。n--
比较即可
效率我觉得比较高。

#27


用C语言可实现如下:
#define N 100  /*数组的大小,可根据输入位数的大小调节*/
main()
{ char a[N];int i,j,n,flag=0;
  scanf("%s",a);
  for(i=0;a[i]!='\0';i++);   /*统计输入数字的位数*/
  n=i;                       /*用n表示输入数字的位数*/
  for(i=0,j=n-1;i<n/2;i++,j--)   /*用一个循环,使数字的头尾分别相等,用变量flag作为标志*/
     if(a[i]!=a[j])
 { flag=1; break; }
  printf("%s",a);
  if(flag==0) printf("是对称数\n");
  else printf("不是对称数\n");
}

#28


太晚了,要睡觉了,有时间帮纠正纠正,算法烂死了,是个傻叉算法,没想到还不对,索引也有误,导致运行错误,正是不能活了~~
基本思路是这样的,MyStr将一个数弄成单个数组成的数组,如int* p = new int[3]; *p = 1;*(p+1)=2,*(p+3) = 4,其中124这个数断成了1,2,4存放在p指向的数组中

#include<assert.h>
#include<iostream>

using namespace std;

class MyStr
{
public:
MyStr(long val)
   { 
 long n = val/10;
 
 long temp = 0;
     
     long n1 = n;
     long val1 = val;
 static int count = 0;
     
 for(long i=0; i<=n; i++)
 {
   if( ( temp = (val-10*i) ) < 10 )
   {
     
         
 count++;
         
 for(int k1=1; k1<=n; k1++)
 {
           if( Muti(10,k1) > val && Muti(10,k1-1)<= val)
   {
       val -= Muti(10,k1-1)*temp;

   }
 }

 i = 0;

 n /= 10;
                          
   }
      
   else
     continue;
 }
    
 pIntArr = new int[count];

 _count = count;
     
 for(long i1=0; i1<=n1; i1++)
 {
   if( ( temp = (val1 - 10*i1) ) <10 )
   {
     
 *(pIntArr++) = temp;
 
 for(int k1=1; k1<=n1; k1++)
 {
           if( Muti(10,k1) > val1 && Muti(10,k1-1)<= val1)
   {
       val1 -= Muti(10,k1-1)*temp;

   }
 }

 i1 = 0;

 n1 /= 10;
                          
   }
      
   else
     continue;
 }     
      
   
   }
    
int Count()
{
 return _count;
}

static long Muti(long lobj,int n)
{
 long result = 1;

 for(int k1=0; k1<n; k1++)
 result *= lobj;
     
 return result;
}

~MyStr()
{
 delete[] pIntArr;
}

   int operator[](int index)
   {
       assert( index>=0 && index < _count);
   
   return *(pIntArr+index);
   }

private:
   int* pIntArr;

   int _count;
};

class Data
{
public:
Data(long val = 0) : mystrObj(val)
{
}

    bool IsSymmetry()
{
 
 //int* p = mystrObj.Get();
     cout<<mystrObj.Count()<<endl;

 if( mystrObj.Count() % 2 == 0 )
          return false;
     
 int i = 0;

 int j = mystrObj.Count() - 1;

     while(1)
 {

if(i==j)
           break;
if( mystrObj[i++] != mystrObj[j--] )
                             return false;                   


 }

 return true;
}

private:
MyStr mystrObj;
};

void main()
{
 Data d(1222);

 cout<<d.IsSymmetry()<<endl;


}

#29


回复人: UPCC(杂食动物) ( ) 信誉:118 
if(j%2)
middle = j/2 + 1;
else
middle = j/2;
for(; c<j; c++)
if(s[c] != s[j - c -1])  //看看这!中间middle都没用上!
return false;
return true;
这段代码有问题没?

#30


不知道这段代码行不行,绝对没用库函数的!
int main(int argc,char *argv[])
{
    char *r[1]=argv[1];         //将主函数参数做为输入值! 
    int i=-1;
    for(;*r!='/o';++i)
        ++r;
    r=r-i-1;
    for(int j=0;j<=i/2;++j) //不管数据长度为偶数还是奇数! 
    {                      //也就是不管i/2的模为0还是1, 
        if(r[j]!=r[i-j])  //因为我们不用考虑最中间那个数! 
            return false;
    }
    return true;        //不能用函数库,我不知怎么来输入出比较结果!
}  

请大家一起来讨论!

#31


噢!上面语法有点问题,
大家来修改一下!

#32


很多年没见过TC了,回忆着写一下不知行不行:
void main()
{
  char ch[256];
  int tatolnum=0;
  bool yes=true;
  for(;;tatolnum++)
  {
     ch[tatolnum]=getch();
     if(ch[tatolnum]==13)/*回车*/
      {
        tatolnum--;
        break;
      }
   }
   for(int i=0;i<tatolnum/2;i++
   {
      if(ch[i]!=ch[tatolnum-i])
     {
       yes=false;
       break;
      }
   }
   if(yes)
     printf("yes");
   else
     printf("no");
}

#33


不是不让用字符串库函数吗,设个指针,逐个把字符串读完,直到‘\0’,读的次数就是字符串长度,不就得到strlen()了吗?

#34


int regard(char * c)
{   
    int  n=0,i=0;
    char x;
    for(;c!='\0';c++)
     {
      n++;
      x=--c;
      }
    for(;i<n/2;i++)
     {
       if(!(* c)^(* x))  return 0;
       else
          {c++; x--;}
      }
     return 1
}
用异或的方法会快一点吧       

#35


晕倒
为什么都是程序  没有算法
cow cow.......
那起来就是程序
晕倒
,,,
pp的研究生
呀呀
。。。

#36


不好意思
char x;改成char * x;

#37


for(;c!='\0';c++)              for(;c!='\0';c++)
     {                             {
      n++;            ==>              n++
      x=--c;                        }
    }                           x=--c;

#38


算法,把这个数颠导看是不是和原来那个相等。相等就OK了

#39


这个是数据结构里面的例子啊 就用堆栈和队列很容易的啊!

#40


同意楼上的说法

#41


如果连这种题目你都做错,或者没有思路的话,我的建议是转行,做程序员会把你给郁闷死的,超级简单的题目

#42


题是很简单,我想华为的人也不是笨蛋,如何设计一种高效的算法才是本意

#43


看看高手们的回答!

#44


首先谢谢大家的回帖!谢谢你们给我的启发。

回pcboyxhy(-273.15℃):研究生会做错这样的题,有这样的可能性。我就是一个典型。对编程还是一个很糟糕的研究生。


回UPCC(杂食动物) :我不知道我不知道我算不算是一个漂亮的研究生,只是别人说我漂亮。我一直以为漂亮或者美丽不仅仅在于那张脸,还要看这个人是否善良,是不是很有修养,她是不是很受大家喜欢,是不是很有气质,是不是很有内涵。。。人的相貌是父母给的,我们不能改变,但是,有很多因素是我们可以让自己漂亮的,我希望自己变得更好。

这道题是我在最后10分钟做的,因为是最后一道,15分,我用双向链表实现的,些的有些乱,出来后感觉很不好。 
刚才看了大家的回帖,得到很多启发,再次谢谢你们!

也许太阳女孩不是一个好的研究生吧,不过两年以后会是,我相信自己!
希望大家给我加油!

#45


楼猪MM应聘华为的什么职位?

#46


好可爱的楼猪MM,
要是让我在宿舍里养这么头猪MM多好阿

#47


女人只要不做坏事就已经很PP了,
......................


#48


呵呵,收着,学习~

#49


pcboyxhy(-273.15℃) 
好可爱的楼猪MM,
要是让我在宿舍里养这么头猪MM多好阿
------------------
你或许是一个编程高手,或者在某个知名公司担任高职,但是说实话,我觉得你挺可悲的 
连对他人起码的尊重都不懂。
如果你觉得一个人不好,你可以保持沉默,但是不要伤害别人的自尊,谢谢

#50


我当时去华为的笔试也考了这道题.