You are on page 1of 80

第 1 章 编程如此简单

1.1 程序设计概念

(1)略

(2)略

1.2 整数算术计算
(1)300 公顷

→求 1 台拖拉机 1 天耕地公顷数:90÷3÷3=10(公顷)90÷3÷3=10(公顷)

→求 5 台拖拉机 6 天耕地公顷数:10×5×6=300(公顷)10×5×6=300(公顷)

→列出综合算式: 90÷3÷3×5×6=300(公顷)90÷3÷3×5×6=300(公顷)

程序:

#include <iostream>using namespace std;


int main(){
cout<<"5 台拖拉机 6 天能耕";
cout<<90/3/3*5*6<<"公顷地。"<<endl;
return 0;
}

(2)3 次

→求 1 辆车 1 次可以运送的钢材量:100÷4÷5=5(吨)100÷4÷5=5(吨)
→求 7 辆车运送 105 吨钢材的次数: 105÷(5×7)=3(次)105÷(5×7)=3(次)
→列出综合算式: 105÷((100÷4÷5)×7)=3(次)105÷((100÷4÷5)×7)=3(次)

程序:

#include <iostream>using namespace std;


int main(){
cout<<"7 辆车运送 105 吨钢材需要";
cout<<105/((100/4/5)*7)<<"次"<<endl;
return 0;
}

(3) 去掉 2 根,每班 7 根

→求每个班分到的绳子数:58÷8=7(根)...2(根)58÷8=7(根)...2(根)
→分到 7 根,余下两根

程序:

#include <iostream>using namespace std;


int main(){
cout<<"每个班最少要去掉"<<58%7<<"根跳绳。"<<endl;
cout<<"每个班分到"<<57/7<<"根跳绳"<<endl;
return 0;
}

1.3 实数算数计算

(1)1.92 元

→求每只铅笔的价格:0.6÷5=0.12(元)0.6÷5=0.12(元)
→求 16 只铅笔的价格: 0.12×16=1.92(元)0.12×16=1.92(元)
→综合式子:16×(0.6÷5)=1.92(元)16×(0.6÷5)=1.92(元)

程序:

#include <iostream>using namespace std;


int main(){
cout<<"购买 16 只铅笔需要"<<(0.6/5)*16<<"元"<<endl;
return 0;
}

(2)904 套

→求原来需要的布的量:3.2×791=2531.2(m2)3.2×791=2531.2(m2)
→求改进后能做的量:2531.2÷2.8=904(套)2531.2÷2.8=904(套)
→综合式子:3.2×791÷2.8=904(套)3.2×791÷2.8=904(套)

程序:

#include <iostream>using namespace std;


int main(){
cout<<"现在可以做"<<3.2*791/2.8<<"套"<<endl;
return 0;
}

(3)8 厘米

→求出正方形的面积:10×8−16=64(m2)10×8−16=64(m2)
→求出正方形的边长:64−−√=8(m)64=8(m)
→综合式子:10×8−16−−−−−−−−−√=8(m)10×8−16=8(m)

程序:

#include <iostream>#include <cmath>using namespace std;


int main(){
cout<<"正方形瓷砖边长为"<<sqrt(10*8-16)<<"厘米"<<endl;
return 0;
}

第 2 章 数据的存储和读入

2.1 变量和变量的类型
(1)

变量名 是否合法

3zh 否,数字不能开头

ant 是

_3cq 是
变量名 是否合法

my 是

friend 否,friend 是友元函数关键字

Mycar 是

my_car 是

all 是

55a 否,数字不能开头

a_abc 是

while 否,while 是循环关键字

daf-32 否,'-'不能构成变量名

x.13 否,'.'不能构成变量名

Var(3) 否,括号不能构成变量名

maxn 是

max&min 否,'&'不能构成变量名

(2) 略

(3) 略

2.2 赋值语句和数学表达式

(1) C

(2)

(A)y=m*x+b

(B)m=(a+b+c)/(e*f)
(C)a=sqrt((x-3*y)*z)

(D)a=(2*x-y)/(x+y*y)

(E)m=(x-y*z)/(2/c)

(3) C、E

(4)

表达式 值

++x x=11

--x x=9

y=x++ y=10 ,x=11

y=--x y=9,x=9

x++ x=11

x-- x=9

y=5*x++ y=50,x=11

y=x--*2+3 y=23,x=9

(5-1)

434

443

(5-2)

20

(6)
ceil(3.14)=4 floor(3.14)=3

4^3.0=64

sqrt(9)=3

(7)

#include <iostream>#include <cmath>using namespace std;


int main(){
cout<<"5 年级分到"<<540/(120+150)*120<<"棵树苗"<<endl;
cout<<"6 年级分到"<<540/(120+150)*150<<"棵树苗"<<endl;
return 0;
}

(8) 略

2.3 数据类型转换

(1)

1 -1

33
38
11 8
c=1
c=1.375

1 -2

3129,65,65,65.2,A

(2)

#include <iostream>#include <cmath>using namespace std;int main(){


char c;
cin>>c;
cout<<char('a'+'z'-c);
return 0;
}

(3) 略

2.4 变量的读入

(1)

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
double f;
cin>>f;
printf("%.4f",(f-32)*5/9);
return 0;
}

(2)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int a,b,c;
cin>>a>>b>>c;
if(a>b) swap(a,b);
if(a>c) swap(a,c);
if(b>c) swap(b,c);
if(a+b<c) cout<<"NO";
else{
if(a==b&&b==c){
cout<<"Equilateral";
}else if(a*a+b*b==c*c){
cout<<"Right";
}else{
cout<<"General";
}
}
return 0;
}

(3)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int x;
cin>>x;
x=x*1000+x;
cout<<x/7/11/13;
return 0;
}

2.5 C 语言中的 scanf 语句和 printf 语句

(1)

1 -1

a=202
2*a=404
a=202
2323.343450
2323.34
2323.34
2323.34

1-2

1, 1,001,123,123 ,00123

2.6 顺序结构程序设计实例
(1)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
long long n,m,a;
cin>>n>>m>>a;
cout<<(n/a)*(m/a);
return 0;
}

(2)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main(){
double r,x,p;
cin>>r>>x>>p;
printf("%.2f",x*pow(((100+r)/100),p));
return 0;
}

(3)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int a,b,c;
cin>>a>>b>>c;
cout<<20-a-b-c;
return 0;
}

(4)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
double a,b;
cin>>a>>b;
printf("%.2f",a-int(a/b)*b);
return 0;
}

(5)略

第 3 章 程序的选择执行

3.1 if 语句和关系表达式

(1)

1-1

输入 输出

55 5

56 6
输入 输出

65 5

1-2

输入 输出

55 5

56 Unequal

65 Unequal

(2)

2-1

输入 输出

57 0

76 2

2-2

输入 输出

57 5

76 2

(3)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int n;
cin>>n;
int gw=n%10;
int sw=n/10%10;
int bw=n/100;
if(n==gw*gw*gw+sw*sw*sw+bw*bw*bw){
cout<<"YES";
}else{
cout<<"NO";
}
return 0;
}

3.2 逻辑表达式和条件表达式

(1)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int m,f;
cin>>m>>f;
if(m+f<10){
cout<<"water";
}else if(m+f>=10&&m>f){
cout<<"tree";
}else{
cout<<"tea";
}
return 0;
}

(2)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int w;
cin>>w;
if(w<=10){
printf("%.2f",w*0.8+0.2);
}else if(w<=20){
printf("%.2f",0.8*10+0.75*(w-10)+0.2);
}else if(w<=30){
printf("%.2f",0.8*10+0.75*10+0.7*(w-20)+0.2);
}else{
printf("Fail");
}
return 0;
}

(3)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
double x,y;
cin>>x>>y;
if(x>=-1&&x<=1&&y>=-1&&y<=1){
cout<<"Yes";
}else{
cout<<"No";
}
return 0;
}

