标题:怎们编写这个C语言程序
只看楼主
Sandy143
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-3-23
结帖率:66.67%
已结贴  问题点数:10 回复次数:24 
怎们编写这个C语言程序
问题描述
  Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
搜索更多相关主题的帖子: 英文字母 区分大小写 C语言 单词 
2015-03-23 22:19
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
#include<stdio.h>
#include<string.h>
char a[26],A[26];
int countm[26],countn[26];
int Anagrams(char *s,char *t)
{
    for(int i=0;i<26;i++){countm[i]=0;countn[i]=0;}
    for(int i=0;s[i];i++)
        for(int j=0;j<26;j++){
            if(s[i]==a[j]||s[i]==A[j])countm[j]++;
            if(t[i]==a[j]||t[i]==A[j])countn[j]++;
        }
    for(int i=0;i<26;i++)
    if(countm[i]!=countn[i])return 0;
    else return 1;
}
int main()
{
    char *s="Unclear",*t="Nuclear";
    for(int i=0;i<26;i++)
    {
        a[i]='a'+i;
        A[i]='A'+i;
    }
      if(Anagrams(s,t))printf("%s和%s有Anagrams特性",s,t);
      else  printf("%s和%s没有Anagrams特性",s,t);
}

剑栈风樯各苦辛,别时冰雪到时春
2015-03-24 10:19
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
用消灭法,用第二个单词的字母逐个消灭第一个单词里相同的字母,如用0表示消灭,最后判断第一个单词是否为全0即可。
计数法,用第二个单词字母逐个与第一个单词比较,有相同加1,最后判断计数是否和两个单词长度是否相同即可。
2015-03-24 10:34
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
3楼消灭法是不是最后要同时要判断两个单词串的各字符为0?

剑栈风樯各苦辛,别时冰雪到时春
2015-03-24 11:08
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 4楼 林月儿
无论什么方法,首先都必须判断两个字符串长度,相同才继续的
2015-03-24 11:21
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
回复 5楼 xzlxzlxzl
懂了,请多指教

剑栈风樯各苦辛,别时冰雪到时春
2015-03-24 11:43
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
得分:0 
对啊,看到2楼的程序,一开始都没有先把长度判断,再做

编写的程序,不能改变世界,却可以改变自己...
2015-03-24 12:24
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
回复 7楼 loveClangage
按字母统计,长度怎么考虑呢?人家是新手啦。。。不要说的这么抽象

剑栈风樯各苦辛,别时冰雪到时春
2015-03-24 12:33
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
#include <stdio.h>

int Anagrams(char *s,char *t)
{
    char tmp[60]={'\0'};
    int i=0,j=0;
    int iseq;
    while((tmp[i]=t[i])!='\0') i++;//不是必要,只为不破坏t,也可用串复制函数
    i=0;
    while(s[i]!='\0') //遍历s
    {
      
      j=i;//改变遍历tmp起始点,缩小遍历范围
      iseq=0;//字符相同标志
      while(tmp[j]!='\0')//遍历tmp
      {
       if((s[i]==tmp[j])||(s[i]-tmp[j]==32)||(s[i]-tmp[j]==-32))//判断
       {
           iseq=1;//相同置1
        tmp[j]=tmp[i];//起始点覆盖找到的相同字符,维持tmp遍历范围都是没有被找到的字符
           break;//找到一个即停止遍历tmp
       }
        j++;
      }
    if(iseq==0) return 0;//遍历tmp没有找到s[i]字符,可判定s与t 不符,结束程序
   
    i++;
    }
    return 1;
}
int main()//测试
{
    printf("s=juyJH,  t=juyjh %d\n",Anagrams("juyJH","juyjh"));
    printf("s=juyJH,  t=juyj %d\n",Anagrams("juyJH","juyj"));
    printf("s=asdfg,  t=ASDFG %d\n",Anagrams("asdfg","ASDFG"));
    printf("s=juAJH,  t=jubjh %d\n",Anagrams("juAJH","jubjh"));
    return 0;
}

[ 本帖最后由 jklqwe111 于 2015-3-28 20:33 编辑 ]
2015-03-24 15:27
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
得分:10 
程序代码:
# include <stdio.h>
# include <string.h>

int Long(const char*str1,const char *str2);     
void Sort (char*str);

int main(void)
{
    
    char str1[80]="Rimon";
    char str2[80]="MinOR";     
    if(Long(str1,str2))   //长度一样吗? 
      {
          strupr(str1);    //二者全部转化为大写字符
        strupr(str2);   //二者全部转化为大写字符
          Sort(str1);      //排序 
        Sort(str2);      //排序 
        
        if(!strcmp(str1,str2))    //比较 
           printf(" is  Anagrams!\n");
                 
        
      }
    
    
    
    return 0;
}

int Long(const char*str1,const char *str2)
{
    
     if(strlen(str1)==strlen(str2))
         return 1;
    else return 0;
    
    
}


void Sort (char*str)
{
    
    char  t;
    int len=strlen(str);
    int i,j;
    
    for(i=0;i<len-1;i++)
     for(j=0;j<len-1-i;j++)
      if(*(str+j)>*(str+j+1))
       {
            t=*(str+j);
            *(str+j)=*(str+j+1);
            *(str+j+1)=t;
           
       }
    
}

你醒了?快起来敲代码!!
2015-03-24 16:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442998-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.110176 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved