请登陆或者注册新用户 用户名 密码 记住密码 注册新用户

回 帖 快速回帖 发 新 帖 刷新版面
主题:第58次编程比赛题目——简单猜数字

作者:雨中飞燕

专家分:18980

级别:95级别:95级别:95级别:95级别:95级别:95级别:95级别:95级别:95级别:95

发表时间:2007-7-28 18:51:00    本帖已结帖!
楼主
题目描述:
猜数字游戏大家玩过没?经典的规则是给出一个四位数,然后你去猜。
如那个数是1357,你猜1234的话,就给出1A1B,这是什么意思呢?
nA表示有n个数的位置猜对了,nB表示有n个数猜对了,但位置不对,
如果你再猜2351当然给出2A1B了,如果你猜2468,那就是0A0B了。
现在,把四位数扩展到n位,由数字扩展到字符,输入两个字符串,你
判断出猜对位置的和猜对了但位置不对的。如abcdefg和aceg123,结
果就是1A3B

输入:
多组测试数据,每组占一行,每行有两个字符串,串长小于10000,用空格分隔开

输出:
输出这两个字符串比较的结果

样例输入:
1357 1234
abcdefg aceg123
AaAa AAaa
121212 2121212211
Qq qqGame

样例输出:
1A1B
1A3B
2A2B
0A6B
1A0B

难度:very easy

要求:
只要把你完整的代码发出来即可,不要输出多余题目没有的内容

其它:
代码基本框架(仅仅作为参考,你可以不使用这个框架自己写):
//C语言
#include <stdio.h>
#define  MAX_CHAR_LEN   10001
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(scanf("%s %s",&str1, &str2) != EOF)
    {
        //这里写你的计算代码
    }
    return 0;
}

//C++语言
#include <iostream>
using namespace std;
const int MAX_CHAR_LEN = 10001;
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(cin>>str1>>str2)
    {
        //这里写你的计算代码
    }
    return 0;
}

开始时间7月28日19:00,结束时间7月30日22:00
对题目有疑问的,请到http://www.programfan.com/club/post-244340.html提出,谢谢

  最后修改于2007-7-29 10:26:00

 

签名档
by 雨中飞燕  C/C++讨论群:46520219 19472277 57751397
[size=3][b]在线评测论坛(OnlineJudge):http://yzfy.org/c[/b][/size]

作者:雨中飞燕

专家分:18980

级别:95级别:95级别:95级别:95级别:95级别:95级别:95级别:95级别:95级别:95

发表时间:2007-7-28 18:54:00   
1楼
发一个自己的code:
#include <stdio.h>
#define MAX_CHAR_LEN 10001
int main()
{
    char ch1[MAX_CHAR_LEN],ch2[MAX_CHAR_LEN];
    while(scanf("%s %s",&ch1, &ch2) != EOF)
    {
        int nct[256]={0};
        int n;
        int na=0, nb=0;
        char *cp=ch1;
        for(;*cp;cp++)
        {
            nct[*cp]++;
        }
        cp=ch2;
        for(;*cp;cp++)
        {
            if(nct[*cp])
            {
                nb++;
                nct[*cp]--;
            }
        }
        for(n=0;ch1[n]&&ch2[n];n++)
        {
            if(ch1[n]==ch2[n])
            {
                na++;
            }
        }
        printf("%dA%dB\n", na, nb-na);
    }
    return 0;
}

  最后修改于2007-7-28 18:55:00

作者:廖增祥

专家分:3930

级别:20级别:20级别:20级别:20级别:20级别:20级别:20

发表时间:2007-7-28 19:01:00   
2楼
飞燕, 这题不是做过吗?

 

作者:fisan

专家分:50

级别:1

发表时间:2007-7-28 20:14:00   
3楼
今天终于下班了...程序员的工作真的很累..做VC程序员更累...但乐在其中...
   技术是不用拿来卖弄的...不过像你们初学者也应该做这种烂题目....一个好的程序员也是从这种烂题目学习而来的..

 

作者:hyh2580