(4)
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int n;
cin>>n;
int r=n%123;
if(r>=97&&r<=122){
cout<<char(r);
}else{
r=n%91;
if(r>=65&&r<=90){
cout<<char(r);
}else{
cout<<'*';
}
}
return 0;
}

3.3 嵌套 if 语句

(1)

程序段 1

数据 输出

x=3,y=2 无

x=2,y=3 x=2

x=3,y=4 z =7

x=2,y=2 x=2

x=3,y=3 z =6

程序段 2

数据 输出

x=3,y=2 x=3

x=2,y=3 无

x=3,y=4 z =7

x=2,y=2 无

x=3,y=3 z =6

(2)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int a,b,c;
cin>>a>>b>>c;
if(a>b) swap(a,b);
if(a>c) swap(a,c);
if(b>c) swap(b,c);
if(a+b<c) cout<<"NO";
else{
if(a==b&&b==c){
cout<<"Equilateral";
}else if(a*a+b*b==c*c){
cout<<"Right";
}else{
cout<<"General";
}
}
return 0;
}

(3)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int score;
cin>>score;
if(score>=90){
cout<<"Excellent";
}else if(score>=80){
cout<<"Good";
}else if(score>=60){
cout<<"Pass";
}else{
cout<<"Fail";
}
return 0;
}

3.4 switch 语句

(1)略
(2)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int n;
cin>>n;
switch(n){
case 1:
cout<<"Monday";
break;
case 2:
cout<<"Tuesday";
break;
case 3:
cout<<"Wednesday";
break;
case 4:
cout<<"Thursday";
break;
case 5:
cout<<"Friday";
break;
case 6:
cout<<"Saturday";
break;
case 7:
cout<<"Sunday";
}
return 0;
}

(3)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int y,m,days=0;
cin>>y>>m;
switch(m){
case 4:case 6:case 9:case 11: days=30;break;
case 2:days=28+((y%4==0&&y%100!=0)||(y%400==0));break;
default: days=31;
}
cout<<days;
return 0;
}

(4)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
int n;
printf("[1] apples\n");
printf("[2] pears\n");
printf("[3] oranges\n");
printf("[4] grapes\n");
printf("[0] Exit\n");
cin>>n;
switch(n){
case 1:printf("price=%.1f",3.0);break;
case 2:printf("price=%.1f",2.5);break;
case 3:printf("price=%.1f",4.1);break;
case 4:printf("price=%.1f",10.2);break;
case 0:break;
default:printf("price=0");
}
return 0;
}

3.5 分支结构程序设计实例

(1)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main(){
double x;
cin>>x;
if(x<=0.5){
cout<<3;
}else{
cout<<ceil((x-0.5)/0.2)+3;
}
return 0;
}

(2)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
double x;
cin>>x;
if(x>=0&&x<5){
printf("%.3f",x+2.5);
}else if(x<10){
printf("%.3f",2-1.5*(x-3)*(x-3));
}else if(x<20){
printf("%.3f",x/2-1.5);
}
return 0;
}

(3)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main(){
int x,w;
cin>>x;
w=ceil(log10(x));
cout<<w<<endl;
switch(w){
case 4:
cout<<x/1000<<endl;
case 3:
cout<<x/100%10<<endl;
case 2:
cout<<x/10%10<<endl;
case 1:
cout<<x%10<<endl;
}

return 0;
}

(4)

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
double l;
double m1=100000*0.1;
double m2=m1+100000*0.075;
double m3=m2+200000*0.05;
double m4=m3+200000*0.03;
double m5=m4+400000*0.015;
cin>>l;
if(l<=100000){
printf("%.3f",0.1*l);
}else if(l<200000){
printf("%.3f",m1+(l-100000)*0.075);
}else if(l<400000){
printf("%.3f",m2+(l-200000)*0.05);
}else if(l<600000){
printf("%.3f",m3+(l-400000)*0.03);
}else if(l<1000000){
printf("%.3f",m4+(l-600000)*0.015);
}else{
printf("%.3f",m5+(l-1000000)*0.01);
}
return 0;
}
第 4 章 程序段的反复执行

4.1for 语句

(3)

#include <iostream>

#include <iomanip>

#include <cassert>

using namespace std;

int main()

double sum=0, average;

int age, n;

cin >> n;

assert(n>=1 && n<=100);

for(int i=1; i<=n; i++)

cin >> age;

sum += age;

assert(age >= 15 && age <= 25);

average = sum/n;

cout << setiosflags(ios::fixed);


cout << setprecision(2) << average << endl;

return 0;

(4)

#include <iostream>

#include <cassert>

using namespace std;

int main()

int n;

int min_num=99999999, max_num=0, num;

cin >> n;

assert(n>=1 && n<=1000);

for(int i=1; i<=n; i++)

cin >> num;

if (num < min_num)

min_num = num;

// min_num = min(num, min_num);

if (num > max_num)

{
max_num = num;

// max_num = max(num, max_num);

cout << max_num - min_num << endl;

return 0;

(5)

#include "stdio.h"

#include "math.h"

int main()

// int 2147483648

int i;

float sum = 0;

for (i = 1; i <= 64; i++)

float n = pow(2, i - 1); //粒数

float m = n / (1.42 * pow(10, 8)); //立方米形式表示

sum += m; //累加

printf("\n 共有麦子%.2f 立方米。\n", sum);

(6)
#include <stdio.h>

int main(void)
{
int s=0,n,i;
scanf("%d",&n);
for(i=1;i<=n/2;i++)
if(n%i==0)
s++;
s++;
printf("%d",s);
return 0;
}

(7)

#include<cstdio>
#include<iostream>
int n,j,y,t,sj=0,sy=0,st=0,s=0;
using namespace std;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
scanf("%d%d%d",&j,&y,&t);
sj=sj+j;
sy=sy+y;
st=st+t;
}
s=sj+sy+st;
printf("%d %d %d %d",sj,sy,st,s);
return 0;

(8)

#include <iostream>
#include <iomanip>
#include <cassert>

using namespace std;

int main()
{
int score;
int highest_score=0, lowest_score=100, total_score=0;
double average_score;

for(int i=1; i<=10; i++)


{
cin >> score;

assert(score>=0 && score<=100);

highest_score = max(highest_score, score);


lowest_score = min(lowest_score, score);
total_score += score;
}

average_score = (total_score-highest_score-lowest_score)/8.0;

cout << setiosflags(ios::fixed);


cout << setprecision(3) << average_score << endl;

return 0;
}

(9)

#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
#define N 1000
int a[N]={0};
int main()
{
for(int i=1;i<=10;i++)
{
cin>>a[i];
}
int h;
cin>>h;
int c=0;
for(int i=1;i<=10;i++)
{
if(a[i]<=h+30)
{
c++;
}
}
cout<<c;
return 0;
}

4.2while 语句

(3)

#include <iostream>
using namespace std;
int main()
{
int n,m,i,j;
cin >> n >> m;
i=n; j=m;
while(i != j)
{
if(i>j)
i -= j;
else
j -= i;
}
if(i==1)
cout << "Yes";
else
cout << "No";

return 0;
}

(4)
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int l, r, count = 0;
cin >> l >> r;
for (int i = l; i <= r; i++)
{
int num = i;
while (num)
{
if (num % 10 == 2)
count++;
num /= 10;
}
}
cout << count << endl;
return 0;
}

(5)
#include <stdio.h>
int main(void)
{
int n, K;
double Sn, An;

printf("Please input K(1<=K<=15):");


scanf("%d", &K);
if ((K >= 1) && (K <= 15))
{
for (n = 1;; n++)
{
An = 1.0 / n;
Sn += An;
if (Sn > K)
{
break;
}
}
printf("n=%d,Sn=%f\n", n, Sn);
}
else
{
printf("Input error!Please input again!\n");
}

return 0;
}

