回 帖 发 新 帖 刷新版面

主题:第58次编程比赛题目——简单猜数字

题目描述:
猜数字游戏大家玩过没?经典的规则是给出一个四位数,然后你去猜。
如那个数是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
对题目有疑问的,请到[url]http://www.programfan.com/club/post-244340.html[/url]提出,谢谢

回复列表 (共24个回复)

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;
}

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);
}

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;
}

14 楼


[em3]
#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;
}
 

15 楼

[code=c]
/*
编译环境: 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;
}
[/code]

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;
}

17 楼


[em1]??!!!!!!!!!

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;
}

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;
}

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;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册