#include
using namespace std;
const int EAST = 0;
const int SOUTH = 1;
const int SOUTHWEST = 2;
const int NORTHEAST = 3;
struct {
int drow;
int dcol;
} direct[] = { {0, 1}, {1, 0}, {1, -1}, {-1, 1} };
const int N = 500;
int a[N][N];
int main()
{
int n;
// 输入数据
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
// Z字形扫描,输出结果
int row = 0, col = 0, next = EAST;
cout << a[row][col];
while (row != n - 1 || col != n - 1) {
row += direct[next].drow;
col += direct[next].dcol;
cout << " " << a[row][col];
if (next == EAST && row == 0)
next = SOUTHWEST;
else if (next == EAST && row == n - 1)
next = NORTHEAST;
else if (next == SOUTH && col == 0)
next = NORTHEAST;
else if (next == SOUTH && col == n - 1)
next = SOUTHWEST;
else if (next == SOUTHWEST && row == n - 1)
next = EAST;
else if (next == SOUTHWEST && col == 0)
next = SOUTH;
else if (next == NORTHEAST && col == n - 1)
next = SOUTH;
else if (next == NORTHEAST && row == 0)
next = EAST;
}
cout << endl;
return 0;
}
2.问题描述:
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:
第一行是一个整数N,N;接下来由N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:
输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入:
5
100
150
150
200
250
样例输出:
150
#include
#include
using namespace std;
int main()
{
int n;
cin >> n;
int num[21] = { 0 };
for (int i = 0; i < n; i++)
{
cin >> num[i];
}
sort(num, num + n);
int count = 0, max = 0,out=1000000;
for (int i = 1; i < n; i++)
{
if (num[i] == num[i - 1])
{
count++;
if (count > max && num[i] < out)
{
max = count;
out = num[i];
}
else
count = 0;
}
}
cout << out << endl;
return 0;
}
3.题目:
世界杯小组赛(胜得3分,平得1分,负不得分),计算每个队的积分并按排名先后输出,若积分相同,则按净球数排序(保证积分相等时输入的净球数不相等)。输入M个队,出线队N个,输出出线的队的排名、名称、积分、净球数。
#include
#include
using namespace std;
struct soccer {
string c;
int win;
int ping;
int fu;
int jin;
int fuqiu;
int grade;
int jingqiu;
};
bool comp(soccer a, soccer b)
{
if (a.grade > b.grade)
return true;
else if (a.grade == b.grade && a.jingqiu > b.jingqiu)
return true;
else
return false;
}
int main()
{
int m, n;
cin >> m >> n;
soccer s[20];
for (int i = 0; i < m; i++)
{
cin >> s[i].c >> s[i].win >> s[i].ping >> s[i].fu >> s[i].jin >> s[i].fuqiu;
s[i].grade = 3 * s[i].win + s[i].ping;
s[i].jingqiu = s[i].jin - s[i].fuqiu;
}
sort(s, s + m,comp);
for (int i = 0; i < n; i++)
cout << i + 1 << " " << s[i].c << " " << s[i].grade << " " << s[i].jingqiu << endl;
return 0;
}
4.问题描述:
对于给定的字符序列(字符序列长度小于100),从左至右将所有数字字符取出拼接成一个无符号整数(拼接出的整数小于2^31)。
然后计算并输出该整数的最大因子(如果是素数或0,则其最大因子为自身)。
输入说明:
输入数据为一行字符序列
输出说明:
对输入的字符序列,求出所得整数的最大因子;若字符序列中没有数字或找出的整数为0,则输出0。
输入样例:
样例1输入
sdf0ejg3.f?9f
样例2输入
?4afd0s&2d79*(g
样例3输入
abcde
输出样例:
样例1输出
13
样例2输出
857
样例3输出
0
#include
using namespace std;
bool isprime(int n)
{
for (int i = 2; i <= sqrt(n); i++)
if (n % i == 0)
return false;
return true;
}
int yinzi(int n)
{
if (n == 0)
return 0;
else if (isprime(n))
return n;
else
{
int max = 0;
for (int i = 2; i < n; i++)
{
if (n % i == 0 && max < i)
max = i;
}
return max;
}
}
int main()
{
char str[100] = { 0 };
while (gets_s(str))
{
int len = strlen(str);
int num = 0;
for (int i = 0; i < len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
num = num * 10 + (str[i] - '0');
}
}
cout << yinzi(num) << endl;
}
return 0;
}
5.问题描述
请写一个程序,对于一个m行m列(2<m<20)的方阵,求其每一行、每一列及主、辅对角线元素之和,然后按照从大到小的顺序依次输出这些值。
注:主对角线是方阵从左上角到右下角的一条斜线,辅对角线是方阵从右上角到左下角的一条斜线。
输入说明
输入数据的第一行为一个正整数m;
接下来为m行、每行m个整数表示方阵的元素。
输出说明
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
输入样例
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69
输出样例
159 145 144 135 81 60 44 32 28 27
#include
#include
using namespace std;
bool comp(int a, int b)
{
if (a > b)
return true;
else
return false;
}
int main()
{
int m;
cin >> m;
int num[20][20] = { 0 };
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
cin >> num[i][j];
int n[100] = { 0 };
int k = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
n[k] += num[i][j];
}
k++;
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
n[k] += num[j][i];
}
k++;
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
if (i == j)
n[k] += num[i][j];
}
}
k++;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
if (i + j == m - 1)
n[k] += num[i][j];
}
}
sort(n, n + k + 1, comp);
for (int i = 0; i < k + 1; i++)
cout << n[i] << " ";
return 0;
}
6.问题描述
请写一个程序,判断给定整数序列能否构成一个等差数列。
输入说明
输入数据由两行构成,第一行只有一个整数n(n < 100),表示序列长度(该序列中整数的个数);
第二行为n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。
输出说明
对输入数据进行判断,不能构成等差数列输出“no”,能构成等差数列输出表示数列公差(相邻两项的差)的绝对值的一个整数。
输入样例
样例1输入
6
23 15 4 18 35 11
样例2输入
5
2 6 8 4 10
输出样例
样
例1输出
no
样例2输出
2
#include
#include
using namespace std;
int main()
{
int n;
cin >> n;
int num[100] = { 0 };
for (int i = 0; i < n; i++)
cin >> num[i];
sort(num, num + n);
int cha = num[1] - num[0];
bool flag = true;
for (int i = 1; i < n; i++)
{
if (num[i] - num[i - 1] != cha)
flag = false;
}
if (flag == true)
cout << cha << endl;
else
cout << "no" << endl;
return 0;
}