1001 害死人不偿命的(3n+1)猜想
任给一个正整数n,如果是偶数则返回n/2,如果是奇数,返回(3n+1)/2,最后一定在某一步返回n=1, 求返回1时的步数。
代码:
#include<iostream>
using namespace std;
int main(){
int n, count = 0;
cin>>n;
while(n != 1){
if(n%2 != 0)n=3*n+1;
n=n/2;
count++;
}
cout<<count;
return 0;
}
1002 写出这个数
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字
拼音数字之间有空格,最后的拼音数字末尾没有空格。
#include<iostream>
#include<string>
int main(){
string s;
cin >> s;
int sum = 0;
string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
for(int i=0; i < s.length(); i++){
sum += (s[i] - '0');///数字字符变整型数值
}
string num = to_string(sum);//////整型变字符串
for(int i = 0; i < num.length(); i++){
if(i != 0) cout >> " ";
cout >> str[num[i]-'0'];///数字字符变整型数值
}
return 0;
}
重点:to_string函数能将其他类型转为string;数字字符变为整型数值用该字符-'0';
1003 我要通过!
#include<iostream>
#include<map>
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
string s;
cin >> s;
int p, t;
map<char, int>m;\\创建字符:数值类型的map存储对应字母出现的次数
for(int j = 0; j < s.length(); j++){
m[s[j]]++;
if(m[s[j]] == 'P') p = j;
if(m[s[j]] == 'T') t = j;
}
if(m['P']==1&&m['T']==1&&m['A']!=0&&t-p!=1&&p*(t-p-1)==s.length()-t-1&&m.size()==3)
cout>>"YES\n";
else
cout>>"NO\n";
}
return 0;
}
重点:使用map存储字符串种类,并且能知道每种字符出现的次数。
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int name, num, socre, max = 1, min = 101;
string maxname, minname, maxnum, minnum;
for(int i = 0; i < n; i++){
cin >> name >> num >> socre;
if(socre > max){max=socre;maxname=name;maxnum=num;}
if(sorce < min){min=socre;minname=name;minnum=num;}
}
cout<<maxname<<" "<<maxnum<<"\n";
cout<<minname<<" "<<minnum<<"\n";
}
重点:cin可以读取用空格隔开的变量;题目要求比较成绩,只需输出最大成绩和最小成绩及其对应的学号和姓名,将三个变量而分开存储满足条件后更新。
1005 继续(3n+1)猜想
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
#include<iostream>
using namespace std;
int cmp(int a, int b){return a>b;}
int main(){
int n,k, flag = 0;
cin>>k;
int arr[10000];
vector<int> v(k);
for(int i = 0; i < k; i++){
cin>>n;
v[i] = n;
if(n%2 != 0)n = 3*n+1;
n=n/2;
if(arr[n] = 1)break;
arr[n]=1;
}
sort(v.begin, v.end, cmp);
for(int i = 0; i<k; i++){
if(arr[v[i]]==0){
if(flag==1)cout<<" ";
cout<<v[i];
flag = 1;
}
}
return 0;
}
重点:用vector存储输入数据,方便用sort函数进行从大到小的排序,sort函数以第一个参数为首地址第二个参数为尾地址,第三个参数为排序方法return a>b是从大到小排列,还可通过变换参数的方法改变排序方法。用数组arr[]下标表示数字对应值表示数字是否出现过,跟之前使用的map类似。也就是说如果键值对的关键字是数字的话可以用数组表示对应关系,如果关键字为字符则使用map。如果要求输出最后没有空格,并且没法控制最后的输出,则可以设置一个标志变量flag,初始值为0,变为1时输出空格,然后输出想输出的数据,也就是改变空格和数据的输出顺序。
1006 换个格式输出整数
#include<iostream>
using namespace std;
int main(){
int a;
cin>>a;
int b[3] = {0};
while(a!=0){
b[i]=a%10;
a=a/10;
}
for(int i = 0; i < b[2]; i++)
cout<<'B';
for(int i = 0; i < b[1]; i++)
cout<<'S';
for(int i = 0; i < b[0]; i++)
cout << i+1;
return 0;
}
重点:这题很简单,直接用while循环%截取每位对应数字然后存入数组即可,因为是按对应数字进行输出,所以需要对每一位进行分别储存。
1007 素数对猜想
有无穷多对相邻且相差为2的素数,相邻指两数之间没有其他素数,显然两相邻素数之差最少为2,因为偶数必然不是素数(1、2、3除外)
#include<iostream>
using namespace std;
bool isprime(int a){
for(int i = 2; i * i <= a; i++){
if(a % i == 0)return false;
}
return true;
}
int main(){
int n, count = 0;
cin>>n;
for(int i = 5; i <= n; i++){
if(isprime(i-2)&&isprime(i))count++;
}
cout<<count;
return 0;
}
重点:确定一个数是否是素数的函数:i从2到平方小于等于a的整数,如果a能被其中任意一个数整除,则表示a不是素数。
由于1、2、3都是素数相差不是2,所以从i = 5开始遍历。