跳到主要内容

函数和数组

函数

求素数

枚举 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循环赋值
  1. 方法二:筛法

"筛子"系统初始化 枚举 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 人,问:小朋友一共有多少人?

思路:

  1. 输入每次剩余人数,初始化筛子
  2. 用 3 筛,选出被 3 除余数满足条件的数
  3. 用 5 筛,选出被 5 除余数满足条件的数
  4. 用 7 筛,选出被 7 除余数满足条件的数
  5. 输出 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;
}