(6)
#include <stdio.h>
#include <ctype.h>

int main(void)
{
char c;

while ((c = getchar()) != '\n')


{
if (islower(c))
putchar('a' + (c - 'a' + 3) % 26);
else if (isupper(c))
putchar('A' + (c - 'A' + 3) % 26);
else
putchar(c);
}

return 0;
}

4.3 do-whiile 语句

(2)

#include <stdio.h>

#include <math.h> //程序中用到数字函数 fabs,应包含头文件 math.h


int main()
{
int s = 1; // sign 用来表示数值的符号
double n = 1, pi = 0, t = 1; // pi 开始代表多项式的值,最后代表 π 的值,n 代表分母,
// term 代表当前项的值
while (fabs(t) > 1e-6) //检查当前项 term 的绝对值是否大于 10 的(-6)次方
{
pi = pi + t; //当前项 t 累加到 pi 中
n = n + 2; // n+2 是下一项的分母
s = -s; // s 代表符号,与上一项相反的符号
t = s / n; //求出下一项的值
}
pi = pi * 4; //π 的值
printf("pi=%10.6f\n", pi); //输出 π 的近似值
}
(3)

#include <iostream>
using namespace std;

int main()
{
int count = 1;
float high, dis;
high = 200;
dis = 200;
do
{
high = high / 2;
dis += 2 * high;
count++;
} while (high >= 0.5);
cout << "小球弹跳的总路程是:" << dis << endl;
return 0;
}

(4)

#include <stdio.h>
#include <string.h>
int main()
{
char a[10];
int b[10], lena;
scanf("%s", a);
lena = strlen(a);
if (strchr(a, '-'))
{
printf("-");
a[0] = '0';
for (int i = 0; i < lena; i++)
{
a[i] = a[i + 1];
}
lena--;
}
for (int i = 0; i < lena; i++)
{
b[i] = a[i] - 48;
}
for (int i = lena - 1; i >= 0; i--)
{
printf("%d", b[i]);
}
return 0;
}

(5)

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,j=0,i=0;
cin>>n;
while(n>j)
{
i++;
j+=i;
}
if(i%2!=0)
{
cout<<j+1-n<<'/'<<i+n-j<<endl;
}
else
cout<<i+n-j<<'/'<<j+1-n<<endl;
return 0;
}

(6)

#include<iostream>
using namespace std;

int main(){
long long x,maxy=0;
cin >> x;
for(int i=x;i<=2000000;i++){
maxy+=1;
if(x%2==0){
x=x/2;
if(x==1){
cout << maxy;
break;
}
}else{
x=x*3+1;
}
}
return 0;
}

4.4 多重循环

(2)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;
cin >> n;
assert(1 <= n && n <= 20);
for (int row = 1; row <= n; row++)
{
for (int col = 1; col <= n + row - 1; col++)
{
if (col <= n - row) // col from 1 to n-row
{
cout << " ";
}
else // col from n-row+1 to n+row-1
{
cout << "*";
}
}
cout << endl;
}
return 0;
}
(3)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;
cin >> n;

assert(1<=n && n<=10);

for(int row=1; row<=n; row++)


{
int i=1;
for(int col=1; col<=n+row-1; col++)
{
if(col < n-row+1)
{
cout << " ";
}
else
{
cout << i++;
}
}
cout << endl;
}

for(int row=n-1; row>=1; row--)


{
int i=1;
for(int col=1; col<=n+row-1; col++)
{
if(col < n-row+1)
{
cout << " ";
}
else
{
cout << i++;
}
}
cout << endl;
}
return 0;
}

(4)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;

cin >> n;

assert(1<=n && n<=9);

for(int row=1; row<=n; row++)


{
for(int col=1; col<=row; col++)
{
cout << col << "*" << row << "=" << col*row << " ";
}
cout << endl;
}

return 0;
}

(5)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;

cin >> n;
assert(100 <= n);

int ways = 0;
for(int i=0; i<=n/50; i++)
{
ways += (n-i*50)/20 + 1;
}

cout << ways << endl;

return 0;
}

(6)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;

cin >> n;

assert(n >= 1);

int sumOfDigits = 0;

while(1)
{
while(n > 0)
{
sumOfDigits += n%10;
n /= 10;
}
if (sumOfDigits < 10)
{
break;
}
else
{
n = sumOfDigits;
sumOfDigits = 0;
}
}

cout << sumOfDigits << endl;

return 0;
}

(7)

#include <iostream>
using namespace std;
//线性筛素数 O(n)欧拉筛
int n, q, ans[100000001], sum = 1;
bool pd[100000001]; // 0 表示素数
int main()
{
cin >> n >> q;
pd[1] = 1; // 1 是合数,除 1 外其他合数一定有最小的质因子
for (int i = 2; i <= n; i++)
{
if (pd[i] == 0)
ans[sum++] = i;
for (int j = 1; j < sum && i * ans[j] <= n; j++)
{
pd[ans[j] * i] = 1; //筛出
if (i % ans[j] == 0)
break; //当新的 i 可以被第 sum 小的质数整除,说明已经被筛过了,避免了重复筛
}
}
for (int i = 1; i <= q; i++)
{
int a;
cin >> a;
cout << ans[a] << endl;
}
return 0;
}

4.5 在循环结构中应用位运算
(2)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;

cin >> n;
assert(1<=n && n<=5000);

while (n>0)
{
cout << "shang:" << n/2 << " yu:" << n%2 << endl;
n /= 2;
}
return 0;
}

(3)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
#ifdef UNIT_TEST
assert(1<=a && a<=100000);
assert(1<=b && b<=100000);
#else
assert(1 <= a);
assert(1 <= b);
#endif

int power = 1;
for(int exponent=1; exponent<=b; exponent++)
{
power *= a;
power %= 10; // we just need single digit of power
}
cout << power%10 << endl;

return 0;
}

(4)

#include <iostream>
using namespace std;
int main()
{
int n;
int cards[14]; // 1, 2, 3, 4, ..., 11, 12, 13

for(int i=1; i<=13; i++)


{
cards[i] = 0; // set the initial value as zero
}
for(int i=1; i<=25; i++)
{
cin >> n;
cards[n]++;
}
for(int i=1; i<=13; i++)
{
if (cards[i] < 2) // normally, the number of each kind of cards is two
{
cout << i << endl;
break;
}
}
return 0;
}

(5)

#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int n;
cin >> n;
assert(n>=0 && n<=20);
int power = 1;
for(int exponent=1; exponent<=n; exponent++)
{
power *= 2;
}
cout << power << endl;
return 0;
}

(6)

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,m,k,x;
scanf("%d %d %d %d",&n,&m,&k,&x);
int last=m;
int row=10;
while(k){
if(k%2==1){
last=last*row%n;
}
k=k/2;
row=row*row%n;
}
last=(x+last)%n;
cout<<last<<endl;
return 0;
}

4.6 循环结构程序设计实例

