题目描述
兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。
说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个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;
}