华为OJ(二)

1、求最小公倍数
最小公倍数=A*B/最大公约数

#include<iostream>
#include<string>
using namespace std;
int main(){
    int A,B;
    cin>>A>>B;
    int min;//A、B中的小者
    int common;//公倍数
    int commonD=1;//最大公约数
    if(A<B){
        min = A;
    }else{
        min = B;
    }
    int i;
    if(min==1){
        common = A*B;
    }
    else{
        for(i=2;i<=min;i++){
            if(A%i==0 && B%i==0){
                commonD = i;
            }
        }
        common = A*B/commonD;
    }
    cout<<common;

    return 0;
}

2、字符串反转:
使用gets记得包含头文件,即#include
开始使用string,运行错误
后来使用char(数组大小为100000),用gets读取,就正确了

3、汽水瓶:

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int n;
int count=0;
void fun(){
    if(n==2){ //n是空瓶子数
        count+=1; //喝的饮料数量
        n=0;
    }else{
        count+=(n/3);
        n=(n/3)+(n%3);
    }
}

int main(){
    int num[11];
    int i;

    for(i=0;i<11;i++){
        cin>>num[i];
        if(num[i]==0) break;
    }

    for(i=0;;i++){
        if(num[i]==0){
            break;
        }
        n=num[i];
        if(n==1) count=0;
        else{
            while(n>=2){
                fun();
            }
        }

        cout<<count<<endl;
        count=0;
    }

    return 0;
}

4、字符串排序:

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
    char a[26][100]; //存放按顺序输入的26个字母
    int count[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};    //26个字母的数量
    char str[1000]; //输入的字符串
    gets(str);
    int i;

    //a、count初始化
    for(i=0;str[i]!='\0';i++){
        if(str[i]>='A' && str[i]<='Z'){
            a[str[i]-'A'][count[str[i]-'A']++]=str[i];
        }else if(str[i]>='a' && str[i]<='z'){
            a[str[i]-'a'][count[str[i]-'a']++]=str[i];
        }
    }



    //a[][]中的内容按顺序放在strOut中
    int num=0;
    int j;
    char strOut[1000];
    for(i=0;i<26;i++)
        for(j=0;j<count[i];j++){
            //cout<<a[i][count[i]]<<"!";
            strOut[num++] = a[i][j];  //注意下面要用a[i][j] 而不是 a[i][count[i]]
        }


    //输出
    num=0;
    for(i=0;str[i]!='\0';i++){
        if((str[i]>='A' && str[i]<='Z')||(str[i]>='a' && str[i]<='z')){
            cout<<strOut[num++];
        }else{
            cout<<str[i];
        }
    }

    return 0;
}

注意:
要用a[i][j] 而不是 a[i][count[i]]
a[str[i]-‘A’][count[str[i]-‘A’]++]=str[i];而不是a[str[i]-65][count[str[i]-65]++]=str[i];

5、密码强度计算

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
    string str;
    cin>>str;
    int score=0;
    int charCount=0,numCount=0,symbolCount=0,charBigCount=0;
    //长度评分
    if(str.size()>=8){
        score+=25;
    }else if(str.size()>=5 && str.size()<=7){
        score+=10;
    }else if(str.size()<=4){
        score+=5;
    }

    int i;
    for(i=0;i<str.size();i++){
        if(str[i]>='A' && str[i]<='Z'){
            charBigCount++;
        }else if(str[i]>='a' && str[i]<='z'){
            charCount++;
        }else if(str[i]>='0' && str[i]<='9'){
            numCount++;
        }else if((str[i]>=0x21 && str[i]<=0x2F)||(str[i]>=0x3A && str[i]<=0x40)||
                 (str[i]>=0x5B && str[i]<=0x60)||(str[i]>=0x7B && str[i]<=0x7E)){
            symbolCount++;
        }
    }

    //字母加分
    if(charCount>0 && charBigCount>0){
        score+=20;
    }else if(charCount==0 && charBigCount==0){

    }else if((charCount>0 && charBigCount==0)||(charCount==0 && charBigCount>0)){
        score+=10;
    }

    //数字数量加分
    if(numCount==1){
        score+=10;
    }else if(numCount>1){
        score+=20;
    }else if(numCount==0){

    }

    //符号数量加分
    if(symbolCount==1){
        score+=10;
    }else if(symbolCount>1){
        score+=20;
    }else if(symbolCount==0){

    }

    if((charCount+charBigCount)>0 && numCount>0 && symbolCount==0){
        score+=2;
    }else if((charCount>0 && charBigCount==0 && numCount>0 && symbolCount>0)
    ||(charCount==0 && charBigCount>0 && numCount>0 && symbolCount>0)){
        score+=3;
    }else if(charCount>0 && charBigCount>0 && numCount>0 && symbolCount>0){
        score+=5;
    }

    string judge;
    if(score >=0 && score<25){
        judge="VERY_WEAK";
    }else if(score >=25 && score<50){
        judge="WEAK";
    }else if(score >=50 && score<60){
        judge="AVERAGE";
    }else if(score >=60 && score<70){
        judge="STRONG";
    }else if(score >=70 && score<80){
        judge="VERY_STRONG";
    }else if(score >=80 && score<90){
        judge="SECURE";
    }else if(score >=90 && score<=100){
        judge="VERY_SECURE";
    }

    cout<<judge;
    return 0;
}