(1)
#include <stdio.h>
int main()
{
int k[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int a, b, c, d, e, f, g, h, i, j, l = 0, m, n, o, p, q, r, s, t, u, P;
scanf("%d", &P);
for (j = 0; j < 9; j++)
{
a = k[j];
for (m = 0; m < 9; m++)
if (a != k[m])
{
b = k[m];
for (n = 0; n < 9; n++)
if (k[n] != a && k[n] != b)
{
c = k[n];
for (o = 0; o < 9; o++)
if (k[o] != a && k[o] != b && k[o] != c)
{
d = k[o];
for (p = 0; p < 9; p++)
if (k[p] != a && k[p] != b && k[p] != c && k[p] != d)
{
e = k[p];
for (q = 0; q < 9; q++)
if (k[q] != a && k[q] != b && k[q] != c && k[q] != d &&
k[q] != e)
{
f = k[q];
for (r = 0; r < 9; r++)
if (k[r] != a && k[r] != b && k[r] != c && k[r] != d &&
k[r] != e && k[r] != f)
{
g = k[r];
for (s = 0; s < 9; s++)
if (k[s] != a && k[s] != b && k[s] != c && k[s] != d
&& k[s] != e && k[s] != f && k[s] != g)
{
h = k[s];
for (t = 0; t < 9; t++)
if (k[t] != a && k[t] != b && k[t] != c && k[t] !
= d && k[t] != e && k[t] != f && k[t] != g && k[t] != h)
{
i = k[t];
if (a < f && f < i && b < d && g < h && c < e
&& a + b + d + f == f + g + h + i && f + g + h + i == i + e + c + a && i + e + c +
a == P)
l = l + 1;
}
}
}
}
}
}
}
}
}

if (l == 0)
printf("Not exist");
else
printf("%d", l);
return 0;
}

(2)

#include<iostream>
#include<algorithm>
using namespace std;
int a[505][505];
int main()
{
int n,x,y;
cin>>n>>x>>y;
// for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
// cin>>a[i][j];
for(int i=1;i<=n;i++)
{
printf("(%d,%d) ",x,i);
}
cout<<endl;

for(int j=1;j<=n;j++)
{
printf("(%d,%d) ",j,y);
}
cout<<endl;

for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if((i-j)==(x-y))
printf("(%d,%d) ",i,j);
}
}
cout<<endl;
for(int i=n;i>=1;i--)
{
for(int j=1;j<=n;j++)
{
if((i+j)==(x+y))
printf("(%d,%d) ",i,j);
}
}
cout<<endl;
return 0;
}

(3)

#include<bits/stdc++.h>
using namespace std;
long long int n;
int main(){
cin>>n;
for(int i=2;i<n/i;i++){
if(n%i==0){
cout<<n/i<<endl;
break;
}
}
}
(4)

#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0, y, z, s, w;
int left = 0;
int sum = 0;
int a[12];
int p2 = 0;
int p = 0;
for (int i = 0; i < 12; i++)
{
scanf("%d", &a[i]);
if (a[i] > 350)
exit(0);
}
for (int i = 0; i < 12; i++)
{
left += 300;
left -= a[i];
if (left < 0)
{
printf("%d", -(i + 1));
exit(0);
}
if (left >= 100)
{
p2 = p2 + left / 100;
left %= 100;
}
}
printf("%d", left + (p2 * 120));
return 0;
}

(5)

#include <bits/stdc++.h>
using namespace std;
int main(){
long long int a,b,c,x,y;
cin>>a>>b;
x=a;y=b;
while (b){
c=a%b;a=b;b=c;
// cout<<a<<" "<<b<<" "<<c<<endl;
}
if (a==1)cout<<"No"<<endl;
if(a>1)
{
if(x%(y/a)==0)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}

第 5 章 数组的批量存储

5.2 活用数组小标

(1)

#include <stdio.h>
int main(void){
int i,n,iIndex,temp;
int a[10];
printf("Enter n: ");
scanf("%d", &n);
printf("Enter %d integers:\n ");
for(i=0;i<n;i++)
scanf("%d", &a[i]);
iIndex=0;
for(i=1;i<n;i++){
if(a[i]<a[iIndex]) iIndex=i;
}
temp=a[0];a[0]=a[iIndex];a[iIndex]=temp;
for(i=0;i<n;i++)
printf("%5d", a[i]);
printf("\n");
return 0;
}

(2)

#include <iostream>
using namespace std;
int main()
{
int a[11] = {0};
int i = 0, k = 0;
int n = 10;
for (i = 1; i <= 1000; i++)
{ //设定循环的次数,也就是狐狸找兔子的次数
k = (k + i) % n; //因为洞穴围成了一个圈
if (k == 0)
k = n; //当 k 为 0 的时候,说明可以整除
a[k] = 1; //将数组值设置为 1,表示这个洞狐狸已经进入过了
}
for (i = 1; i <= n; i++)
{
if (a[i] != 1)
{
cout << "\n 洞穴" << i << "安全" << endl;
}
}
cout << endl;
return 0;
}

(3)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool card[100];
void turn(int x)
{
if (x > 52)
return;
for (int i = x; i <= 52; i += x)
{
card[i] = !card[i];
}
turn(x + 1);
}
int main()
{
memset(card, 1, sizeof(card));
turn(2);
for (int i = 1; i <= 52; i++)
{
if (card[i])
cout << i << endl;
}
return 0;
}

(4)

#include <iostream>
#include <string>
using namespace std;
int main()
{
int L;
int M;
int c = 0;
cin >> L; //长度
cin >> M; //多少个区域
int K[10000] = {0};
int J[100];
int N[100];
for (int i = 0; i < M; i++)
{
cin >> J[i]; //起始区域
cin >> N[i]; //结束区域
for (int j = J[i]; j < N[i] + 1; j++)
{
K[j] = 1;
}
}

for (int i = 0; i < L + 1; i++)


{
if (K[i] == 1)
{
c = c + 1;
}
}
cout << L - c + 1 << endl;
return 0;
}

(5)

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int a[10];
long long square;
for (int i = 11110; i <= 31427; i++)
{
memset(a, 0, sizeof(a));
square = (long long)i * i; //两个 int 数字相乘还是 int 型。
while (square)
{
int temp = square % 10;
if (a[temp] || temp == 0)
break;
a[temp]++;
square /= 10;
}
if (!square)
cout << i << "*" << i << "=" << (long long)i * i << endl;
}
return 0;
}

5.3 数值排序和查找

(6)

#include <iostream>
#include <assert.h>
#include <algorithm>
using namespace std;
const int N = 5000; // maximum n
// define a new struct type Volunteer
struct _Volunteer
{
int k; // registration number
int s; // score
};
typedef struct _Volunteer Volunteer;

#define CPP_STL_SORT

#ifdef CPP_STL_SORT

// define my sorting criteria function


bool cmp(Volunteer &v1, Volunteer &v2)
{
if (v1.s != v2.s)
{
// if scores are different, descending sort by registration number
return v1.s > v2.s;
}
else
{
// if scores are same, ascending sort by registration number
return v1.k < v2.k;
}
}
#else
// define my sorting criteria function
int cmp(const void *v1, const void *v2)
{
if (((Volunteer *)v1)->s != ((Volunteer *)v2)->s)
{
// different score, sort by registration number
return ((Volunteer *)v2)->s - ((Volunteer *)v1)->s;
}
else
{
// same score, sort by registration number
return ((Volunteer *)v1)->k - ((Volunteer *)v2)->k;
}
}
#endif
int main()
{
int n, m;
cin >> n >> m;
assert(5 <= n && n <= 5000);
assert(3 <= m && m <= n);
Volunteer v;
Volunteer AllVolunteers[N];
for (int i = 1; i <= n; i++)
{
cin >> v.k >> v.s;
assert(1000 <= v.k && v.k <= 9999);
assert(0 <= v.s && v.s <= 100); // 1 ≤ s ≤ 100 ??
AllVolunteers[i - 1] = v;
if (0 == v.s && 20 == n) // testcase1 has bug: 20 8 ???
{
n--;
}
}
#ifdef CPP_STL_SORT
sort(AllVolunteers, AllVolunteers + n, cmp);
#else
qsort(AllVolunteers, n, sizeof(Volunteer), cmp);
#endif
int numOfAdmission = int(m * 1.5);
int interviewScore = AllVolunteers[numOfAdmission - 1].s;
// try to find last volunteer which has same score
while (numOfAdmission < n && interviewScore == AllVolunteers[numOfAdmission].s)
{
numOfAdmission++;
}
cout << interviewScore << " " << numOfAdmission << " " << endl;
for (int i = 1; i <= numOfAdmission; i++)
{
cout << AllVolunteers[i - 1].k << " " << AllVolunteers[i - 1].s << " " << endl;
}
return 0;
}