专家分:0

级别:1

发表时间:2007-7-28 23:37:00   
4楼
不知:
12121212 21
是0A2B呢还是0A8B,我的算法就是0A8B啦.
不管那么多啦
#include <stdio.h>
#define  MAX_CHAR_LEN   10001
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(scanf("%s %s",&str1, &str2) != EOF)
    {
        //这里写你的计算代码
        int a=0,b=0,i=0,j=0;
        while(*(str1+i)!='\0') 
        {
            j=0;
            while(*(str2+j)!='\0')
            {
                if(*(str1+i)==*(str2+i))
                {a++;break;}
                if(i!=j&&*(str1+i)==*(str2+j)) 
                {b++;break;}
                j++;
            }
                i++;
        }
        printf("%dA%dB\n",a,b);
    }
    return 0;
}

 

作者:redraiment

专家分:290

级别:2

发表时间:2007-7-29 0:02:00   
5楼
/*
算法用的是归并排序.
环境:VC++ 6.0
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10001

int cmp(const char *a, const char *b)
{
    return *b - *a;
}

int main(void)
{
    char    str1[SIZE];
    char    str2[SIZE];
    int    len1;
    int    len2;
    int    i;
    int    j;
    int    A;
    int    B;

    while (scanf("%s%s", str1, str2) != EOF)
    {
        len1 = strlen(str1);
        len2 = strlen(str2);
        A = B = 0;
        for (i = 0; str1[i] && str2[i]; i++)
        {
            if (str1[i] == str2[i])
            {
                A++;
                str1[i] = str2[i] = 0;
            }
        }
        qsort(str1, len1, sizeof(char), cmp);
        qsort(str2, len2, sizeof(char), cmp);
        for (i = j = 0; str1[i] && str2[j];)
        {
            if (str1[i] > str2[j])
                i++;
            else if (str1[i] < str2[j])
                j++;
            else
            {
                i++;
                j++;
                B++;
            }
        }
        printf("%dA%dB\n", A, B);
    }

    return 0;
}

 

作者:flyee

专家分:340

级别:2

发表时间:2007-7-29 11:10:00   
6楼

#include <iostream>
#include <cstring>

using namespace    std;
const int MAX_CHAR_LEN = 10001;

void solve(string str1, string str2)
{
    int a=0,b=0,marks[300];
    memset(marks,0,sizeof(marks));
    for(int i=0,len=str1.size(); i<len; i++){
        if(str1[i]==str2[i]){
            a++;
        }else{
            if(marks[str1[i]]<0){
                b++;
            }
            marks[str1[i]]++;
            if(marks[str2[i]]>0){
                b++;
            }
            marks[str2[i]]--;
        }
    }
    cout<<a<<'A'<<b<<'B'<<endl;
}

int    main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(cin>>str1>>str2)
    {
        //这里写你的计算代码
        solve(str1,str2);
    }
    return 0;
}

 

作者:merry05

专家分:8920

级别:45级别:45级别:45级别:45级别:45级别:45级别:45级别:45

发表时间:2007-7-29 12:43:00   
7楼
好久没参加了,来捧个人场
串太长可能会吃不消~~~~~

#include <stdio.h>
#include <string.h>
#define  MAX_CHAR_LEN   10001
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    int strpos1,strpos2; 
    int lenstr1,lenstr2;
    int midlenstr;
    int A_num,B_num;
    gets(str1);
    gets(str2);
    /*begin competetion programme*/
    A_num=0;
    B_num=0;
    lenstr1=strlen(str1);
    lenstr2=strlen(str2);
    midlenstr=(lenstr1>lenstr2?lenstr2:lenstr1);
    for(strpos1=0;strpos1<midlenstr;strpos1++)
        if(str1[strpos1]==str2[strpos1]) 
        {
            A_num++;
            str1[strpos1]='\0';
            str2[strpos1]='\0';
        }
    for(strpos2=0;strpos2<lenstr2;strpos2++)
    {
        if(str2[strpos2]=='\0') continue;
        for(strpos1=0;strpos1<lenstr1;strpos1++)
            if(str2[strpos2]==str1[strpos1])
            {
                B_num++;
                str1[strpos1]='\0';
                break;
            }
    }
    /*end competetion programme*/ 
    printf("%d A,%d B\n",A_num,B_num);
    return 0;
}

  最后修改于2007-7-29 12:52:00

