一、 n的阶乘、两种方法实现、for循环或递归
#include <iostream>
using namespace std;
//方法一:for循环
int method1(int n) {
int k = 1;
int answer = 1;
for (; k <= n; k++) {
answer *= k;
}
return answer;
}
//方法二:递归
int method2(int n) {
if (n == 1) {
return 1;
}
else {
return n * method1(n - 1);
}
}
int main() {
int n;
cout << "请输入n:";
cin >> n;
int answer1 = method1(n);
cout << "for循环得到的结果:" << answer1 << endl;
int answer2 = method2(n);
cout << "递归得到的结果:" << answer2 << endl;
return 0;
}
二、一个3*3的矩阵,求所有元素和,主对角线、逆对角线和
#include <iostream>
using namespace std;
int main() {
int num[3][3];
for (int i = 0; i < 3; i++) {
cout << "请输入第" << i + 1 << "行元素:";
for (int j = 0; j < 3; j++) {
cin >> num[i][j];
}
}
int sum1 = 0, sum2 = 0, sum3 = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
sum1 += num[i][j]; //sum1计算所有元素之和
if (i == j) {
sum2 += num[i][j]; //sum2计算主对角线元素之和
}
if ((i + j) == 2) {
sum3 += num[i][j]; //sum3计算逆对角线元素之和
}
}
}
cout << "所有元素之和:" << sum1 << endl;
cout << "主对角线元素之和:" << sum2 << endl;
cout << "逆对角线元素之和:" << sum3 << endl;
}
三、数组存20个数,然后最大的数跟最后一位换、最小的跟第一个换
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
int num[20];
srand((int)time(NULL)); //生成随机种子
for (int i = 0; i < 20; i++) {
num[i] = rand() % 100 + 1; //生成1~100的随机数
}
cout << "交换前的序列:";
for (int i = 0; i < 20; i++) {
cout << num[i] << " "; //打印交换前的序列
}
cout << endl;
int minIndex = 0, maxIndex = 0;
for (int i = 0; i < 20; i++) {
if (num[i] < num[minIndex]) { //遍历寻找最大值和最小值
minIndex = i;
}
if (num[i] > num[maxIndex]) {
maxIndex = i;
}
}
int temp = num[0];
num[0] = num[minIndex]; //交换最小值
num[minIndex] = temp;
temp = num[19];
num[19] = num[maxIndex]; //交换最大值
num[maxIndex] = temp;
cout << "交换后的序列:";
for (int i = 0; i < 20; i++) {
cout << num[i] << " "; //打印交换后的序列
}
}
四、字符串匹配(KMP算法)
#include <iostream>
#include <string>
using namespace std;
//kmp算法
int kmp(string str, string pattern, int next[]) {
int i = 0, j = 0;
int n = str.length();
int m = pattern.length();
while (i < n && j < m) {
if (j == -1 || str[i] == pattern[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j == m) {
return i - m;
}
else {
return -1;
}
}
//获得next数组
void getnext(string pattern, int next[]) {
int m = pattern.length();
int j = 0, k = -1;
next[0] = -1;
while (j < m) {
if (k == -1 || pattern[j] == pattern[m]) {
j++;
k++;
next[j] = k;
}
else {
k = next[k];
}
}
}
int main() {
string str = "I love you";
string pattern = "love";
int next[100];
getnext(pattern, next);
int answer = kmp(str, pattern, next);
if (answer != -1) {
cout << "第一次出现的位置:" << answer;
}
else {
cout<<"匹配失败";
}
}
五、身份证15位变18位
背景:1985年起我国实行居民身份证制度。当时签发的身份证号码是15位的,第7、8位为出生年份的后两位(如1980年出生的人,7、8位就是80)。由于2000年的到来,1999年起签发的身份证调整为18位。具体调整规则是:在第7-10位改为完整的出生年份,并将原15位身份证第9位之后的数字依次向后平移两位,这样,就得到一串17位的数字(例如:340524800101001变为34052419800101001)。18位身份证号中,新增最后一位校验码,校验码的具体计算规则如下图:
编写一个程序,输入一个15位身份证号,输出转换后的18位身份证号,要求用C++类和对象实现。PS:由于1999年后签发的身份证均为18位,所以无需考虑00后。
#include <iostream>
#include <iostream>
using namespace std;
int main() {
//权重数组
int quan[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
//校验码数组
char judge[] = { '1','0','X','9','8','7','6','5','4','3','2' };
//定义新、旧身份证
string oldNum, newNum;
//输入旧身份证
cout << "请输入原始的15位身份证号码:";
cin >> oldNum;
//初始化新身份证,记得后面要加三个随机数,占满18为,后面好处理。(这里用空格当随机数)
newNum = oldNum + " ";
//按照给的条件先计算出十七位身份证
for (int i = 14; i >= 0; i--) {
if (i >= 6) {
newNum[i + 2] = oldNum[i];
}
if (i == 7) {
newNum[i] = '9';
}
if (i == 6) {
newNum[i] = '1';
}
if (i < 6) {
newNum[i] = oldNum[i];
}
}
//加权求和并对11取余获得校验位
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (newNum[i] - '0') * quan[i];
}
int extra = sum % 11;
//新身份证添上校验位
newNum[17] = judge[extra];
//输出结果
cout << "新身份证号码:"<<newNum;
}
六、给四个坐标,求两条直线交点
#include <iostream>
using namespace std;
int main() {
/**
输入第一个、第二个点的坐标,确定一条直线l1
*/
double x1, y1;
double x2, y2;
cout << "请分别输入第一个点的x,y:";
cin >> x1 >> y1;
cout << "请分别输入第二个点的x,y:";
cin >> x2 >> y2;
/**
输入第三个、第四个点的坐标,确定一条直线l2
*/
double x3, y3;
double x4, y4;
cout << "请分别输入第三个点的x,y:";
cin >> x3 >> y3;
cout << "请分别输入第四个点的x,y:";
cin >> x4 >> y4;
/**
计算l1的a,b
*/
double a1, b1;
a1 = (y1 - y2) / (x1 - x2);
b1 = y1 - x1 * a1;
/**
计算l2的a,b
*/
double a2, b2;
a2 = (y3 - y4) / (x3 - x4);
b2 = y3 - x3 * a2;
//计算交点坐标
double answerX = (b1 - b2) / (a2 - a1);
double answerY = a1 * answerX + b1;
//输出结果
cout << "两直线交点为:(" << answerX << "," << answerY << ")";
}
七、双向冒泡排序
#include <iostream>
using namespace std;
void bubbleSort(int num[],int n) {
for (int i = 0; i < n - 1; i++) {
bool flag = false;
for (int j = 0; j < n - i - 1; j++) {
if (num[j] > num[j + 1]) {
flag = true;
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
for (int j = n - i - 2; j > 0; j--) {
if (num[j] < num[j - 1]) {
flag = true;
int temp = num[j];
num[j] = num[j - 1];
num[j - 1] = temp;
}
}
if (!flag) {
break;
}
}
}
static int num1[10];
int main() {
const int n = 10;
cout << "请输入排序之前的序列:";
for (int i = 0; i < n; i++) {
cin >> num1[i];
}
bubbleSort(num1, n);
cout << "排序后的序列:";
for (int i = 0; i < n; i++) {
cout << num1[i] << " ";
}
}