(1)数据交换
问题描述
编写一个程序,输入两个整数,分别存放在变量x和y当中,然后使用自己定义的函数swap来交换这两个变量的值。
输入格式:
输入只有一行,包括两个整数。
输出格式:
输出只有一行,也是两个整数,即交换以后的结果。
要求:
主函数负责数据的输入与输出,但不能直接交换这两个变量的值,必须通过调用单独定义的函数swap来完成,而swap函数只负责交换变量的值,不能输出交换后的结果。
输入输出样例
样例输入
4 7
样例输出
7 4
代码
#include <stdio.h>
int swap(int *p1,int *p2);
int main()
{
int a,b;
scanf("%d %d",&a,&b);
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
int swap(int *p1,int *p2)//题目要求定义的swap函数
{
int p3;
p3=*p1;
*p1=*p2;
*p2=p3;
return *p1,*p2;
}
(2)矩阵乘法
问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数。
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值。
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开。
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
代码
#include <stdio.h>
int n, m;
int a[31][31];
int b[31][31];
int c[31][31];
//矩阵a是原数据,不会变
//矩阵b是乘a后的矩阵,相当于个中间变量
//矩阵c是存放最后结果的矩阵
void f(void)
{
int i, j, times, sum, q=0;
//判断0次幂的情况,输出单位矩阵
if(m==0)
{
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
{
if(i==j)
a[i][j] = 1;
else
a[i][j] = 0;
}
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
return;
}
//如果1次幂就输出本身
if(m==1)
{
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
return;
}
for(times=1; times<m; ++times) //矩阵相乘的次数
{
for(i=1; i<=n; ++i) //行标,第i行,行数
for(q=1; q<=n; q++) //矩阵每一行都分别乘以全部列,共n列,每列一次
{
sum = 0; //初始化为零
for(j=1; j<=n; ++j)
sum += b[i][j]*a[j][q]; //经过一次行乘以列
c[i][q] = sum; //更新结果
}
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
b[i][j] = c[i][j]; //让矩阵b等于c,进行后续计算
}
//打印出结果
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
printf("%d ", c[i][j]);
printf("\n");
}
return;
}
int main()
{
int i, j;
scanf("%d %d", &n, &m);
//输入矩阵a
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
scanf("%d", &a[i][j]);
//赋值于矩阵b,让其和a相同
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
b[i][j] = a[i][j];
f();
return 0;
}
(3)加法运算
问题描述
你的表妹正在学习整数的加法,请编写一个程序来帮助她学习。该程序调用了一个函数GetTwoInts,由它来返回两个从键盘读入的100以内的整数,然后计算这两个整数之和,并把答案显示出来。要求:在主函数中不能使用scanf等函数直接输入这两个整数,而必须通过调用GetTwoInts函数来完成,在GetTwoInts函数中可以使用scanf函数。另外,由于该函数必须同时返回两个整数,因此不能采用函数返回值的方式,而必须采用指针的方法来实现。
输入格式:
输入只有一行,即两个100以内的整数。
输出格式:
输出只有一行,即这两个整数之和。
输入输出样例
样例输入
4 7
样例输出
11
代码
#include <stdio.h>
void GetTwoInts(int* x, int* y) {
scanf("%d %d", x, y);
}
int main() {
int a, b;
int* x, * y;
x = &a;
y = &b;
int result;
GetTwoInts(x, y);
result = *x + *y;
printf("%d", result);
return 0;
}
(4)景点游览
问题描述
小明来到一个景区游玩,但是他的时间有限,没办法逛遍所有的景点,所以他从网上下载了每个景点的评分,他希望能够使游览的景点的评分总和最高,于是他希望你帮他对于N个景点排下序。
输入格式
输入的第一行包含一个正整数N,表示N个景点。
第二行有N个正整数,表示每个景点的评分值。
输出格式
输出一行,包含N个正整数,表示N个景点的评分从大到小的排列
样例输入
4
3 2 4 1
样例输出
4 3 2 1
代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int score[1000];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> score[i];
}
sort(score, score + n);//从小到大排好
reverse(score, score + n);//反转数组元素
for (int i = 0; i < n; i++)
{
cout << score[i] << " ";
}
return 0;
}
(5)大等于n的最小完全平方数
问题描述
输出大等于n的最小的完全平方数。
若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数
Tips:注意数据范围
所以:n是32位有符号整数,那么输入的值最大可能为2147483647,要求的答案超过了int的范围,所以应该用long long int确保答案不会溢出。
输入格式
一个整数n
输出格式
大等于n的最小的完全平方数
样例输入
71711
样例输出
71824
数据规模和约定
n是32位有符号整数
代码
#include <stdio.h>
#include <math.h>
int main()
{
double n;
long long int root;
scanf("%lf", &n);
root = (long long int)ceil(sqrt(n));
printf("%lld", root * root);
return 0;
}
(6)出现次数最多的整数
问题描述
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式
第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式
输出只有一行,即出现次数最多的那个元素值。
样例输入
5
100
150
150
200
250
样例输出
150
思路
用一层循环,因为要取较小的那个数,而数组是由小到大排列的,所以从最后一个开始遍历, 如果当前的数和下一个数相等,sum++(记录次数); 并且用max保存出现次数最多的次数,用flag标记数组下标。循环结束时a[flag]即为答案。
需要特殊考虑n<1和n==1的情况。
代码
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n],i,max,flag,sum;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(n<1) return 0;
if(n==1) return a[0];
max=0;flag=0;
for(i=n-1;i>=0;i--){
sum=1;
if(a[i]==a[i-1]){
sum++;
if(max<sum){
sum=max;
flag=i;
}
}
}
printf("%d",a[flag]);
return 0;
}
(7)求平方和
问题描述
请用函数重载实现整型和浮点习型的两个数的平方和计算
输入格式
测试数据的输入一定会满足的格式。
2 2(2行2列,第1行整型,第2行浮点型)
输出格式
要求用户的输出满足的格式。
2 1(2行1列,第1行整型,第2行浮点型)
样例输入
一个满足题目要求的输入范例。
例:
2 2
3 4
3.1 4.1
样例输出
与上面的样例输入对应的输出。
例:
25
26.42
数据规模和约定
输入数据中每一个数的范围。
例:0<n,m<100, 0<=矩阵中的每个数<=1000。
代码
#include<iostream>
using namespace std;
int ans(int n,int m){
int ans;
ans = n*n+m*m;
return ans;
}
float ans(float a,float b){
float ans;
ans = a*a+b*b;
return ans;
}
int main(){
int n,m;
float a,b;
cin>>n>>m;
cin>>a>>b;
cout<<ans(n,m)<<endl;
cout<<ans(a,b);
return 0;
}
(8)奇数还是偶数
问题描述
判断一个数是奇数还是偶数
输入格式
输入1个整数n
输出格式
如果是偶数,输出“even”,如果是奇数输出“odd”
样例输入
34
样例输出
even
数据规模和约定
n<=100000000
代码
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n%2!=0)
{
printf("odd\n");
}
else
{
printf("even\n");
}
return 0;
}
(9)实现strcmp函数
问题描述
自己实现一个比较字符串大小的函数,也即实现strcmp函数。
函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2。若s1与s2相等返回0,s1>s2返回1,s1<s2返回-1。
具体来说,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止(注意’\0’值为0,小于任意ASCII字符)。
如:
“A”<“B”
“a”>“A”
“computer”>“compare”
“hello”<“helloworld”
代码
#include<stdio.h>
#include<string.h>
int main(){
char s1[100],s2[100];
scanf("%s%s",s1,s2);
int i,j,t=0,k=strlen(s1);
if(strlen(s1)<strlen(s2)){
k=strlen(s2);
}//k表示两个字符串长度中较大的数
for(i=0;i<k;i++){
if(s1[i]>s2[i]){//出现s1字符大于对应s2字符的即代表s1>s2所以输出1
printf("1");
t=1;//标记是否是相等的情况
break;
}
else if(s1[i]<s2[i]){
printf("-1");
t=1;//标记其是否是相等的情况
break;
}
}
if(t==0){
printf("0");
}
return 0;
}
(10)打印十字图
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊)
如下所示:
省略
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) ,表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
代码
#include <stdio.h>
#include <stdlib.h>
int print(int n)
{
char a[130][130];
int i,j,x,y;
int row = 9 + (n - 1) * 4;
int col = 9 + (n - 1) * 4;
int cen = (row - 1) / 2;
// 对所有的数组中数据 赋给字符 "."
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
{
a[i][j]='.';
}
// 打印左上角的图形( 分成a,b,c 三部分)(然后利用对称赋值输出)
// 打印a 部分
for (i = cen; i > 0; i = i - 2) // 打印出 a[4][4] 34 43 22 12 21六个点的字符
{
a[i][i] = '$';
a[i-1][i] = '$';
a[i][i-1] = '$';
}
// 打印b部分 a[2][0] 30 40 42 四个点
x = 0;
for (y = 0; y <= (cen - 2); y = y + 2)
{
x = x + 2;
for (i = x; i <= cen; i++)
{
a[i][y] = '$';
}
}
// 打印c部分 a[0][2] 03 04 24 四个点
y = 0;
for (x = 0; x <= (cen - 2); x = x + 2)
{
y = y + 2;
for (i = y; i <= cen; i++)
{
a[x][i] = '$';
}
}
// y轴对称左上半部分对应左下半部分
for (y = 0; y <= cen;y++)
for (x = row - 1; x > cen; x--)
{
a[x][y] = a[row - 1 - x][y];
}
// x轴对称左半部分对应右半部分
for (x = 0; x < row;x++)
for (y = col - 1; y>cen; y--)
{
a[x][y] = a[x][col-1- y];
}
// 输出图形
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%c", a[i][j]);
}
printf("\n");
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
print(n);
return 0;
}