作者:wuzsh

专家分:180

级别:1

发表时间:2007-7-29 14:26:00   
8楼

#include <iostream>
#include <list>
#include <algorithm>
#include <cstring>

using namespace std;
const int MAX_CHAR_LEN = 10001;

int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(cin>>str1>>str2)
    {
        int Sz = int(strlen(str1));
        list<char> Str1(str1, str1 + Sz);        
        list<char> Str2(str2, str2 + Sz);
        list<char>::iterator Iter1 = Str1.begin();
        list<char>::iterator Iter2 = Str2.begin();
        int A = 0;
        while(Iter1 != Str1.end() && Iter2 != Str2.end())
        {
            if(*Iter1 == *Iter2)
            {
                ++ A;
                Iter1 = Str1.erase(Iter1);
                Iter2 = Str2.erase(Iter2);
                continue;
            }
            ++ Iter1;
            ++ Iter2;
        }
        Iter1 = Str1.begin();
        int B = 0;
        while(Iter1 != Str1.end())
        {
            Iter2 = find(Str2.begin(), Str2.end(), *Iter1);
            if(Iter2 != Str2.end())
            {
                ++ B;
                Str2.erase(Iter2);
            }
            ++ Iter1;
        }
        cout << A << "A" << B << "B" << endl;
    }
    return 0;
}

 

作者:dongch007

专家分:20

级别:1

发表时间:2007-7-29 14:27:00   
9楼
想了半天,结果用最笨的方法做的.......
等着看高手的答案

#include <stdio.h>
#include <string.h>
#define  MAX_CHAR_LEN   10001
int main()
{
    int m,n,i,j,min,numA,numB;
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(scanf("%s %s",&str1, &str2) != EOF)
    {
        m=strlen(str1);
        n=strlen(str2);
        if(m<=n)    { min=m; }
        else        { min=n; }

        numA=0;
        numB=0;
        for(i=0;i<min;i++)
        {
            if(str1[i]==str2[i])    
            {
                numA++;
                for(j=i;j<m;j++)
                    str1[j]=str1[j+1];
                str1[j]='\0';
                m--;
                for(j=i;j<n;j++)
                    str2[j]=str2[j+1];
                str2[j]='\0';
                n--;
                i--;
                min--;
            }
        }

        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
                if(str1[i]==str2[j])    
                {
                    numB++;
                    break;
                }
        }

        printf("%dA%d\n",numA,numB);

    }
    return 0;
}

 

作者:杀死进程

专家分:510

级别:3级别:3

发表时间:2007-7-29 18:10:00   
10楼
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main(){    
    char rnd[10];
    char cusNum[5];
    char templ[10]={'0','1','2','3','4','5','6','7','8','9'};
    int status[4]={0};//有这个数字但位置不对则1,有数字位置也对则2;
    int i,j;
    int num;
    int posRight=0,numRight=0;
    srand((unsigned)time(NULL));

    for(i=0;i<4;++i)
        rnd[i]=templ[(int)(1+rand())%9];
    rnd[i]='\0';
    puts(rnd);
    printf("请猜数字(4位数):");
    gets(cusNum);

    for(i=0;i<4;++i){
        for(j=0;j<4;++j){
            if(cusNum[i]==rnd[j]&&i!=j)
                status[i]=1;        
            if(cusNum[i]==rnd[j]&&i==j)
                status[i]=2;
        }
    }
    
    for(i=0;i<4;++i){
        if(status[i]==1)
            numRight++;
        else if(status[i]==2)
            posRight++;
    }
    if(posRight==4)
        printf("你猜对了!\n");
    else
        printf("%dA%dB",posRight,numRight);


}

 

作者:drownever

专家分:0

级别:1

发表时间:2007-7-29 18:16:00   
11楼

#include <iostream>
#include <string>
using namespace std;
const int MAX_CHAR_LEN = 10001;
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(cin>>str1>>str2)
    {
        //这里写你的计算代码
        int i,j;
        int A=0,B=0;  bool ff[10001]={0};
        for(i=0;i<strlen(str1);i++)
          if(str1[i]==str2[i]) {A++; ff[i]=true; }
          
        for( i=0;i<strlen(str1);i++)
          if( ff[i]==true )continue;
          else 
          {
               for(j=0;j<strlen(str2);j++)
                 if(str2[j]==true) continue;
                 else 
                 {
                      if(str1[i]==str2[j]) { B++; break; }
                 }
          }
        cout<<A<<'A'<<B<<'B'<<endl;
    }
    return 0;
}

 

作者:AntiMicrosoft

专家分:3740

级别:19级别:19级别:19级别:19级别:19级别:19

发表时间:2007-7-29 19:44:00   
12楼
#include <stdio.h>

void cmp(char *p, char *q)
{
    int pt[128]={0}, qt[128]={0}, a=0, b=0, *t, i; 
    while(*p && *q){
        if(*p==*q) a++;
        pt[*p++]++; qt[*q++]++;
    }  
    if(*p || *q){
        t = *p?pt:qt;
        p = *p?p:q;
        while(*p) t[*p++]++;
    }  
    for(i=0; i<128; i++)
        b += pt[i]>qt[i]?qt[i]:pt[i];
    printf("%dA%dB\n", a, b-a);
}

int main()
{
    char s1[1001], s2[1001];
    while(scanf("%s %s", s1, s2)!=EOF)
        cmp(s1, s2);
}

 

作者:小黑骑DK

专家分:610

级别:4级别:4级别:4

发表时间:2007-7-29 19:51:00   
13楼
#include <stdio.h>
#include <string.h>

#define  MAX_CHAR_LEN   10001

int main(void)
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    int posFlag[MAX_CHAR_LEN];
    int bPosFlag[MAX_CHAR_LEN];
    int pos1,pos2,min;
    int aCount,bCount;

    memset(str1,0,MAX_CHAR_LEN);
    memset(str2,0,MAX_CHAR_LEN);
    memset(posFlag,0,sizeof(int)*MAX_CHAR_LEN);
    memset(bPosFlag,0,sizeof(int)*MAX_CHAR_LEN);

    while(scanf("%s %s",&str1, &str2) != EOF)
    {
        pos1 = 0,pos2 = 0;
        aCount = bCount = 0;
        while (str1[pos1] != '\0'  &&  str2 != '\0')
        {
            if (str1[pos1++] == str2[pos2++])
            {
                aCount++;
                posFlag[pos1-1] = 1;
            }
        }
        if (pos1 < pos2)
        {
            min = pos1;
        }
        else
        {
            min = pos2;
        }
        for (pos1=0; pos1<min; pos1++)
        {
            if (posFlag[pos1] == 0)
            {
                for (pos2=0; str2[pos2]!='\0'; pos2++)
                {
                    if (posFlag[pos2] == 0  &&
                        str2[pos2] == str1[pos1] &&
                        bPosFlag[pos2] == 0)
                    {
                        bCount++;
                        bPosFlag[pos2] = 1;
                        break;
                    }
                }
            }
        }

        printf("%dA%dB\n",aCount,bCount);
        memset(str1,0,MAX_CHAR_LEN);
        memset(str2,0,MAX_CHAR_LEN);
        memset(posFlag,0,sizeof(int)*MAX_CHAR_LEN);
        memset(bPosFlag,0,sizeof(int)*MAX_CHAR_LEN);
    }

    return 0;
}

 

作者:zhangc511

专家分:310

级别:2

发表时间:2007-7-29 20:08:00   
14楼


#include "stdio.h"
#define MAX 10000
int accord(char [],char []);
int equal(char [],char []);
void main()
{
    int a,b;
    char str1[MAX],str2[MAX];
while(scanf("%s %s",&str1, &str2) !=EOF)
{
    a=accord(str1,str2);//位置相同的个数
    b=equal(str1,str2);//位置不同的个数
    printf("%dA%dB\n",a,b);
}
}

int accord(char str1[],char str2[])
{
    int n=0;
    while(*str1!='\0'&&*str2!='\0')
    {
        if (*str1==*str2){n++;*str2=-1;*str1=-2;}
        str1++;
        str2++;
    }
    return n;
}

int equal(char str1[],char str2[])
{
    char *p;
    int length1=0,length2=0,length=0,n=0;
    int i,j,k;
    for (p=str1;*p!='\0';p++)
        length1++;//str1长度
    for (p=str2;*p!='\0';p++)
        length2++;//str1长度
    length=length1>length2?length2:length1;
    for(i=0;i<length-1;i++)
      for(j=length-1-i,k=0;j<length&&k<length;j++,k++)
          if(str1[j]==str2[k]){n++;str2[k]=-1;str1[j]=-2;}
    for(i=0;i<length-1;i++)
      for(j=0,k=i+1;j<length&&k<length;j++,k++)
          if(str1[j]==str2[k]){n++;str2[k]=-1;str1[j]=-2;}
    return n;
}
 

 

作者:廖增祥

专家分:3930

级别:20级别:20级别:20级别:20级别:20级别:20级别:20

发表时间:2007-7-29 22:51:00   
15楼

/*
编译环境: Visual C++ 6.0
Language: C/C++
*/
#include <stdio.h>
#include <string.h>

#define  MAX_CHAR_LEN   10001

void MemSet(char *p, int len)
{
    long i;
    for(i = 0; i < len; i ++)
    {
        if(p[i])
            p[i] = 0;
    }
}

void Calculate(char *p1, long n1, char *p2, long n2)
{
    static char flag[10001] = {0};
    MemSet(flag, 10001);
    long A, B;
    A = B = 0;
    long i, j;
    for(i = 0; i < n1; i ++)
    {
        for(j = 0; j < n2; j ++)
        {
            if(i < n2 && p1[i] == p2[i] && flag[i])
                break;
            if(i == j && !flag[i] && p1[i] == p2[i])
            {
                A ++;
                flag[i] = 1;
                break;
            }
            else if(j < i && i < n2 && !flag[i] && p1[i] == p2[i])
            {
                A ++;
                flag[i] = 1;
                break;
            }
            else if(j > i && j < n1 && !flag[j] && p1[j] == p2[j])
            {
                A ++;
                flag[j] = 1;
                continue;
            }
            else if(i != j && !flag[j] && p1[i] == p2[j])
            {
                B ++;
                flag[j] = 1;
                break;
            }
        }
    }

    printf("%ldA%ldB\n", A, B);
}

int main()
{
    char str1[MAX_CHAR_LEN], str2[MAX_CHAR_LEN];
    while(scanf("%s%s",str1, str2) != EOF)
    {
        Calculate(str1, strlen(str1), str2, strlen(str2));
    }
    
    return 0;
}

 

作者:天亮再见

专家分:170

级别:1

发表时间:2007-7-30 1:24:00   
16楼
#include <stdio.h>
#define  MAX_CHAR_LEN   10001
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    while(1) 
    {
    int Count,Pos,Pos1,Pos2;
    scanf("%s %s",&str1, &str2);
    if(*str1==0 || *str2==0) break;
    for(Count = 0,Pos=0; str1[Pos] && str2[Pos];Pos++)
        if( str1[Pos]==str2[Pos] )
        {
        Count ++;
        str1[Pos] = -1;
        str2[Pos] = -2;
        }
    printf("\n%dA",Count);
    for(Count=0,Pos1 = 0; str1[Pos1]; Pos1++) {
        for(Pos2 = 0; str2[Pos2]; Pos2++) {
            if(str1[Pos1] == str2[Pos2])
            {
                for(Count++;str2[Pos2];Pos2++)
                    if(str1[Pos1] == str2[Pos2])
                        str2[Pos2]=-3;
                break;
            }
        }//for(Pos2 = 0; str2[Pos2]; Pos2++)
    }//for(Pos1 = 0; str1[Pos1]; Pos1++)
    printf("%dB\n",Count);
    }
    return 0;
}

  最后修改于2007-7-30 1:25:00

