题目描述
兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。 说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。 请问:相似率为多少?
输入 每组输入数据为两行,第一行为有关约德尔人历史的字符串,第二行是黑默丁格观测星空得到的字符串。 (两个字符串的长度相等,字符串长度不小于1且不超过1000。)
输出 输出一行,在这一行输出相似率。用百分数表示。(相似率为相同字符的个数/总个数,精确到百分号小数点后两位。printf(“%%”);输出一个%。)
时间限制 C/C++语言:1000MS其它语言:3000MS 内存限制 C/C++语言:65536KB其它语言:589824KB
样例输入 @!dgsa 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.csdn.net/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.csdn.net/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; }