c中的ascii字符串转换器

时间:2014-08-13 17:39:41

标签: c string ascii

在Byteland国家,一个字符串" S"当且仅当字符串中每个字符的数量等于其ascii值时,才称超级ascii字符串。

在Byteland国家/地区ascii代码' a'是1,' b'是2 ...' z'是26岁。

任何字符串" S"可以通过执行添加或删除字符等操作将其转换为超级ascii字符串。

这里的任务是找出将字符串转换为super ascii string所需的最小操作次数。

  input:number of test cases 3
  bcc
  scca
 accc
 output:
  2(here b's value is 2 i have to add one b and c's value is 3 i have to add one c so        total 2)
 19
 0

我达到了这个水平 我的代码是

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

int main()
{
    int T,i,k=1;
    char j;
    char str1[100];
    printf("number of test cases");
    scanf("%d",&T);
    for(i=0;i<T;i++)
    {
        scanf("%s",str1);
    }
    for(j=97;j<123;j++)
    {
        j==k++;
    }
    return 0;
}

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

请尝试以下代码 -

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

int main()
{
        int T,i,j,k,count=0,inc=0;
        char str1[10][100];
        printf("number of test cases");
        scanf("%d",&T);
        for(i=0;i<T;i++)
        {
                scanf("%s",str1[i]);
        }
        for(i=0;i<T;i++)
        {       
                for(j=0;str1[i][j];j++)
                {
                        if(str1[i][j])
                                inc++;
                        //printf("%c\n",str1[i][j]);
                        //printf("%d %d %d\n",j,j+1,strlen(str1[i]));

                        for(k=j+1;k<strlen(str1[i]);k++){
                                if(str1[i][j] == str1[i][k]){
                                        //printf("%c %c %d\n",str1[i][j],str1[i][k],k);
                                        inc++;
                                        j=k;
                                }
                        }

                        //printf("Inc: %d\n",inc);
                        if(inc < (str1[i][j]-96))
                                count+= (str1[i][j]-96-inc);
                        //printf("Count %d\n",count);
                        inc = 0;
                }
                printf("Count for %s is %d\n",str1[i],count);
                count = 0;
        }
        return 0;
}

如果你遇到任何困难,请试着坚持下去吧!

答案 1 :(得分:0)

  1. 请勿使用97等。使用'a'

  2. 计算每个小写字母的出现次数。

  3. 评估非零数是否高于或低于预期值。

  4. char *superascii(const char *s) {
      static char buffer[(1 + 26) * 26/2 + 1];
      char *dest = buffer;
      unsigned count[26] = { 0 };
      while (*s) {
        if (*s < 'a' || *s > 'z')
          return "?";  // TBD error handling
        unsigned expect = *s - 'a' + 1;
        if (count[*s - 'a'] < expect) {
          count[*s - 'a']++;
          *dest++ = *s;
        }
        s++;
      }
      for (int letter = 'a'; letter <= 'z'; letter++) {
        unsigned cnt = count[letter - 'a'];
        if (cnt > 0) {
          unsigned expect = letter - 'a' + 1;
          while (cnt < expect) {
            cnt++;
            *dest++ = letter;
          }
        }
        *dest = '\0';
      }
      return buffer;
    }
    
    int main(void) {
      printf("%s\n", superascii("bcc"));
      printf("%s\n", superascii("scca"));
      printf("%s\n", superascii("accc"));
      return 0;
    }
    
    Output:
    bccbc
    sccacssssssssssssssssss
    accc
    

    建议在评估时形成结果字符串。将每个char从源复制到目标。 (最大目标字符串大小为1 + 2 + 3 ... + 26 + 1.)count[letter - 'a'] == expect后,不再复制该字母。复制字母后,在出现count[letter - 'a'] > 0 expect - count[letter - 'a'] letter {{1}}之后追加所需的字母。