约德尔测试总结

题目描述

兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。
说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。
请问:相似率为多少?

输入
每组输入数据为两行,第一行为有关约德尔人历史的字符串,第二行是黑默丁格观测星空得到的字符串。
(两个字符串的长度相等,字符串长度不小于1且不超过1000。)

输出
输出一行,在这一行输出相似率。用百分数表示。(相似率为相同字符的个数/总个数,精确到百分号小数点后两位。printf(“%%”);输出一个%。)

时间限制
C/C++语言:1000MS其它语言:3000MS
内存限制
C/C++语言:65536KB其它语言:589824KB

样例输入
@!%12dgsa
010111100

样例输出
66.67%
题目来源

总结:
1、这道题中要注意的是字符串的输入,若字符串用char * 定义,则要先分配地址,scanf输入的数据必须也只能存放到事先申请好的存储空间,不然输入的字符可能会覆盖掉代码段或者其他一些地方的数据,引发未知的错误。
char *his,*test;
his=(char*)malloc(MAXN*sizeof(char));
test=(char*)malloc(MAXN*sizeof(char));
可以用char his[MAXN],test[MAXN]; 代替即可。
[参考]http://blog.youkuaiyun.com/u013213837/article/details/45644297
2、关于double的输出
(1)printf的%f说明符既可以输出float型又可以输出double型。
根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。
(2)scanf对于float类型必须用%f,double必须用%lf
对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。
(3)事实上,printf中没有定义%lf,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。
[来自]http://blog.youkuaiyun.com/litiouslove/article/details/8126248

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
#include <math.h>
#include <malloc.h>
#define MAXN 1010
using namespace std;

int main()
{
    //freopen("in.txt","r",stdin);
    char *his,*test;
    his=(char*)malloc(MAXN*sizeof(char));
    test=(char*)malloc(MAXN*sizeof(char));
    //char his[MAXN],test[MAXN];
    double len,num;
    char temp;
    double accu=0;
    while(~scanf("%s\n",his))
    {
        scanf("%s",test);
        len=strlen(his);
        num=0;
        for(int i=0;i<len;i++)
        {
            if((his[i]>='a'&&his[i]<='z')||(his[i]>='A'&&his[i]<='Z')||(his[i]>='0'&&his[i]<='9'))
                temp='1';
            else
                temp='0';
            if(temp==test[i])
                num++;
        }
        accu=num/len*100;
        printf("%.2f%%\n",accu);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值