分解质因数:
思路:
这里使用到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;
}