约德尔测试的问题是:
给定两个串,比较相似度。
涉及到几个点我没有思路:
1.判断 字符是否为 字母和数字;
2.输出 除法的结果,保留两个单位小数;
最后的结论:
1.字符串比较可以直接使用 'a','z'以及 '0','9'的方式,无需assci码号。 但是要注意大小关系,'0'-'9','a'-'z','A'-'Z'。
2.输出除法,需要先将整型转为浮点型, 输出方面 利用printf的格式化输出 。直接用c的较为简单,c++挺麻烦。
我的算法:
#include<iostream>
#include <iomanip>
using namespace std;
int main(){
char* a;
char* d;
d=a;
int* b;
int* c;
int len=0;
d=new char;
while(cin>>d){
len++;
d++;
d=new char;
}
b= new int[len];
c= new int[len];
for(int i=0;i<len;i++){
cin>>b[i];
if((a[i]>=48&&a[i]<=57)||(a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')) c[i] =1;
else c[i] =0;
}
int size=0;
for(int i=0;i<len;i++){
if(b[i]==c[i]) size++;
}
cout<<setprecision(2)<<(double)size/(double)len<<"%"<<endl;
delete a;
delete b;
delete c;
return 0;
}
不过很遗憾,没有通过。报了运行时异常。
网友通过的代码为:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
string s,t;
cin >> s;
cin >> t;
int i =0 ,sum=0;
while (i < s.length())
{
if((s[i]>='0'&&s[i]<='9')||((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))){
if(t[i]=='1')
sum++;
}
else{
if (t[i]=='0')
{
sum++;
}
}
i++;
}
printf("%.2f%%",(double)sum*100/(double)s.length());
return 0;
}
相形之下,我这样几个地方处理的不好:
1.接收字符串时,我以char的方式接收;由于事先不知道长度,我便没有办法定义静态数组,这会给自己增加麻烦。在指针与内存申请方面可能出错了。
2.使用c++的格式化输出方式,需要引入包,还有一些api函数使用规范。 反观 printf格式化输出,则用的地方很多,熟练之后效果更佳。
可运行版本:
#include<iostream>
#include <iomanip>
using namespace std;
int main(){
char* a;
int len=0;
a=new char;
cin>>a;
while(a[len]){
len++;
}
char* b;
char* c;
b= new char;
c= new char;
cin>>b;
for(int i=0;i<len;i++){
if((a[i]>=48&&a[i]<=57)||(a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')) c[i] ='1';
else c[i] ='0';
}
int size=0;
for(int i=0;i<len;i++){
if(b[i]==c[i]) size++;
}
cout<<setprecision(2)<<(double)size/(double)len<<"%"<<endl;
delete a;
delete b;
delete c;
return 0;
}
注意事项:
1.指针变量 ++ 运算符不生效,需要使用 a=a+1这样的运算;