作者:tianxing

专家分:0

级别:1

发表时间:2007-7-30 6:47:00   
17楼

??!!!!!!!!!

 

作者:Alec62

专家分:0

级别:1

发表时间:2007-7-30 10:28:00   
18楼
#include <iostream.h>
#include <string.h>
#include <stdio.h>


const int MAX_CHAR_LEN = 10001;
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    char *pdest;
    int nindex;
    while(cin>>str1>>str2)
    {
        //这里写你的计算代码
    int nA=0;
    int nB=0;
    int maxitem;
    int maxlen;
    maxitem=strlen(str1)>strlen(str2)?1:2;
    if (maxitem==1 )
      maxlen=strlen(str1)-1;
    else
      maxlen=strlen(str2)-1;      
    for (int i=0 ;i<=maxlen;i++){
            switch(maxitem){
       case 1:if (i<=strlen(str2)-1 && str1[i]==str2[i]){
                nA++;
         continue;
              }
              break;
       case 2:if (i<=strlen(str1)-1 && str1[i]==str2[i]){
                nA++;
         continue;
              }
        break;
    }
    pdest=strchr(str2,str1[i]);
    if ((pdest==NULL) ||(*pdest==NULL))   continue;
    nindex=pdest-str2;
    if (nindex==i)
             nA++;   
    else
      if (nindex>-1) nB++;
        }
   char buf[2*MAX_CHAR_LEN+30];
   sprintf(buf,"%s and %s ,result %dA %dB",str1,str2,nA,nB);
   cout<<buf<<endl;
   }
   return 0;
}

 

作者:Twent

专家分:30

级别:1

发表时间:2007-7-30 18:18:00   
19楼
#include <stdio.h>
#include <cstring>
using namespace std;
const int MAX_CHAR_LEN = 10001;
long l1,l2;
int exist[256];
long a,b;
int main()
{
    char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
    long i=0;
    while(scanf("%c",&str1[i+1])){
        a=0;
        b=0;
        memset(exist,0,sizeof(exist));
        while (str1[i+1]!=' '){
          exist[str1[i+1]]++;
          i++;
       //   printf("%c",str1[i]);
          scanf("%c",&str1[i+1]);
        }
      //  printf("\n");
        l1=i;
        i=0;
        scanf("%c",&str2[i+1]);
        while (str2[i+1]!='\n'){
              if(i+1<=l1){
                i++;
                if (str2[i]==str1[i]){
                                   a++;
                                   exist[str2[i]]--;
                                   str2[i]=1;
                }
              }
              scanf("%c",&str2[i+1]);       
        }
        for (long j=1;j<=i;j++){
            if (str2[j]==1)continue;
            if (exist[str2[j]])b++;
        }
        i=0;
        printf("%dA%dB\n",a,b);
    return 0;
}

  最后修改于2007-7-30 18:26:00

作者:isjk

专家分:210

级别:2

发表时间:2007-7-30 19:25:00   
20楼
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    string str1,str2;
    int a,b;
    a = 0;
    b = 0;
    while(cin>>str1>>str2)
    {
        for(int i = 1;i<str2.size();i++)
        {
          if(str1.find(str2.at(i)) == str2.at(i))
          {
            a++;
          }
          else
          {
            b++;
          }
        }
        cout<<a<<"A"<<b<<"B"<<endl;
    }
    return 0;
}

 

[首页] [上页] [下页] [尾页]     共有 24 回帖 当前第 1 页(共2页 20帖/页)     跳转至第
回 帖 快速回帖 发 新 帖 刷新版面

版主管理:  删除此帖   转贴   置顶   加入精华   强制结帖   >>>进入管理页面