目录
1171: 加密(指针专题)
题目描述
将一段明文加密。加密的规则如下:将每个字符的ascii码的值减去24作为每个字符加密后的值,例如'a'的ascii码的值为97,那么加密后就变成了73。"73"就是'a'的密文,例如,字符串"abc",在加密之后变为"737475",最后,整个密文再进行翻转,得到最终的密文"574737"。现在请你编写程序,对一段文字加密。请定义并使用如下函数:
void encrypt(char *plain, char *cipher)
{
//把原文字符串plain加密后存入字符串cipher
}
输入
输入一串字符串,只包含数字和字母,最长为200.
输出
输出加密后的字符串。
样例输入 Copy
zero12
样例输出 Copy
625278097789
提示
直接输出密文当然是最简单的方法,不过本题要求你将密文存入字符串(以备程序的其它模块使用)。
源代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string s;
getline(cin,s);
string ans;
for(int i = 0;i < s.size();i ++ )
{
string t = to_string(int(s[i]) - 24);
ans = ans + t;
}
reverse(ans.begin(),ans.end());
cout << ans << endl;
return 0;
}
1172: 矩阵边界和(指针专题)
题目描述
给定一个m行n列的二维矩阵,求其四周边元素和。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列,但保证矩阵元素不多于500000。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。你可以动态申请m*n个内存单元,然后用一维数组来存储二维数组,二维数组元素a[i][j]对应一维数组a[i*n+j],i、j均从0开始。
输入
输入第一行是m和n,然后是一个m行n列的矩阵。
输出
输出一个整数,表示矩阵所有边界元素的和。
样例输入 Copy
3 4
1 2 3 4
5 6 7 8
9 5 4 6
样例输出 Copy
47
源代码
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int m,n;
scanf("%d %d\n",&m,&n);
int *a;
a = (int*)malloc(sizeof(int)*m*n);
for(int i = 0;i < m*n;i ++ )
scanf("%d",&a[i]);
long long num = 0;
for(int i = 0; i < n;i ++ )num += a[i];
if(m > 1)for(int i = (m-1)*n; i < m*n; i++)num += a[i];
for(int i = n; i < (m-1)*n; i++)
{
if(i % n == 0)num += a[i];
else if(i % n == (n-1))num += a[i];
else continue;
}
printf("%lld",num);
return 0;
}
1173: 密码解密(指针专题)
题目描述
有加密当然也有解密啦。那我们来解密吧。已知明文中只有数字和字母,且加密的规则如下:将每个字符的ascii码的值减去24作为每个字符加密过后的密文,例如'a'的ascii码的值为97,那么加密后就变成了73。"73"就是'a'的密文。所以,若密文是“757392”,则解密后的原文是“cat”。现在请你编写程序,将一段密文解密为原文。
请定义并使用如下函数
void decrypt(char *cipher, char *plain)
{
//将密文cipher解密后将明文存入plain
}
输入
输入一串字符串,最长为200。
输出
输出解密后的原文。
样例输入 Copy
987790872526
样例输出 Copy
zero12
源代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string s;
getline(cin,s);
string ans;
for(int i = 0;i < s.size();i += 2)
{
int num = (s[i] - '0') * 10 + (s[i + 1] - '0') + 24;
ans += char(num);
}
cout << ans << endl;
return 0;
}
1174: 长整数排序(指针专题)
题目描述
长整数排序。输入n 然后输入n个位数不超过100位的大整数,输入的整数可能含有前导0。将这n个长整数排序后输出,输出不含前导0。
int greater(char *s1, char *s2)
{
若s1指向的整数大于s2指向的整数,返回一个正整数;
若s1指向的整数小于s2指向的整数,返回负整数;
若s1指向的整数等于s2指向的整数,返回0;
}
输入
输入第一行是一个正整数n(n<=10),接下来n行是n个大整数,均非负。
输出
输出n行,为n个升序排序后的大整数。
样例输入 Copy
3
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
54213456565
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
样例输出 Copy
54213456565
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> A;
int cmp(const string &a,const string &b)
{
if(a.size() != b.size())return a.size() < b.size();
for(int i = 0;i < a.size();i ++ )
{
if(a[i] != b[i])return a[i] < b[i];
}
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
string s;
cin >> s;
while(s.size() > 1 && s[0] == '0')s.erase(0,1);
A.push_back(s);
}
sort(A.begin(),A.end(),cmp);
for(int i = 0;i < A.size();i ++ )cout << A[i] << endl;
return 0;
}
1175: 矩阵转置(指针专题)
题目描述
给定一个m行n列的二维矩阵,输出其转置矩阵。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。
输入
输入第一行是m和n,然后是一个m行n列的矩阵。
输出
输出转置后的矩阵
样例输入 Copy
3 4
1 2 3 4
5 6 7 8
9 5 4 6
样例输出 Copy
1 5 9
2 6 5
3 7 4
4 8 6
源代码
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int i,j,m,n,*a;
scanf("%d%d",&m,&n);
a=(int *)malloc(m*n*sizeof(int));
for(i = 0;i < m * n;i ++ )
scanf("%d",&a[i]);
for(i = 0;i < n;i ++ )
{
for(j = 0;j < m;j ++ )
{
printf("%d ",*(a+j*n+i));
}
printf("\n");
}
free(a);
return 0;
}
1176: 查找最大字符串(指针专题)
题目描述
从键盘上输入多个字符串(每个串不超过5个字符且没有空格),用”*****”作为串输入结束的标记。从所输入的若干字符串中,找出一个最大的串,并输出该串。要求最大串的查找通过调用编写的函数实现
void find(char *name[], int n, int *p)
{
//在包含n个字符串的二维字符数组name中,查找值最大的字符串,将其下标存入指针p所指内存单元
}
输入
一行输入一个字符串,输入多行
输出
输出一个字符串,单独占一行。
样例输入 Copy
zzzdf
fdsg
adff
rtrt
*****
样例输出 Copy
zzzdf
源代码
#include <iostream>
#include <cstring>
#include <stdlib.h>
#define gets(S) fgets(S,sizeof(S),stdin)
using namespace std;
void find(char *name[], int n, int *p)
{
char maxs[6];
strcpy(maxs,name[0]);
for(int i = 1;i < n;i ++ )
{
if(strcmp(maxs,name[i]) < 0)
{
strcpy(maxs,name[i]);
*p=i;
}
}
}
int main(){
char s[6];
int n=0,i;
char *str[100];
for(i=0; ; i++)
{
gets(s);
if(strcmp(s,"*****")==0)break;
else
{
n++;
str[i]=(char*)malloc(sizeof(char)*6);
strcpy(str[i],s);
}
}
int a;
find(str,n,&a);
puts(str[a]);
return 0;
}
1177: 按要求排序(指针专题)
题目描述
输入n和n个整数,然后按要求排序,若输入1,请输出升序排序序列;若输入2,请输出降序排序序列,若输入3,请输出按绝对值升序排序序列。要求程序结构如下,请完善程序。
void sort(int a[], int n, int (*cmp)());
int CmpAsc(int x, int y); /*按升序要求判断两元素是否逆序*/
int CmpDec(int x, int y); /*按降序要求判断两元素是否逆序*/
int CmpAbsAsc(int x, int y); /*按绝对值升序要求判断两元素是否逆序*/
int main(void)
{
int a[10],i,n;
int slt;
/*读入n和n个整数,存入数组a*/
/*读入用户的选择,存入slt; */
switch(slt)
{
case 1: sort(a, n, CmpAsc); break;
case 2: sort(a, n, CmpDec); break;
case 3: sort(a, n, CmpAbsAsc);break;
}
/*输出排序后的数组*/
}
void sort(int a[], int n, int (*cmp)())
{
/*对数组a排序,排序原则由cmp指定,若cmp为真,表示两元素逆序*/
}
int CmpAsc(int x, int y)
{
//如果x>y返回1,否则返回0;
}
int CmpDec(int x, int y)
{
//如果x<y返回1,否则返回0;
}
int CmpAbsAsc(int x, int y)
{
//如果abs(x)>abs(y)返回1,否则返回0
}
输入
输入第一行是一个正整数n;
输入第二行是n个整数;
输入第三行是一个1~3的整数slt,表示用户的排序要求。
输出
输出n个整数。若用户的排序选择是1,则输出升序排序后的n个整数;若用户的排序选择是2,则输出降序排序后的n个整数;若用户的排序选择是3,则输出按绝对值升序排序后的n个整数;输出占一行,数据之间用空格隔开。
样例输入 Copy
5 2 -3 1 5 4 2
样例输出 Copy
5 4 2 1 -3
提示
请采用稳定的排序算法
源代码
#include <iostream>
using namespace std;
void sort(int a[], int n, int (*cmp)(int x,int y));
int CmpAsc(int x, int y); /*按升序要求判断两元素是否逆序*/
int CmpDec(int x, int y); /*按降序要求判断两元素是否逆序*/
int CmpAbsAsc(int x, int y); /*按绝对值升序要求判断两元素是否逆序*/
int main(void)
{
int a[10],i,n;
int slt;
cin >> n;
for(i = 0;i < n;i ++ )cin >> a[i];
cin >> slt;
switch(slt)
{
case 1: sort(a,n,CmpAsc); break;
case 2: sort(a,n,CmpDec); break;
case 3: sort(a,n,CmpAbsAsc);break;
}
for(int i = 0;i < n;i ++ )cout << a[i] << ' ';
return 0;
}
void sort(int a[], int n, int (*cmp)(int x,int y))
{
for(int i = 0;i < n - 1;i ++ )
{
for(int j = i + 1;j < n;j ++ )
{
if((*cmp)(a[i],a[j]))
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
int CmpAsc(int x, int y)
{
if(x > y)return 1;
else return 0;
}
int CmpDec(int x, int y)
{
if(x < y)return 1;
else return 0;
}
int CmpAbsAsc(int x, int y)
{
if(abs(x) > abs(y))return 1;
else if(abs(x) == abs(y) && x > y)return 1;
else return 0;
}
1178: 单词数
题目描述
统计一篇文章里不同单词的总数。
输入
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由大小写字母和空格组成,没有标点符号,遇到#时表示输入结束。每篇文章的单词数小于1000,每个单词最多由30个字母组成。
输出
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
样例输入 Copy
you are my friend
#
样例输出 Copy
4
源代码
#include <iostream>
#include <unordered_set>
using namespace std;
unordered_set<string> A;
int main()
{
string s;
while(getline(cin,s))
{
if(s == "#")break;
int head = 0;
for(int i = 0;i < s.size();i ++ )
{
if(s[i] != ' ')
{
head = i;
break;
}
}
if(s.size() != ' ')s = s + ' ';
for(int i = head;i < s.size();i ++ )
{
int j = i + 1;
while(s[j] != ' ' && j < s.size())j ++ ;
string t;
for(int k = i;k < j;k ++ )t += s[k];
A.insert(t);
while(s[j] == ' ' && j < s.size())j ++ ;
i = j - 1;
}
cout << A.size() << endl;
A.clear();
}
return 0;
}
1179: 带参宏定义(函数专题)
题目描述
从键盘输入三个字符,用空格隔开,使用带参宏定义1中SWAP,将三个字符按从大到小的顺序排序输出。
宏定义1:#define SWAP(a, b, t) { t=a; a=b; b=t; }
请尝试,如果用宏定义2中的SWAP,主函数需要如何修改才能得到正确结果?
宏定义2:#define SWAP(a, b, t) t=a;a=b;b=t;
输入
输入三个字符,用空格隔开
输出
输出占一行,包含三个字符,用空格隔开
样例输入
w a q
样例输出
w q a
源代码
#include <iostream>
using namespace std;
#define SWAP(a,b,t) {t = a;a = b;b = t;}
int main()
{
char a,b,c,t;
cin >> a >> b >> c;
if(a < b)SWAP(a,b,t);
if(a < c)SWAP(a,c,t);
if(b < c)SWAP(b,c,t);
cout << a << ' ' << b << ' ' << c <<endl;
return 0;
}
1180: 成绩统计(结构体专题)
题目描述
从键盘输入若干个学生的信息,每个学生信息包括学号、姓名、3门课的成绩,计算每个学生的总分,输出总分最高的学生的信息。
输入
首先输入一个整数n(1<=n<=100),表示学生人数,然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及三个整数,表示语文、数学、英语三门课成绩,数据之间用空格隔开。
输出
输出总成绩最高的学生的学号、姓名、及三门课成绩,用空格隔开。若有多个最高分,只输出第一个。
样例输入 Copy
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
样例输出 Copy
541207010189 Wangli 85 87 99
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000 + 10;
struct Student
{
string num;
string name;
int a,b,c,sum;
};
Student stu[N];
int cmp(const struct Student &A,const struct Student &B)
{
return A.sum > B.sum;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
cin >> stu[i].num >> stu[i].name >> stu[i].a >> stu[i].b >> stu[i].c;
stu[i].sum = stu[i].a + stu[i].b + stu[i].c;
}
sort(stu + 1,stu + 1 + n,cmp);
cout << stu[1].num << ' ' << stu[1].name << ' ' << stu[1].a << ' ' <<stu[1].b << ' ' << stu[1].c << endl;
return 0;
}