函数和数组
函数
求素数
枚举 2-100 的所有自然数,判断 n 是否是素数,输出 n
1.方法一
#include <iostream>
using namespace std;
bool isPrime(int);
int main()
{
for(int n = 2; n <= 100; n++)
{
if(isPrime(n))
cout << n << endl;
}
return 0;
}
bool isPrime(int n)
{
bool bPrime = true;
for(int i = 2; i * i <= n; i++)
{
if( n % i == 0)
{
bPrime = false;
break;
}
}
return bPrime;
}
引入:数组
int number[10]; // 数组类型 数组名称[变量个数] 变量个数必须是整数,必须是常量
int number[10] = {0, 2, 32, 3, 20, 32, 10, 3, 23, 2}; // 初始化
原则:定义时要让计算机指导变量占多少空间。
数组是不能直接赋值的。
数组中的每一项都可以作为独立的变量使用、赋值的:
number[0] = 100; // 索引0的值赋值
cin >> number[1];
cout << number[x]; // x为变量
number[10] = {0, 2, 32, 3, 20, 32, 10, 3, 23, 2}; // 错误写法!!
// 通过for循环赋值
- 方法二:筛法
"筛子"系统初始化 枚举 2 到根号 100 每个数 d 如果 d 没有被筛掉 用 d 筛 100 以内的数 输出所有没有被筛掉的数
#include <iostream>
using namespace std;
const int N = 10;
bool seive[N + 1];
int main()
{
for(int i = 2; i <= N; i++)
seive[i] = true;
for(int d = 2; d * d <= N; d++)
if(seive[d])
for(int n = d * d; n <= N; n += d) // 筛选倍数
seive[n] = false;
for(int n = 2; n <= N; n++)
if(seive[n])
cout << n << endl;
return 0;
}
排队问题
有一群不到 200 人的小朋友,3 人一排,多余 2 人;5 人一排,多余 2 人;7 人一排,多余 3 人,问:小朋友一共有多少人?
思路:
- 输入每次剩余人数,初始化筛子
- 用 3 筛,选出被 3 除余数满足条件的数
- 用 5 筛,选出被 5 除余数满足条件的数
- 用 7 筛,选出被 7 除余数满足条件的数
- 输出 3 次都选中的数
#include <iostream>
using namespace std;
const int N = 200;
int main()
{
int r3 = 0, r5 = 0, r7 = 0, seive[N];
cout << "分别输入 r3 r5 r7:" << endl;
cin >> r3 >> r5 >> r7; // 输入 3 , 5 , 7
for(int i = 0; i < N; i++)
seive[i] = 0;
for(int i = r3; i < N; i = i + 3)
seive[i]++;
for(int i = r5; i < N; i = i + 5)
seive[i]++;
for(int i = r7; i < N; i = i + 7)
seive[i]++;
for(int i = 0; i < N; i++)
if(seive[i] == 3)
{
cout << i << endl;
break;
}
return 0;
}
扑克问题
有 52 张扑克,取 13 张牌,随机问一个黑桃 Q 的位置或者没有找到
表示:
黑桃: 101 - 113 红桃: 201 - 213 方框: 301 - 313 梅花: 401 - 413
#include <iostream>
using namespace std;
int main()
{
int cards[13] = {101, 113, 303, 206, 405, 208, 311, 304, 410, 309, 112, 207, 402};
int pos = -1;
for(int i = 0; i < 13; i++)
if(cards[i] == 112)
{
pos = i;
break;
}
if(pos != -1)
cout << "黑桃Q是第" << pos + 1 << "张牌" << endl;
else
cout << "没有找到黑桃Q" << endl;
return 0;
}
最小值问题
#include <iostream>
using namespace std;
/*
1.线性查找法
找到手里比7大的最小牌
*/
int main()
{
int cards[13] = {101, 113, 303, 206, 405, 208, 311, 304, 410, 309, 112, 207, 402};
int min = 100, pos = -1;
for(int i = 0; i < 13; i++)
if(cards[i] % 100 > 7)
if(cards[i] % 100 < min)
{
min = cards[i] % 100;
pos = i;
}
cout << "最牌值为" << min << endl;
return 0;
}
#include <iostream>
using namespace std;
/*
查找黑桃Q在第几张
折半查找法
*/
int main()
{
int cards[13] = {101, 112, 113, 206, 207, 208, 303, 304, 309, 311, 402, 405, 410}; // 有序的
int id = -1, low = 0, high = 12;
while (low <= high)
{
int middle = (low + high) / 2;
if(cards[middle] == 112)
{
id = middle;
break;
}
else if(cards[middle] > 112)
high = middle - 1;
else
low = middle + 1;
}
cout << "黑桃Q在第" << id + 1 << "张" << endl;
return 0;
}