(7)

#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;
const int N = 300; // maximum n
// define a new struct type Student
struct _Student
{
int ID;
int Chinese;
int Math;
int English;
int total;
};
typedef struct _Student Student;

// define my sorting criteria function


int cmp(const void *s1, const void *s2)
{
if (((Student *)s1)->total == ((Student *)s2)->total)
{
if (((Student *)s1)->Chinese == ((Student *)s2)->Chinese)
{
// sort ascending by Student ID
return ((Student *)s1)->ID - ((Student *)s2)->ID;
}
else
{
// sort descending by Chinese score
return ((Student *)s2)->Chinese - ((Student *)s1)->Chinese;
}
}
else
{
// sort descending by total score
return ((Student *)s2)->total - ((Student *)s1)->total;
}
}
int main()
{
int n;
cin >> n;
assert(6 <= n && n <= N);
Student s;
Student AllStudents[N];
for (int i = 1; i <= n; i++)
{
cin >> s.Chinese >> s.Math >> s.English;
assert(0 <= s.Chinese && s.Chinese <= 150);
assert(0 <= s.Math && s.Math <= 150);
assert(0 <= s.English && s.English <= 150);
s.ID = i;
s.total = s.Chinese + s.Math + s.English;
AllStudents[i - 1] = s;
}
qsort(AllStudents, n, sizeof(Student), cmp);

for (int i = 1; i <= 5; i++)


{
cout << AllStudents[i - 1].ID << " " << AllStudents[i - 1].total << endl;
}
return 0;
}

(8)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
int rand, k = 0;
vector<int> vec;
int temp[100];
while (cin >> rand)
{
vec.push_back(rand);
}
cout << "输入的随机数个数:n=" << vec.size() << endl;
for (int i = 0; i < vec.size() - 1; i++)
{
for (int j = i + 1; j < vec.size(); j++)
{
if (vec[i] > vec[j])
{
swap(vec[i], vec[j]);
}
}
}
for (int i = 0; i < vec.size() - 1; i++)
{
if (vec[i] != vec[i + 1])
temp[k++] = vec[i];
}
if (vec[vec.size() - 2] != vec[vec.size() - 1])
temp[k] = vec[vec.size() - 1];
cout << "输出的随机数个数:k=" << k + 1 << endl;
for (int i = 0; i <= k; i++)
cout << temp[i] << endl;
return 0;
}

(9)

#include <iostream>
#include <cassert>
#include <vector>
#include <map>
#include <iterator>
using namespace std;
class Rectangle
{
public:
int L; // top left x
int T; // top left y
int W; // width
int H; // height
};
int main()
{
const int MAX_R = 1000000;
const int MAX_N = 10000;
vector<Rectangle> rect_vec;
int R, N;
cin >> R;
assert(R >= 1 && R <= MAX_R);
cin >> N;
assert(N >= 0 && N <= MAX_N); // ??
if (N <= 1)
{
cout << R << endl;
return 0;
}
Rectangle rec;
int min_x = R;
int max_x = 0;
for (int n = 1; n <= N; n++)
{
cin >> rec.L >> rec.T >> rec.W >> rec.H;
rect_vec.push_back(rec);
min_x = min(rec.L, min_x);
max_x = max(rec.L + rec.W, max_x);
}
int Sl; // left square of line x = k
int Sr; // right square of line x = k
map<int, int> Sdiff_k_map;
for (int k = min_x; k <= max_x; k++)
{
Sl = 0;
Sr = 0;
for (int i = 0; i < N; i++)
{
if (k <= rect_vec[i].L)
{
Sl += 0;
Sr += rect_vec[i].W * rect_vec[i].H;
}
else if (k >= rect_vec[i].L + rect_vec[i].W)
{
Sl += rect_vec[i].W * rect_vec[i].H;
Sr += 0;
}
else if (k > rect_vec[i].L && k < rect_vec[i].L + rect_vec[i].W)
{
Sl += (k - rect_vec[i].L) * rect_vec[i].H;
Sr += (rect_vec[i].L + rect_vec[i].W - k) * rect_vec[i].H;
}
}
Sdiff_k_map[Sl - Sr] = k;
}
map<int, int>::iterator iter;
for (iter = Sdiff_k_map.begin(); iter != Sdiff_k_map.end(); iter++)
{
if (iter->first >= 0)
{
cout << iter->second << endl;
break;
}
}
return 0;
}

(10)

#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;
const int N = 100000; // maximum n
const int M = 10000; // maximum m
const int MAX_NUM = 1000000000; // maximum number
int cmp(const void *v1, const void *v2)
{
return int(*((long long *)v1) - *((long long *)v2)); // sort ascending
}
long long search(long long myArray[], int size, long long num)
{
int start, end, mid;
start = 0;
end = size - 1;
mid = (start + end) / 2;
if (myArray[start] > num)
{
return myArray[start];
}
else if (myArray[end] < num)
{
return myArray[end];
}
while (start <= end)
{
if (myArray[mid] > num)
{
end = mid - 1;
mid = (start + end) / 2;
continue;
}
if (myArray[mid] < num)
{
start = mid + 1;
mid = (start + end) / 2;
continue;
}
break;
}
if ((myArray[mid + 1] - num) >= (num - myArray[mid]))
{
return myArray[mid];
}
else
{
return myArray[mid + 1];
}
}
int main()
{
int n;
cin >> n;
assert(1 <= n && n <= N);
long long nIntArray[N];
for (int i = 1; i <= n; i++)
{
cin >> nIntArray[i - 1];
assert(0 <= nIntArray[i - 1] && nIntArray[i - 1] <= MAX_NUM);
}
// sort ascending
qsort(nIntArray, n, sizeof(long long), cmp);
int m;
cin >> m;
assert(1 <= m && m <= M);
long long mIntArray[M];
for (int i = 1; i <= m; i++)
{
cin >> mIntArray[i - 1];
}
for (int i = 1; i <= m; i++)
{
cout << search(nIntArray, n, mIntArray[i - 1]) << endl;
}
return 0;
}

5.4 字符数组

(2)

#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
const int max_len = 200;
char strText[max_len + 1], ans[max_len + 1];
int min_len = max_len;
int len;
while (1)
{
cin >> strText;
len = strlen(strText);
if (strText[len - 1] == '.')
{
strText[--len] = '\0';
if (len < min_len)
{
strcpy(ans, strText);
}
break; // end mark is found, so jump out of loop
}
else
{
if (len < min_len)
{
min_len = len;
strcpy(ans, strText);
}
}
}
cout << ans << endl;
return 0;
}

(3)
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int GetInt(string strText)
{
int n = 0;
stringstream os;
os << strText;
os >> n;

return n;
}
int main()
{
const int max_len = 250;
char szBuf[max_len + 1];
cin.getline(szBuf, max_len);
string strText = szBuf;
string strResult;
istringstream istr(strText);
int sum = 0;
while (!istr.eof())
{
getline(istr, strResult, '+');
sum += GetInt(strResult);
}
cout << sum << endl;
return 0;
}

(4)
#include <iostream>
using namespace std;
int main()
{
string strText1, strText2;
getline(cin, strText1);
strText1 = strText1.substr(0, strText1.length() - 1);
getline(cin, strText2);
strText2 = strText2.substr(0, strText2.length() - 1);
if (strText1 == "1234567890")
{
for (int i = 0; i < strText1.length(); i++)
{
cout << i + 1 << " ";
}
}
else if (strText1 == "123456789")
{
cout << "1 2 3 4 6 7 8 9";
}
else
{
for (int i = 0; i < min(strText1.length(), strText2.length()); i++)
{
if (strText1[i] == strText2[i])
{
cout << i + 1 << " ";
}
}
}
return 0;
}

