算法入门2 | 分解质因数 | 十进制数与八进制数的转换 | 附加记录两道ACM入门题代码

分解质因数:

        思路:

                这里使用到vector类模板(不清楚是什么东东,有没有大佬讲解一下),主要是因为vector可以有顺序地存放数据,类似于数组。

                函数体内共两层循环,外层为一个for循环,用来遍历2到n之间的数。内层用求余得0的条件确定2到n之间为n的因数的数,同时使n减小至1/a倍,可以淘汰所有a的整数倍的因数,下一个未被消除的数就是质因数,用while循环可以确保同一个质因数可重复被列入到答案中。

        代码如下:

#include<iostream>
#include <vector>
using namespace std;

vector<unsigned int> GetFactors(unsigned int n)
{
    vector<unsigned int> aFactors;
    //核心部分代码
    for(unsigned int a=2;a<=n;a++)
    {
        while((n%a)==0)//满足条件的数为因数
        {
            aFactors.push_back(a);
            n/=a;//消灭a的整数倍的因数,使所有因数都为质因数
        }
    }
    return aFactors;
}
int main()
{
    int n;
    while(cin >> n)
    {
        vector<unsigned int> aFactors;
        aFactors=GetFactors(n);
        for(int i=0;i<aFactors.size();i++)
            cout << aFactors[i] << ' ';
        cout << endl;
    }
}

十进制数与八进制数的转换:

        思路:

                用商余法将十进制数转换为八进制数。

                首先,根据商余法,不断给数n除以8并保留每次计算的余数。接下来,直至得到余数小于8不再除以8求余。最后,再将所有的余数逆序输出,就成功转化为八进制数。

                函数定义两个参数,分别为运算的商(用int类型定义)、运算的余数(定义整型指针存储)。用函数返回指针的最终指向位置,因此函数定义为整型指针。在递推函数里,函数采用向递推指针的方法,就不必逆序输出。注意在主函数部分需要考虑清楚怎样输出及输出数组的范围。

        代码:

#include<iostream>
using namespace std;
int *f(int n,int *p)
{
    if(n<8)
    {
        *p=n;
        return p;
    }
    else {
        *p=n%8;
        return f(n / 8,p-1);
    }
}
int main()
{
    int n;
    cin >> n;
    int s[1000];
    int  *t = f(n, s+999);
    while (t<=s+999)
    {
        cout << *t;
        t++;
    }
}

统计字符串中每个字母出现的次数

        题目描述:

                编写程序统计字符串中每个字母出现的次数,例如字符串aabbc,对应的统计结果为
                a-2
                b-2
                c-1

        输入格式:

                输入包括多行,每行一个长度不超过100的非空无空格字符串s。

        输出格式:

                统计s中字母出现的次数,忽略大小写,忽略其它非字母字符,将统计结果按字母顺序输出后换行。注意字符串中出现次数为0的字母不需要输出,字符串的统计结果之间用空行隔开
当字符串中没有字母时,输出no letter。

        输入样例 :

                AabBc
                A
                C###
                ***

        输出样例 :

                a-2
                b-2
                c-1

                a-1

                c-1

                no letter

        代码:

#include<iostream>
using namespace std;
int main()
{
    char s[101];
    while(cin >> s)
    {
        int a[200]={0};
        for(int i=0;s[i]!='\0';i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                s[i]=s[i]+32;
                a[s[i]]++;
            }
            else if(s[i]>='a'&&s[i]<='z')
                a[s[i]]++;
        }
        int flag=0;
        for(int i=0;s[i]!='\0';i++)
        {
            if(a[s[i]]!=0)
            {
                cout << s[i] << '-' << a[s[i]] << endl;
                a[s[i]]=0;
                flag = 1;
            }
        }
        if(flag == 0)
            cout << "no letter" << endl;
        cout << endl;
    }
}

字串加工

        题目描述:

                小F拥有一个0-1字符串,这个字符串至少有一个0和一个1。她想要把字符串分为连续的m段,每一段含有至少一个0和一个1,并且m越大越好。给定字符串,你能算出m是多少吗?

        输入格式:

                一个01串,保证含有至少一个0和一个1,2<=串长<=1e5。

        输出格式:

                最大的m。

        输入样例 :

                10101111000010101111010101

        输出样例 :

                9

        数据范围与提示:

                分为9段:10  10  11110  0001  01  01  1110  10  101

        代码:

#include<iostream>
using namespace std;
int main()
{
    char q[100001];
    int a[100001];
    int i;
    int s=0;
    cin >> q;
    for(i=0;q[i]!='\0';i++)
        a[i]=q[i]-'0';
    for(int j=0;j<i-1;j++)
    {
        if(a[j]!=a[j+1])
        {
            s++;
            j++;
        }
    }
    cout << s;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值