| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 518 人关注过本帖
标题:此题编写为何输出结果与题目要求相反?
只看楼主 加入收藏
zyouge
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-15
结帖率:66.67%
收藏
已结贴  问题点数:8 回复次数:3 
此题编写为何输出结果与题目要求相反?
题目描述

  众所周知,在每一个彗星后都有一只UFO。这些UFO时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带走。
  小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中“A”是1,“Z”是26。例如,“USACO”小组就是21*19*1*3*15=17955。如果小组的数字 mod 47等于彗星的数字mod 47,你就得告诉这个小组需要准备好被带走!(记住“a mod b”是a除以b的余数;34 mod 10等于4)
  写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出“GO”,否则输出“STAY”。小组名和彗星名均是没有空格或标点的一串大写字母(不超过6个字母)。

输入格式(ride.in)
第1行:一个长度为1到6的大写字母串,表示彗星的名字。
第2行:一个长度为1到6的大写字母串,表示队伍的名字。

输出格式(ride.out)
仅一行,包括“GO”或“STAY”。

输入样例1
COMETQ
HVNGAT

输出样例1
GO

输入样例2
ABSTAR
USACO
输出样例2
程序如下:
STAY#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
    int a,b,c=1,d=1,h,i,y,z,num1[6],num2[6];
    string name1,name2;
    ifstream OpenFile("ride.in");
    OpenFile>>name1;
    OpenFile>>name2;
    OpenFile.close();
    for(y=0;y<6;y++)
    {
        if(name1[y]!='\n'&&name1[y]!=0)num1[y]=name1[y]-64;
    }
    for(z=0;z<6;z++)
    {
        if(name2[z]!='\n'&&name2[z]!=0)num2[z]=name2[z]-64;
    }
    for(a=0;a<6;a++)
    {
        if(num1[a]!=0)c*=num1[a];
    }
    for(b=0;b<6;b++)
    {
        if(num2[b]!=0)d*=num2[b];
    }
    h=c%47;
    i=d%47;
    ofstream SaveFile("ride.out");
    if(h==i)
    {
        SaveFile<<"GO"<<endl;
    }
    else
    {
        SaveFile<<"STAY"<<endl;
    }
    cout<<endl;
    SaveFile.close();
    return 0;
}
搜索更多相关主题的帖子: 支持者 地球 飞碟 如何 
2013-09-22 10:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:8 
问题太多了吧
第一,num1[6],num2[6] 应该是 num1[7],num2[7]
第二,
for(y=0;y<6;y++)
    {
        if(name1[y]!='\n'&&name1[y]!=0)num1[y]=name1[y]-64;
    }
哪来的'\n',哪来的0(虽然'\0'和0……)?另外'\0'之后的数据是随机的。再另外,C++11之前,string未必有'\0'结尾;且如果超出size(),name1[y]其行为是未定义的。
第三,最多6个字母,那么最大值就是 26*26*26*26*26*26 = 308915776,需要28bits,如果你int为四字节或以上,当然没问题;如果没有,则当用公式 (a*b)%47 = ( (a%47) * (b%47) )%47 来使得中间结果不溢出。
2013-09-22 12:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:0 
程序代码:
#include <fstream>
using namespace std;

unsigned int foo( const char* str )
{
    unsigned int ret = 1;
    for( ; *str!='\0'; ++str )
        ret = ret * ( *str - 'A' + 1 ) % 47;
    return ret;
}

int main()
{
    char a[7], b[7];
    {
        ifstream filein( "ride.in" );
        filein >> a >> b;
    }

    bool bGo = foo(a)==foo(b);
    {
        ofstream fileout( "ride.out" );
        fileout << ( bGo ? "GO" : "STAY" );
    }

    return 0;
}
2013-09-22 14:49
zyouge
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-15
收藏
得分:0 
太感谢了!
2013-09-24 15:07
快速回复:此题编写为何输出结果与题目要求相反?
数据加载中...
 
   



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

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