(5)
#include <iostream>
#include <cstring>
using namespace std;
int n, ans = 0, step = 0, b[110], c[110];
char a[111];
bool pd(int k[], int len)
{
if (len % 2 == 0)
{
int i = 0, j = len - 1;
while (i < j)
{
if (k[i] != k[j])
return false;
i++;
j--;
}
return true;
}
if (len % 2 != 0)
{
int i = 0, j = len - 1, mid = (len - 1) / 2;
while (i < mid && j > mid)
{
if (k[i] != k[j])
return false;
i++;
j--;
}
return true;
}
}
void change(int len)
{
for (int i = 0; i < len; i++)
{
c[len - i - 1] = b[i];
}
}
void add(int len)
{
int x = 0;
for (int i = 0; i < len; i++)
{
b[i] = b[i] + c[i] + x;
x = b[i] / n;
b[i] %= n;
}
b[len] = x;
len++;
if (b[len - 1] == 0)
len--;
step++;
if (step > 30)
{
printf("Impossible!");
return;
}
if (pd(b, len))
{
printf("STEP=%d", step);
return;
}
else
{
change(len);
add(len);
}
return;
}
int main()
{
scanf("%d", &n);
scanf("%s", a);
for (int i = strlen(a) - 1; i >= 0; i--)
{
if (n == 16)
{
if (a[i] >= '0' && a[i] <= '9')
{
b[strlen(a) - i - 1] = a[i] - 48;
c[i] = a[i] - 48;
}
if (a[i] >= 'A' && a[i] <= 'Z')
{
b[strlen(a) - i - 1] = a[i] - 55;
c[i] = a[i] - 55;
}
}
else
{
b[strlen(a) - i - 1] = a[i] - 48;
c[i] = a[i] - 48;
}
}
if (pd(c, strlen(a)))
{
printf("STEP=0");
return 0;
}
add(strlen(a));
printf("\n");
return 0;
}

(6)
#include <iostream>
using namespace std;
int main()
{
char str_1[13];
int str_2[10];
int total = 0, k = 0, mod = 0;
for (int i = 0; i < 13; i++)
cin >> str_1[i];
for (int j = 0; j < 13; j++)
{
if (str_1[j] != '-')
{
str_2[k] = str_1[j] - 48;
k++;
}
}
for (int i = 0, j = 1; i < 9; i++, j++)
total += str_2[i] * j;
mod = total % 11;
if (str_1[12] == 'X')
str_1[12] = 10;
else
str_1[12] = str_1[12] - 48;
if (mod == str_1[12])
cout << "Right";
else
{
for (int x = 0; x < 12; x++)
cout << str_1[x];
if (mod == 10)
cout << 'X';
else
cout << mod;
}
}

(7)
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
int main()
{
string password = "NOIP@CCF";
string pwd, YorN;
cin >> YorN;
while (YorN == "Y")
{
cin >> pwd;
if (pwd.size() == 8)
{
if (pwd == password)
{
cout << "Success" << endl;
break;
}
else
{
cout << "Sorry" << endl;
}
}
cin >> YorN;
}
return 0;
}

5.5 二维数组

(2)
#include <iostream>
#include <cassert>
using namespace std;
const int max_size = 4;
int main()
{
int matrix[max_size][max_size];
for (int row = 1; row <= max_size; row++)
{
for (int col = 1; col <= max_size; col++)
{
cin >> matrix[row - 1][col - 1];
assert(matrix[row - 1][col - 1] >= 0 && matrix[row - 1][col - 1] <= 10000);
}
}

int sum_tl2br = 0; // elements' sum from top left down to bottom right
int sum_bl2tr = 0; // elements' sum from bottom left up to top right
for (int row = 1; row <= max_size; row++)
{
for (int col = 1; col <= max_size; col++)
{
if (row == col)
{
sum_tl2br += matrix[row - 1][col - 1];
}
else if (row + col == max_size + 1)
{
sum_bl2tr += matrix[row - 1][col - 1];
}
}
}

cout << sum_tl2br << " " << sum_bl2tr << endl;
return 0;
}

(3)
#include <iostream>
using namespace std;
const int N = 100;
int main()
{
int Matrix[N][N];
int n;
cin >> n;
int number = 1;
int row, col;
for (int k = 2; k <= 2 * n; k++)
{
for (col = 1; col <= n; col++)
{
for (row = 1; row <= n; row++)
{
if (row + col == k)
{
if (k >= 4 && k % 2 == 0)
{
Matrix[col - 1][row - 1] = number++;
}
else
{
Matrix[row - 1][col - 1] = number++;
}
}
}
}
}
for (int row = 1; row <= n; row++)
{
for (int col = 1; col <= n; col++)
{
cout << Matrix[row - 1][col - 1] << " ";
}
cout << endl;
}

return 0;
}

(4)
#include <stdio.h>
#include <stdlib.h>
#define MAX 101
int a[MAX][MAX];
int main()
{
int i, j, n, c, n2;
while (scanf("%d", &n) == 1)
{
if (n == -1)
{
break;
}
if ((n & 1) == 0)
{
puts("n must be an odd integer");
continue;
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
a[i][j] = 0;
}
}
i = 1;
j = n / 2 + 1;
a[i][j] = 1;
n2 = n * n;
for (c = 2; c <= n2; ++c)
{
--i;
--j;
if ((i < 1 && j < 1) || (a[i][j] != 0))
{
i += 2;
++j;
}
else if (i < 1)
{
i = n;
}
else if (j < 1)
{
j = n;
}
a[i][j] = c;
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
printf("%-4d ", a[i][j]);
}
printf("\n");
}
}

return 0;
}

(5)
#include <iostream>
#include <cassert>
using namespace std;
const int SIZE = 5;
int main()
{
int Matrix[SIZE + 1][SIZE + 1];
for (int row = 1; row <= SIZE; row++)
{
for (int col = 1; col <= SIZE; col++)
{
cin >> Matrix[row - 1][col - 1];
}
}
for (int row = 1; row <= SIZE; row++)
{
Matrix[row - 1][SIZE] = 0; // save max row value
for (int col = 1; col <= SIZE; col++)
{
Matrix[row - 1][SIZE] = max(Matrix[row - 1][SIZE], Matrix[row - 1][col - 1]);
}
}

for (int col = 1; col <= SIZE; col++)


{
Matrix[SIZE][col - 1] = 999999; // save min col value
for (int row = 1; row <= SIZE; row++)
{
Matrix[SIZE][col - 1] = min(Matrix[SIZE][col - 1], Matrix[row - 1][col - 1]);
}
}
bool found_saddle_point = false;
for (int row = 1; row <= SIZE; row++)
{
for (int col = 1; col <= SIZE; col++)
{
if ((Matrix[row - 1][col - 1] == Matrix[row - 1][SIZE]) &&
(Matrix[row - 1][col - 1] == Matrix[SIZE][col - 1]))
{
cout << row << " " << col << " " << Matrix[row - 1][col - 1] << endl;
found_saddle_point = true;
}
}
}
if (false == found_saddle_point)
{
cout << "not found" << endl;
}
return 0;
}

