天天看點

leetcode65-有效數字

leetcode65-有效數字
leetcode65-有效數字
bool isnumber(char a)
{
    int value=a-'0';
    if(value>=0&&value<=9)
       return true;
    else
       return false;
}
bool isinterger(char *s)//判斷是否為帶符号整數
{//小數點左邊部分不能為空
  //第一位可以為符号 
  //除符号外必須有數字
    int i=0;
    int len=strlen(s);
    int flag=0;
    if(len==0)
      return false;
    if(s[0]=='+'||s[0]=='-')
      flag=1;
    if(flag==1&&len==1)
      return false;
    if(flag!=1&&!isnumber(s[0]))
      return false;
    for(i=1;i<len;i++)
    {
        if(!isnumber(s[i]))
           return false;
    }
    return true;
}
bool isuninterger(char *s)//判斷是否是無符号整數
{
    int i=0;
     int len=strlen(s);
     if(len==0)
        return true;
    for(i=0;i<len;i++)
    {
        if(!isnumber(s[i]))
           return false;
    }
    return true;
}
int isfirst(char*s,char a)
{
    int i=0;
    int len=strlen(s);
    for(i=0;i<len;i++)
    {
        if(s[i]==a)
          return i;
    }
    return -1;
}
bool isfloat(char *s)
{
    int index=0;
    int len=strlen(s);
    char *left=(char*)malloc(sizeof(char)*10000);
    char *right=(char*)malloc(sizeof(char)*10000);
    int flag1=0;
    int flag2=0;
    if(!strchr(s,'.'))
       return false;
    index=isfirst(s,'.');//擷取到.的位置
    printf("index=%d ",index);
    if(index!=0)
    {
       strncpy(left, s, index);
       left[index]='\0';
    }
    else 
       flag1=1;
    if(index!=len-1)
    {
        strncpy(right, s+(index+1),len-(index+1));
        right[len-(index+1)]='\0';
    }
    else
    {
       printf("****");
       flag2=1;
    }
    if(flag1==1&&flag2==1)
       return false;
    if((strlen(left)==1&&(left[0]=='+'||left[0]=='-'))&&flag2==1)
       return false;
    printf("flag1==1 %d\n",flag1==1);
    printf("isinterger(left)%d\n",isinterger(left));
    printf("flag2==1%d\n",flag2==1);
    printf("isuninterger(right)%d\n",isuninterger(right));
    printf("%s\n",right);
    if((strlen(left)==1)&&(left[0]=='+'||left[0]=='-')&&isuninterger(right))
        return true;
    if((flag1==1||isinterger(left))&&(flag2==1||isuninterger(right)))
    {
         printf("right\n");
          return true;
    }
    return false;
    
}
bool contain_e(char*s)
{
    int index=0;
    char *left=(char*)malloc(sizeof(char)*10000);
    char *right=(char*)malloc(sizeof(char)*10000);
    int len=strlen(s);
    if(!strchr(s,'e'))//不包含e
       return false;
    index=isfirst(s,'e');//擷取到e的位置
    if(index==0||index==len-1)//e不能出現在開頭或者結尾
          return false;
    strncpy(left, s, index);
    left[index]='\0';
    strncpy(right, s+(index+1),len-(index+1));
    right[len-(index+1)]='\0';
    if((isinterger(left)||isfloat(left))&&isinterger(right))
    {
        printf("right\n");
         return true;
    }
    return false;
}
char*  removekongge(char *s)
{
    char* answer=(char*)malloc(sizeof(char)*10000);
    int len=strlen(s);
    int i=0,j=0;
    int index1=0;
    int index2=0;
    for(i=0;i<len;i++)
       if(s[i]!=' ')
       {
           index1=i;
           break;
       }
    for(i=len-1;i>=0;i--)
    {
        if(s[i]!=' ')
       {
           index2=i;
           break;
       }
    }
    strncpy(answer, s+index1, index2-index1+1);
    answer[index2-index1+1]='\0';
    return answer;
}
bool isNumber(char * s)
{
    //計算字元串s的(unsigned int型)長度,不包括'\0'在内
    int len=strlen(s);
    if(len==0)//空字元串
       return false;
    s=removekongge(s);
    printf("\"%s\"",s);
    int i=0 ;
    len=strlen(s);//計算字元串長度
    if(len==1&&!isnumber(s[0]))//如果字元串有一位的話隻能是數字
       return false;
    // if(!(s[0]=='+'||s[0]=='-'||((s[0]-'0')>=0&&(s[0]-'0')<=9)))//第一位隻能是符号或者數字
    //    return false;
    //C标準庫中的strchr函數傳回字元c在字元串s的位置
    //C語言有atoi、atol、atof等庫函數,可分别把ASCII編碼的字元串轉化為int、long、float類型的數字
    //char *strncpy(char *dest, const char *src, int n),表示把src所指向的字元串中以src位址
    //開始的前n個位元組複制到dest所指的數組中,并傳回被複制後的dest。
    if(contain_e(s))//如果該數字包含e
       return true;
    else if(isfloat(s))//如果該數字包含.
       return true;
    else if(isinterger(s))//純整數
        return true;
    return false;

}