天天看点

基本算法练习-约德尔测试

  约德尔测试的问题是:

    给定两个串,比较相似度。

    涉及到几个点我没有思路:

           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这样的运算;