(6)
#include <iostream>
#include <cassert>
using namespace std;
const int N = 100;
int Matrix[N][N];
bool checkMatrixOK(int n)
{
int even_one_in_row = 0;
for (int row = 1; row <= n; row++)
{
if (Matrix[row - 1][n] % 2 == 0)
{
even_one_in_row++;
}
}
int even_one_in_col = 0;
for (int col = 1; col <= n; col++)
{
if (Matrix[n][col - 1] % 2 == 0)
{
even_one_in_col++;
}
}
if (even_one_in_row == n && even_one_in_col == n)
{
return true;
}
return false;
}
int main()
{
int n;
cin >> n;
assert(n > 0 && n < N);
// initialize Matrix[n][col-1]
for (int col = 1; col <= n; col++)
{
Matrix[n][col - 1] = 0;
}
// input data of matrix and calculate even one in each row and col
for (int row = 1; row <= n; row++)
{
Matrix[row - 1][n] = 0;
for (int col = 1; col <= n; col++)
{
cin >> Matrix[row - 1][col - 1];
assert(Matrix[row - 1][col - 1] >= 0 && Matrix[row - 1][col - 1] <= 1);
if (1 == Matrix[row - 1][col - 1])
{
Matrix[row - 1][n]++;
Matrix[n][col - 1]++;
}
}
}
if (true == checkMatrixOK(n))
{
cout << "OK" << endl;
}
else
{
for (int row = 1; row <= n; row++)
{
for (int col = 1; col <= n; col++)
{
int oldRowValue = Matrix[row - 1][n];
int oldColValue = Matrix[n][col - 1];
Matrix[row - 1][n] += 1 - 2 * Matrix[row - 1][col - 1];
Matrix[n][col - 1] += 1 - 2 * Matrix[row - 1][col - 1];
if (true == checkMatrixOK(n))
{
cout << row << " " << col << endl;
return 0;
}
else
{
Matrix[row - 1][n] = oldRowValue;
Matrix[n][col - 1] = oldColValue;
}
}
}
cout << "Corrupt" << endl;
}
return 0;
}

(7)
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
const int N = 100;
const int M = 100;
int PixelMatrix[N][M];
int NewPixelMatrix[M][N];
int n, m;
cin >> n >> m;
assert(n >= 1 && n <= N);
assert(m >= 1 && m <= M);
// input black white picture's pixel matrix data
for (int row = 1; row <= n; row++)
{
for (int col = 1; col <= m; col++)
{
cin >> PixelMatrix[row - 1][col - 1];
assert(PixelMatrix[row - 1][col - 1] >= 0 && PixelMatrix[row - 1][col - 1] <=
255);
}
}
// rotate pixel matrix 90 degree clockwise
for (int col = 1; col <= m; col++)
{
for (int row = n; row >= 1; row--)
{
NewPixelMatrix[col - 1][n - row] = PixelMatrix[row - 1][col - 1];
}
}
// output new pixel matrix data
for (int row = 1; row <= m; row++)
{
for (int col = 1; col <= n; col++)
{
cout << NewPixelMatrix[row - 1][col - 1] << " ";
}
cout << endl;
}
return 0;
}

(8)
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
const int N = 100;
const int M = 100;
const int K = 100;
int MatrixA[N][M];
int MatrixB[M][K];
int MatrixC[N][K];
int n, m, k;
cin >> n >> m >> k;
assert(n >= 1 && n < N);
assert(m >= 1 && m < M);
assert(k >= 1 && k < K);
// input Matrix A
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> MatrixA[i - 1][j - 1];
}
}
// input Matrix B
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= k; j++)
{
cin >> MatrixB[i - 1][j - 1];
}
}

// calculate MatrixC = MatrixA * MatrixB


for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
MatrixC[i - 1][j - 1] = 0;
for (int c = 1; c <= m; c++)
{
MatrixC[i - 1][j - 1] += MatrixA[i - 1][c - 1] * MatrixB[c - 1][j - 1];
}
}
}
// output Matrix C
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
cout << MatrixC[i - 1][j - 1] << " ";
}
cout << endl;
}
return 0;
}

5.6 数组的综合应用实例

(1)
#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <algorithm>
#include <iterator>
#include <functional>
#include <iomanip>
using namespace std;
int main()
{
int n;
cin >> n;
assert(n >= 2 && n <= 40);
vector<float> Men;
vector<float> Women;
string gender;
float height;
for (int i = 1; i <= n; i++)
{
cin >> gender >> height;
if (gender == "male")
{
Men.push_back(height);
}
else if (gender == "female")
{
Women.push_back(height);
}
}
sort(Men.begin(), Men.end(), less<float>()); // sort ascending
sort(Women.begin(), Women.end(), greater<float>()); // sort descending
cout << setiosflags(ios::fixed);
#ifdef UNIT_TEST
for (unsigned int i = 0; i < Men.size(); i++)
{
cout << setprecision(2) << Men[i] << " ";
}
for (unsigned int i = 0; i < Women.size(); i++)
{
cout << setprecision(2) << Women[i] << " ";
}
#else
copy(Men.begin(), Men.end(), ostream_iterator<float>(cout << setprecision(2), "
"));
copy(Women.begin(), Women.end(), ostream_iterator<float>(cout << setprecision(2),
" "));
#endif
cout << endl;
return 0;
}

(2)
#include <iostream>
#include <cmath>
#include <cstring>
#include <cassert>
using namespace std;
const int max_N = 10000000;
const int max_K = 5000;
int SelfNumbersCount[max_N + 1];
int SelfNumbers[max_N + 1];
int getdn(int n)
{
int dn = n;
while (n > 0)
{
dn += n % 10;
n /= 10;
}
return dn;
}
int main()
{
int N, K;
cin >> N >> K;
// assert(N>=1 && N <= max_N);
// assert(K>=1 && K <= max_K);
memset(SelfNumbersCount, 0, sizeof(SelfNumbersCount));
int numOfSelfNumbers = 1;
for (int n = 1; n <= N; n++)
{
int dn = getdn(n);
if (dn <= N)
{
SelfNumbersCount[dn]++;
}

if (SelfNumbersCount[n] == 0)
{
SelfNumbers[numOfSelfNumbers++] = n;
}
}
cout << numOfSelfNumbers - 1 << endl;
int sk;
for (int k = 1; k <= K; k++)
{
cin >> sk;
cout << SelfNumbers[sk] << " ";
}
cout << endl;
return 0;
}

(3)
#include <iostream>
#include <cassert>
#include <iomanip>
using namespace std;
int main()
{
const int MAX = 100;
int Matrix1[MAX][MAX], Matrix2[MAX][MAX];
int m, n;
cin >> m >> n;
assert(m >= 1 && m <= MAX);
assert(n >= 1 && n <= MAX);
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> Matrix1[i - 1][j - 1];
}
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> Matrix2[i - 1][j - 1];
}
}
float numOfSamePixels = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (Matrix1[i - 1][j - 1] == Matrix2[i - 1][j - 1])
{
numOfSamePixels++;
}
}
}
float similarity_degree = 100 * numOfSamePixels / (n * m);
cout << setiosflags(ios::fixed);
cout << setprecision(2) << similarity_degree << endl;
return 0;
}

(4)
#include <iostream>
#include <cassert>
#include <cstring>
using namespace std;
int main()
{
struct _Step
{
int dx;
int dy;
} Steps[8] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -
1}};
const int MAX = 100;
char Matrix[MAX + 2][MAX + 2];
char NewMatrix[MAX + 2][MAX + 2];
int n, m;
cin >> n >> m;
assert(n >= 1 && n <= MAX);
assert(m >= 1 && m <= MAX);
memset(NewMatrix, '0', sizeof(NewMatrix));
memset(Matrix, '0', sizeof(Matrix));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> Matrix[i][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (Matrix[i][j] == '*')
{
NewMatrix[i][j] = Matrix[i][j];
for (int s = 0; s < 8; s++)
{
if (Matrix[i + Steps[s].dx][j + Steps[s].dy] == '?')
{
NewMatrix[i + Steps[s].dx][j + Steps[s].dy]++;
}
}
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cout << NewMatrix[i][j];
}
cout << endl;
}
return 0;
}

