HJ3_明明的随机数
使用标记数组的形式来解决,重点是每个N的输出是单独的,并不是等待所有输入完成后才统一进行输出。
如输入3 2 2 1 5 6 1 2 5 3,N有2个,分别为N1=3(2 2 1)和 N2=5(6 1 2 5 3 )
所以输出应该分为两部分,1 2 和 1 2 3 5 6
最开始我以为是统一输出,RA了好几次
#include <iostream>
using namespace std;
int main()
{
int N, n;
while(cin >> N)
{
int set[1001] = {0};
for(int i=0; i<N; i++)
{
cin >> n;
set[n] = n;
}
for(int i=0; i<1001; i++)
if(set[i])
cout << set[i] << endl;
}
}
HJ5_进制转化
char c = '0';
int t = int( c ); // t!=0,而是0的ACSII码48
cout << t; // t == 48
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int main()
{
string s;
while(cin >> s)
{
int result = 0;
int bit = 0;
for(int i=s.length()-1; i>1; i--)
{
if(s[i]>='0' && s[i]<='9' )
result += (s[i]-'0') * pow(16, bit++);
else if(s[i]>='A' && s[i]<='F')
result += (s[i]-'A'+10) * pow(16, bit++);
}
cout << result<<endl;
}
}
HJ7_取近似值
判断小数点后第一位是否大于5
int(float x) 会把x小数点后的所有数字直接舍去
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
float n;
cin >> n;
int result = int( (n-int(n))*10 );
if(result < 5)
{
cout << floor(n);
}
else{
cout << ceil(n);
}
return 0;
}
HJ15_求int型数据在内存中存储时1的个数
求二进制数中1的个数
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int round = 0;
while( n != 0 )
{
if(n % 2 == 1) round++;
n /= 2;
}
cout << round;
return 0;
}
HJ20_密码验证合格程序
这个没有写出来,是学习别人的,链接如下
https://blog.csdn.net/dengheCSDN/article/details/78544926
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool include_3char(const string &s) // 判断是否包含三种以上字符
{
int num[4] = { 0 };
for (decltype(s.size()) i = 0; i < s.size(); ++i)
{
if ((s[i] < 32) || (s[i] > 126)) // 不是字符
{
return false;
break;
}
else // 字符在32 ~126 之间
{
if ((s[i] <= 57) && (s[i] >= 48)) // 65 ~90 为大写字母
num[0]++;
else if ((s[i] <= 90) && (s[i] >= 65)) // 65 ~90 为大写字母
num[1]++;
else if ((s[i] <= 122) && (s[i] >= 97)) // 97 ~122 为小写字母
num[2]++;
else
num[3]++;
}
}
int count = 0;
for (int j = 0; j < 4; j++)
{
if (num[j])
count++;
}
if (count >= 3)
return true;
else
return false;
}
int main()
{
string s;
vector<string> vecs;
while (cin >> s)
{
vecs.push_back(s);
}
for (decltype(vecs.size()) i = 0; i < vecs.size(); ++i)
{
if (vecs[i].size() <= 8)
{
cout << "NG" << endl;
//break;
}
else // 长度超过8位
{
if (!include_3char(vecs[i]))
{
cout << "NG" << endl;
//break;
}
else // 包含三种以上字符
{
// 检查是否包含重复的字串
string str = vecs[i];
int able = 0;
for (decltype(str.size()) j = 0; j < str.size() - 3; ++j)
{
for (decltype(str.size()) k = j+1; k < str.size() - 2; ++k)
{
if (str.substr(j, 3) == str.substr(k, 3)) // 如果有重复的子串
{
able = 1;
break;
}
}
if (able == 1)
break; // 如果有重复子串,就跳出两层循环
}
if (able == 1)
cout << "NG" << endl;
else
cout << "OK" << endl;
}
}
}
return 0;
}
HJ22_汽水瓶
还剩2个空瓶子的时候记得借一瓶(商店老板暴怒qwq)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec_i;
int n;
while(cin >> n)
{
if(n == 0) break;
vec_i.push_back(n);
}
for(vector<int>::iterator iter=vec_i.begin(); iter!=vec_i.end(); iter++ )
{
int count = 0;
n = *iter;
while( n >= 3 )
{
count += n/3;
int a = n % 3;
n = n/3 + a;
}
if(n == 2)
count++;
cout << count << endl;
}
}
HJ56_iNOC产品部–完全数计算
推导公式
大数学家欧拉曾推算出完全数的获得公式:如果p是质数,且2^ p-1也是质数,那么(2 z^ p-1 )* 2^(p-1)便是一个完全数。
例如p=2,是一个质数,2^ p-1=3 也是质数,(2^ p-1)* 2^(p-1)=3X2=6,是完全数。
例如p=3,是一个质数,2 ^ p-1=7也是质数,(2 ^ p-1)* 2^(p-1)=7X4=28,是完全数。
例如p=5,是一个质数,2 ^ p-1=31也是质数,(2 ^ p-1)* 2^(p-1)=31X16=496是完全数。
当2^p-1是质数的时候,称其为梅森素数。到2013年2月6日为止,人类只发现了48个梅森素数,较小的有3、7、31、127等
//C++
#include <iostream>
#include <math.h>
using namespace std;
bool is_prime(int p);
// 如果p是质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数
int main()
{
int n;
while(cin >> n)
{
int count = 0;
for(int p=2; p<sqrt(n); p++)
{
long int t = pow(2,p)-1;
if( is_prime(p) && is_prime(t) )
{
int perfect_num = pow(2,p-1) * t;
if( perfect_num>0 && perfect_num<n )
count++;
}
}
cout << count << endl;
}
return 0;
}
bool is_prime(int p)
{
for(int i=2; i<sqrt(p); i++)
if(p % i == 0)
return false;
return true;
}