(测试题).计算a+b的和
每行包含两个整数a和b
对于每行输入对应输出一行a和b的和
输入
1 5
输出
6
#include <stdio.h>
int main(void)
{
int m,n,c;
while (scanf("%d%d",&n,&m)!=EOF)
{ c=m+n;
printf("%d\n",c);
}
}
(测试题).长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换,完成以下函数
/**
* 交换数组里n和0的位置
* array: 存储[0-n)的数组
* len: 数组长度
* n: 数组里要和0交换的数
*/
extern void swap_with_zero(int* array, int len, int n);
class Solution {
public:
/**
* 调用方法swap_with_zero来对array进行排序
*/
void sort(int* array, int len) {
for(int i = len - 1; i > 0; i--) {
if(array[i] == i) //判断是否处于正确位置
continue;
//对未处于正确位置的数字进行下面两步交换
swap_with_zero(array, len, array[i]);//交换0与i位置的数字
swap_with_zero(array, len, i);//交换0与数字i
}
}
};
(2017年实习上机题3).英文句子单词翻转
Eg:You are a dog -> dog are a You
#include<iostream>
#include<string.h>
using namespace std;
void reversestr(char *start, char *end);
int main()
{
char *temp;
char *start;
char *end;
const char *str = "You are a lucky dog !";
char *s = new char[strlen(str)]();
strcpy(s, str);
reversestr(s, s + strlen(str) - 1);
temp = s;//操作不影响s;最后可以输出s
start = temp;
while (*temp != '\0')//注意是指针指向的不等于‘\0’
{
if (*temp == ' ')
{
end = temp-1;//弄清楚自加自减还是+1-1
reversestr(start,end);
start = temp+1;
}
temp++;
}
end = temp - 1;
reversestr(start, end);//通过验证最后一个单词还未翻转,想到最后一个单词后面循环已经退出了
while (*s != '\0')
{
cout << *s;
s++;
}
cout << endl;
system("pause");
return 0;
}
/*
* 实现字符串的反转操作
* 初始,start指向字符串第一个字符;
* 初始,end指向字符串最后一个字符;
*/
void reversestr(char *start, char *end)
{
char temp;
while (start<end)
{
temp = *start;
*start++ = *end;
*end-- = temp;
}
}
(2016年实习上机题1).
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i = 0,count=1,next=1;
string zq;
cout << "请输入字符串:";
getline(cin, zq);
for (i; i < zq.size(); i++)
{
if ((zq[i] >= 'a'&& zq[i] <= 'z') || (zq[i] >= 'A'&&zq[i] <= 'Z'))//是字母
{
next = i+1;
for (next; next < zq.size(); next++)
{
if ((zq[next] >= 'a'&& zq[next] <= 'z') || (zq[next] >= 'A'&&zq[next] <= 'Z'))
{
break;
}
else
{
}
}
if (zq[i] != zq[next])//不连续则输出
{
cout << zq[i] << count;
count = 1;
}
else
count++;
}
}
cout << endl;
system("pause");
return 0;
}
(2016年实习上机题2).
测试用例(都合法,且只有’(‘,’)’,’A’):(A)
((()(A))())
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i = 0,left = 0,right=0;
string zq;
cout << "请输入生日礼物:";
getline(cin, zq);
for (i; i < zq.size(); i++)
{
if (zq[i] == '(')
left++;
else if (zq[i] == ')')
right++;
else if (zq[i] == 'A')
{
cout << "愚人指数为:" << left - right << endl;
break;
}
else
cout << "输入有误!" << endl;
}
system("pause");
return 0;
}
(2016年实习上机题3).
#include <stdio.h>
int bossattack(int hp)//该形参hp为人的血量
{
int ret, rem;//ret为回合数
ret = hp / 70 * 5; // BOSS每5回合造成70点伤害
rem = (hp % 70 + 9) / 10;
if (rem > 4)//4回合人不死
ret += 5;
else
ret += rem;
return ret;
}
int record[1001][10001];
int playerattack(int mp, int hp)//该形参hp为怪兽血量
{
int r1, r2;
if (hp <= 0)
return 0;
if (record[mp][hp] != -1)
return record[mp][hp];
if (mp >= 10)//法力在10以上,消耗法力
return record[mp][hp] = 1 + playerattack(mp - 10, hp - 60);
else {
r1 = 1 + playerattack(mp + 4, hp);//恢复蓝
r2 = 1 + playerattack(mp, hp - 17);//平A
return record[mp][hp] = (r1 < r2 ? r1 : r2);
}
}
int main()
{
int playerhp, playermp, bosshp;
while (scanf("%d%d%d", &playerhp, &playermp, &bosshp) != EOF) {
int i, j, bossdead, playerdead;
for (i = 0; i < 1001; i++)
for (j = 0; j < 10001; j++)
record[i][j] = -1;//初始化全为-1
playerdead = bossattack(playerhp);//玩家死亡回合数
bossdead = playerattack(playermp, bosshp);//BOSS死亡回合数
if (playerdead < bossdead)
printf("-1\n");
else
printf("%d\n", bossdead);
}
return 0;
}
(2017年实习上机题1引申).大数相加
代码1:
#include<stdio.h>
#include<string.h>
int main()
{
int num1[1006], num2[1006], len1, len2, lenmax, i, j;
char str1[1006], str2[1006];
while (1)
{
scanf("%s %s", &str1, &str2);
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));//初始化
len1 = strlen(str1);
len2 = strlen(str2);
lenmax = len1 >= len2 ? len1 : len2;
for (i = len1 - 1, j = 0; i >= 0; i--, j++)
{
num1[j] = str1[i] - '0';//将字符串反转并且转换为数字保存在整型数组中
}
for (i = len2 - 1, j = 0; i >= 0; i--, j++)
{
num2[j] = str2[i] - '0';//将字符串反转并且转换为数字保存在整型数组中
}
for (i = 0; i<lenmax; i++)
{
num1[i] = num1[i] + num2[i];//相加
if (num1[i] >= 10)
{
num1[i] = num1[i] - 10;//满十进一
num1[i + 1] += 1;
}
}
if (num1[lenmax])//判断数字中最大的那个数字的最高位是否产生进位
{
printf("%d", num1[lenmax]);
}
for (i = lenmax - 1; i >= 0; i--)
{
printf("%d", num1[i]);
}
putchar(10);//打印换行,换行的ASCII编码为10
}
}
代码2:
#include<stdio.h>
#include<string.h>
int main()
{
int num1[1006], num2[1006], len1, len2, lenmin, i, j,result[1006],temp,bit=0;
char str1[1006], str2[1006];
while (1)
{
scanf("%s %s", &str1, &str2);
memset(result, 0, sizeof(result));
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));//初始化
len1 = strlen(str1);
len2 = strlen(str2);
lenmin = len1 <= len2 ? len1 : len2;
for (i = 0; i < len1; i++)
{
num1[i] = str1[i] - '0';
}
for (i = 0; i < len2; i++)
{
num2[i] = str2[i] - '0';
}
for (i = 0; i < lenmin; i++)
{
temp = num1[len1-i-1] + num2[len2-i-1];
if (temp < 10)
{
result[i] = temp+bit;
bit = 0;
}
else
{
result[i] = temp - 10+bit;
bit = 1;
}
}
if (lenmin==len2)
{
for (i = 0; i < len1 - len2; i++)
{
if(i==len1-len2-1)
printf("%d", num1[i]+bit);
else
printf("%d", num1[i]);
}
for(j=0;j<lenmin;j++)
printf("%d", result[lenmin-1-j]);
}
else
{
for (i = 0; i < len2 - len1; i++)
{
if (i == len2 - len1 - 1)
printf("%d", num2[i] + bit);
else
printf("%d", num2[i]);
}
for (j = 0; j<lenmin; j++)
printf("%d", result[lenmin - 1 - j]);
}
putchar(10);//打印换行,换行的ASCII编码为10
}
}
(2019年成渝地区实习上机题1)
见我的另一篇解答
(2017年实习上机题1)
字符串大小写转换:写出一个程序,输入一个字符串,然后输出大写转换为小写之后的字符串。不在字母范围内的字符,需丢弃。例如1:输入:ABC,输出:abc;例如2:输入:AbC输出:abc。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string zq;
cin >> zq;
char zqchar[1024],result[1024];
memset(zqchar,0,1024);
memset(result, 0, 1024);
for (int i = 0,j=0; i < zq.size(); i++)
{
zqchar[i] = zq[i];
if ((zqchar[i] >= 'a') && (zqchar[i] <= 'z'))
result[j++] = zqchar[i];
else if ((zqchar[i] >= 'A') && (zqchar[i] <= 'Z'))
result[j++]=zqchar[i]-'A'+'a';//+32
else
;
}
cout << result << endl;
system("pause");
return 0;
}
(2017年实习上机题2)
集五福:以0和1组成的长度为5的字符串代表每个人所得到的福卡,每一位代表一种福卡,1表示已经获得该福卡,单类型福卡不超过一张,随机抽取一个小于10人团队,求该团队最多可以集齐多少套五福。
输入描述:输入若干个“11010”,“00110”的由0,1组成的长度等于5的字符串,代表指定团队中每个人福卡获得情况,
注:1人也可以是一个团队;1人可以有0-5张福卡,但福卡不能重复。
输出描述:输出该团队能凑齐多少套五福。
#include <iostream>
#include <string>
#include<vector>
using namespace std;
int main()
{
string temp;
vector<string> zq;
int min=0,fuka[5] = {};
while (cin >> temp)
zq.push_back(temp);
for (int i = 0; i < zq.size(); i++)
{
for (int j = 0; j < 5; j++)
{
if (zq[i][j] == '1')
fuka[j]++;
}
}
min = fuka[0];
for (int i = 0; i < 5; i++)
{
if (min > fuka[i])
min = fuka[i];
}
cout << "该团队能凑齐" << min << "套五福" << endl;
system("pause");
return 0;
}
(2019年实习上机题1)
(2019年实习上机题2)
其他题目,完善后整理至我的资源中见,有意者可以以少许积分下载。
欢迎大家探讨,发现代码中BUG,或有优化的算法欢迎讨论。