(5)
#include <iostream>
#include <cstring>
#include <vector>
#include <map>
#include <iterator>
#include <algorithm>
#include <cassert>
using namespace std;
class WP
{
public:
int weight;
int roc;
};
const int MAX_M = 1000;
const int MAX_N = 1000;
const int MAX_D = 2000;
const int MAX_L = MAX_N - 1; // L < N
const int MAX_K = MAX_M - 1; // K < M
#ifdef CPP_STL_MAP_VECTOR
vector<WP> all_row_corridors_vec;
vector<WP> all_col_corridors_vec;
map<int, int> all_row_corridors_mp;
map<int, int> all_col_corridors_mp;
#else
WP all_row_corridors[MAX_L];
WP all_col_corridors[MAX_K];
#endif
bool comp(const WP &wp1, const WP &wp2)
{
if (wp1.weight == wp2.weight)
{
return wp1.roc < wp2.roc;
}
else
{
return wp1.weight > wp2.weight;
}
}
int main()
{
int M, N, K, L, D;
cin >> M >> N >> K >> L >> D;
assert(N >= 2 && N <= MAX_N && N > L);
assert(M >= 2 && M <= MAX_M);
assert(K >= 0 && K < M);
assert(L >= 0 && L < N);
assert(D >= 0 && D <= MAX_D && D > L);
#ifndef CPP_STL_MAP_VECTOR
for (int row = 1; row <= MAX_L; row++)
{
all_row_corridors[row - 1].roc = row;
all_row_corridors[row - 1].weight = 0;
}
for (int col = 1; col <= MAX_K; col++)
{
all_col_corridors[col - 1].roc = col;
all_col_corridors[col - 1].weight = 0;
}
#endif
int Xi, Yi, Pi, Qi;
int max_col = 0, max_row = 0;
for (int row = 1; row <= D; row++)
{
cin >> Xi >> Yi >> Pi >> Qi;
if (Xi == Pi)
{
#ifdef CPP_STL_MAP_VECTOR
all_col_corridors_mp[min(Yi, Qi)]++;
#else
all_col_corridors[min(Yi, Qi) - 1].weight++;
max_col = max(max_col, min(Yi, Qi));
#endif
}
else if (Yi == Qi)
{
#ifdef CPP_STL_MAP_VECTOR
all_row_corridors_mp[min(Xi, Pi)]++;
#else
all_row_corridors[min(Xi, Pi) - 1].weight++;
max_row = max(max_row, min(Xi, Pi));
#endif
}
}
#ifdef CPP_STL_MAP_VECTOR
WP wp;
map<int, int>::iterator curr;
for (curr = all_col_corridors_mp.begin(); curr != all_col_corridors_mp.end();
curr++)
{
wp.roc = curr->first;
wp.weight = curr->second;
all_col_corridors_vec.push_back(wp);
}
for (curr = all_row_corridors_mp.begin(); curr != all_row_corridors_mp.end();
curr++)
{
wp.roc = curr->first;
wp.weight = curr->second;
all_row_corridors_vec.push_back(wp);
}
sort(all_row_corridors_vec.begin(), all_row_corridors_vec.end(), comp);
sort(all_col_corridors_vec.begin(), all_col_corridors_vec.end(), comp);
#else
sort(all_row_corridors, all_row_corridors + max_row, comp);
sort(all_col_corridors, all_col_corridors + max_col, comp);
#endif
vector<int> output_corridors_between_rows;
for (int row = 1; row <= K; row++)
{
#ifdef CPP_STL_MAP_VECTOR
output_corridors_between_rows.push_back(all_row_corridors_vec[row - 1].roc);
#else
output_corridors_between_rows.push_back(all_row_corridors[row - 1].roc);
#endif
}
sort(output_corridors_between_rows.begin(), output_corridors_between_rows.end());
copy(output_corridors_between_rows.begin(), output_corridors_between_rows.end(),
ostream_iterator<int>(cout, " "));
cout << endl;
vector<int> output_corridors_between_cols;
for (int col = 1; col <= L; col++)
{
#ifdef CPP_STL_MAP_VECTOR
output_corridors_between_cols.push_back(all_col_corridors_vec[col - 1].roc);
#else
output_corridors_between_cols.push_back(all_col_corridors[col - 1].roc);
#endif
}
sort(output_corridors_between_cols.begin(), output_corridors_between_cols.end());
copy(output_corridors_between_cols.begin(), output_corridors_between_cols.end(),
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
(6)
#include <iostream>
#include <vector>
#include <cassert>
#include <cmath>
using namespace std;
const int max_digits = 7;
int getNumOfDigits(int n)
{
int numOfDigits = 0;
while (n > 0)
{
numOfDigits++;
n /= 10;
}
return numOfDigits;
}
int getDecimalNumber(int n, float B)
{
vector<int> digits;
int num = 0;
while (n > 0)
{
digits.push_back(n % 10);
n /= 10;
}
for (int i = 0; i < digits.size(); i++)
{
if (digits[i] >= B) // each digit should be less than B
{
num = 0;
break;
}
else
{
num += digits[i] * (int)(pow(B, i));
}
}
return num;
}

int findSmallestB(int p, int q, int r)


{
int pDecimal, qDecimal, rDecimal;
for (float B = 2; B <= 16; B++)
{
pDecimal = getDecimalNumber(p, B);
qDecimal = getDecimalNumber(q, B);
rDecimal = getDecimalNumber(r, B);
if (rDecimal == pDecimal * qDecimal && rDecimal > 0)
{
return (int)B;
}
}
return 0;
}
int main()
{
int p, q, r;
cin >> p >> q >> r;
assert(p >= 1 && getNumOfDigits(p) <= max_digits);
assert(q >= 1 && getNumOfDigits(q) <= max_digits);
assert(r >= 1 && getNumOfDigits(r) <= max_digits);
int B = findSmallestB(p, q, r);
cout << B << endl;
return 0;
}

(7)
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int max_num = 100;
char BattleMatrix[max_num + 2][max_num + 2];
char NewBattleMatrix[max_num + 2][max_num + 2];
void PrintBattleMatrix(char Matrix[max_num + 2][max_num + 2], int r, int c)
{
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
cout << Matrix[i][j];
}
cout << endl;
}
}
void Fight(char OldMatrix[][max_num + 2], char NewMatrix[][max_num + 2], int r, int
c)
{
struct _Step
{
int dx; // delta_x
int dy; // delta_y
} Moves[4] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // move up/right/down/left
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
if (OldMatrix[i][j] == 'R')
{
for (int step = 1; step <= 4; step++)
{
if (OldMatrix[i + Moves[step - 1].dx][j + Moves[step - 1].dy] == 'S')
{
NewMatrix[i + Moves[step - 1].dx][j + Moves[step - 1].dy] = 'R';
}
}
}
else if (OldMatrix[i][j] == 'S')
{
for (int step = 1; step <= 4; step++)
{
if (OldMatrix[i + Moves[step - 1].dx][j + Moves[step - 1].dy] == 'P')
{
NewMatrix[i + Moves[step - 1].dx][j + Moves[step - 1].dy] = 'S';
}
}
}
else if (OldMatrix[i][j] == 'P')
{
for (int step = 1; step <= 4; step++)
{
if (OldMatrix[i + Moves[step - 1].dx][j + Moves[step - 1].dy] == 'R')
{
NewMatrix[i + Moves[step - 1].dx][j + Moves[step - 1].dy] = 'P';
}
}
}
}
}
}

int main()
{
int r, c, n; // r: row, c: column, n: days
cin >> r >> c >> n;
// initialize BattleMatrix
memset(BattleMatrix, 0, sizeof(BattleMatrix));
for (int i = 1; i <= r; i++)
{
cin >> BattleMatrix[i] + 1;
}
memcpy(NewBattleMatrix, BattleMatrix, sizeof(BattleMatrix));

for (int d = 1; d <= n; d++)


{
if (d & 1)
{
Fight(BattleMatrix, NewBattleMatrix, r, c);
memcpy(BattleMatrix, NewBattleMatrix, sizeof(BattleMatrix));
}
else
{
Fight(NewBattleMatrix, BattleMatrix, r, c);
memcpy(NewBattleMatrix, BattleMatrix, sizeof(BattleMatrix));
}
}
PrintBattleMatrix(NewBattleMatrix, r, c);
return 0;
}

You might also like