6、删除出现次数最少的字符串

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
    string str;
    cin>>str;
    int count[26]={0,0,0,0,0,0,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int i,j;

    if(str.size()<=20){
        for(i=0;i<str.size();i++){
            count[str[i]-'a']++;
        }

        int min; //存放字符出现最小的次数
        bool symbol=true;
        //找到min
        for(i=0;i<26;i++)
        {
            if(symbol){
                if(count[i]>0){
                    min=count[i]; //只执行一次
                    symbol=false;
                }
            }
            if(count[i]<min && count[i]>0){
                min = count[i];
            }
        }

        //找到出现次数最少的字符们
        char strMin[26]; //存放出现字数最少的字符们
        int minNum=0;//出现字数最少的字符数量
        for(i=0;i<26;i++)
        {
            if(count[i]==min){
                strMin[minNum++] = (char)(i+'a');
            }
        }

        char strOut[1000];
        int strOutNum=0;
        bool sign=true;
        for(i=0;i<str.size();i++){
            for(j=0;j<minNum;j++){
                if(str[i]==strMin[j]){
                    sign=false;//要删除掉这个字符
                    break;
                }
            }
            if(sign){
                strOut[strOutNum++]=str[i];
            }
            sign=true;
        }
        strOut[strOutNum]='\0';//注意赋值要加结束符号,用cin输入则不需要加
        cout<<strOut;
    }

    return 0;
}

7、小球落地5次后

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
    int height;
    cin>>height;
    double road,heighting ;
    road = height*2.875;
    heighting = height*0.5*0.5*0.5*0.5*0.5;
    cout<<road<<endl<<heighting<<endl;
    return 0;
}

8、数字逆序

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main(){
    long num;
    cin>>num;
    int number[100],count=0; //记录数的每一位,以及位数
    int i;
    for(i=0;num!=0;i++){
        number[count++]=num%10;
        num/=10;
    }
    for(i=0;i<count;i++){
        cout<<number[i];
    }
    return 0;
}

9、递推公式

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int a=2;
void fun(){
    a=a*2+2;
}

int main(){
    int n,i;
    cin>>n;
    if(n==1){
        cout<<2;
    }else if(n>=2 && n<65535){
        for(i=0;i<n-1;i++){
            fun();
        }
        cout<<a;
    }
    return 0;
}

10、FBI树(闯关的题目)

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;

class Node{
    public:
        Node(){ //构函数造
        left = -1;
        right = -1;
        sign0 = false;
        sign1 = false;
        }
        char symbol; //属于什么串
        char content[1024]; //存储01串
        int length; //01串的长度
        bool sign0;//字符串里是否有0
        bool sign1;//字符串里是否有1
        int left; //左孩子在Node[]数组对象中的第几个
        //定义的时候不能直接赋值
        int right; //右孩子在Node[]数组对象中的第几个
};

Node *node = new Node[1000];//创建可以存放一千个节点的对象
int count=0;//存放节点的个数
char outStr[1000];
int outCount=0;
int n;

void find(Node nd){

    if(nd.left!=-1){ //如果下面还有子节点
        find(node[nd.left]);
        find(node[nd.right]);
    }
    outStr[outCount++] = nd.symbol;

}

int fun(char str[],int len){
    int maxJudge=1;
    int i;
    for(i=0;i<n+1;i++){
        maxJudge*=2;
    }

    //node01串、01串长度初始化
    for(i=0;i<len;i++){
        node[count].content[i] = str[i];
    }
    node[count].length = len;

    //是否含0、1
    for(i=0;i<len;i++){
        if(str[i]=='0'){
            node[count].sign0 = true;
        }else if(str[i]=='1'){
            node[count].sign1 = true;
        }
    }
    //判断属于什么串
    if(node[count].sign0 == true && node[count].sign1 == true){
        node[count].symbol = 'F';
    }else if(node[count].sign0 == true && node[count].sign1 == false){
        node[count].symbol = 'B';
    }else if(node[count].sign0 == false && node[count].sign1 == true){
        node[count].symbol = 'I';
    }

    if(len==1){//叶子节点
        if(count==(maxJudge-2)){
            return 0;
        }
    }else{
    //定义左右孩子的01串
    char leftStr[len/2];
    char rightStr[len/2];
    //给左孩子01串赋值
    for(i=0;i<len/2;i++){
        leftStr[i] = str[i];
    }
    //给右孩子01串赋值
    for(i=len/2;i<len;i++){
        rightStr[i-(len/2)] = str[i];
    }
    //记住左孩子
    int temp=count; //暂存父串标号
    node[temp].left = ++count;

    fun(leftStr,len/2);

    node[temp].right = ++count;

    fun(rightStr,len/2);

    }


}

int main(){

    char str[1024]; //存放01串
    cin>>n>>str;

    int k,len=1;
    //找到输入的长度
    for(k=0;k<n;k++){
        len*=2;
    }
    cout<<"初始长度:"<<len<<endl;
    //调用fun
    fun(str,len);
    //调用find
    find(node[0]);
    //输出
    for(k=0;k<outCount;k++)
    cout<<outStr[k];

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值