当前位置: 代码迷 >> 综合 >> 算法笔记+CodeUp
  详细解决方案

算法笔记+CodeUp

热度:75   发布时间:2024-02-28 22:57:55.0

选择结构

问题 B: 例题4-2 比较交换实数值

#include <cstdio>int main()
{
    double a, b;scanf("%lf%lf", &a, &b);if (a > b)printf("%.2f %.2f\n", b, a);elseprintf("%.2f %.2f\n", a, b);return 0;
}

问题 C: 例题4-3 比较交换3个实数值,并按序输出

#include <cstdio>
void swap(double* a, double* b)
{
    double temp;temp = *a;*a = *b;*b = temp;
}
int main()
{
    double a, b, c;scanf("%lf%lf%lf", &a, &b, &c);if (a > b) swap(&a, &b);if (b > c) swap(&b, &c);if (a > b) swap(&a, &b);printf("%.2f %.2f %.2f", a, b, c);return 0;
}

问题 D: 习题4-4 三个整数求最大值

#include <cstdio>int main()
{
    int a, b, c;scanf("%d%d%d", &a, &b, &c);if (a >= b&&a >= c)printf("%d\n", a);else if (b >= a&&b >= c)printf("%d\n", b);else if (c >= a&&c >= b)printf("%d\n", c);return 0;
}

问题 E: 习题4-10-1 奖金计算


#include <cstdio>
int main()
{
    double l, prize;scanf("%lf", &l);/*某企业发放的奖金根据利润提成。利润I低于或等于100000时,奖金可提10%;利润高于100000元,低于200000元(100000<I <= 200000)时,低于100000元的部分仍按10%提成,高于100000元的部分提成比例为7.5%;200000<I <= 400000时,低于200000元的部分仍按上述方法提成(下同),高于200000元的部分按5%提成;400000<I <= 600000元时,高于400000元的部分按3%提成;600000<I <= 1000000时,高于600000元的部分按1.5%提成;I>1000000元时,超过1000000元的部分按1%提成输入:企业利润,小数,双精度double类型输出:应发奖金数,保留2位小数,末尾换行。*/double d1, d2, d3, d4, d5;d1 = 100000 * 0.1;d2 = d1 + 100000 * 0.075;d3 = d2 + 200000 * 0.05;d4 = d3 + 200000 * 0.03;d5 = d4 + 400000 * 0.015;if (l <= 100000)prize = l*0.1;else if (l <= 200000)prize = d1 + (l - 100000)*0.075;else if (l<=400000)prize = d2+ (l - 200000)*0.05;else if (l<=600000)prize = d3+(l - 400000)*0.03;else if (l<=1000000)prize = d4+ (l - 600000)*0.015;elseprize = d5+(l - 1000000)*0.01;printf("%.2f\n", prize);return 0;
}

循环结构

问题 A: 例题5-1-1 连续自然数求和

#include <cstdio>
int main()
{
    int i = 100,sum = 0;//求1 + 2 + 3 + ... + 100,while()实现while (i){
    sum += i;i--;}printf("%d\n", sum);return 0;
}

问题 B: 例题5-1-2 连续自然数求和

#include <cstdio>
int main()
{
    int n =1 , sum = 0;//使用do...while语句实现1到100求和do{
    sum += n;n++;} while (n <= 100);printf("%d\n", sum);return 0;
}

问题 C: 例题5-1-3 连续自然数求和

#include <cstdio>
int main()
{
    int sum = 0;//求1 + 2 + 3 + ... + 100,要求用for语句实现for (int i = 100; i >=0; i--){
    sum += i;}printf("%d", sum);return 0;
}

问题 E: 例题5-1-5 连续自然数求和

#include <cstdio>int main()
{
    int i,sum=0;//编程实现求1+2+3+...和的程序,要求得到使和数大于1000的最小正整数。for (i=1; sum <= 1000;i++){
    sum += i;}i--;printf("%d\n", i);return 0;
}

问题 F: 例题5-6 矩阵输出

#include <cstdio>int main()
{
    for (int i = 1; i <= 4; i++){
    for (int j = 1; j <= 5; j++){
    printf("%3d", i*j);}printf("\n");}return 0;
}

问题 G: 例题5-7 求圆周率pi的近似值

#include <cstdio>
#include <cmath>
#include <cstdio>
/* 用如下公式 pi/4 = 1-1/3+1/5-1/7....求圆周率PI的近似值,直到发现某一项的绝对值 小于10-6为止(该项不累加)。 如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x). 输出 PI=圆周率的近似值 输出的结果总宽度占10位,其中小数部分为8位。末尾输出换行。 */
int main()
{
    double pi = 0.0;for (double term = 1, i = 1, j = 3;fabs(term)>=1e-6;j+=2){
    pi += term;i = -i;term = i / j;}printf("PI=%10.8f\n",pi*4);getchar();return 0;
}

问题 H: 例题5-8 Fibonacci数列

#include <cstdio>
/*输入 一个不超过50的正整数 输出 Fibonacci数列的第n个数,末尾输出换行。*/
int fibo(int n)
{
    //利用递归实现分治法的简单例子//递归函数的实现必须要有递归边界和递归式if (n == 1 || n == 2)return 1;else return fibo(n - 1) + fibo(n - 2);
}
int main()
{
    int n;scanf("%d", &n);printf("%d\n", fibo(n));return 0;
}

问题 I: 习题5-10 分数序列求和

#include <cstdio>
/* 有一个分数序列:2/1 , 3/2 , 5/3 , 8/5 , 13/8 , 21/13 ... 求出这个数列的前20项之和. 输出 小数点后保留6位小数,末尾输出换行。*/
double top(int n)
{
    if (n == 1) return 2;else if (n == 2) return 3;else return top(n - 1) + top(n - 2);
}
double bottom(int n)
{
    if (n == 1) return 1;else if (n == 2) return 2;else return bottom(n - 1) + bottom(n - 2);
}int main()
{
    double sum = 0.0;for (int i = 1; i <= 20; i++){
    sum += double(top(i) / bottom(i));}printf("%.6f\n", sum);return 0;
}

数组

问题 A: 习题6-4 有序插入

#include <cstdio>
/* 第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。 第二行输入一个整数, 将此整数插入到前有序的9个数中,使得最终的10个数 依然是从小到大有序的。 输出 从小到大输出这10个数,每个数一行8*/
int main()
{
    int a[10],b;for (int i = 0; i < 9; i++)scanf("%d", &a[i]);scanf("%d",&b);/*for (int i = 8; i >= 0; i--){if (b < a[i])a[i + 1] = a[i];else{a[i+1] = b;break;} }for (int i = 0; i < 10; i++)printf("%d\n", a[i]);*/int i;for (i = 9; b < a[i - 1]&&i >= 1; i--)//注意i>=1a[i] = a[i - 1];a[i] = b;for (int i = 0; i < 10; i++)printf("%d\n", a[i]);return 0;
}

问题 B: 习题6-5 数组元素逆置

#include <cstdio>
/* 将一个长度为10的整型数组中的值按逆序重新存放。 输入 从键盘上输入以空格分隔的10个整数。 输出 按相反的顺序输出这10个数,每个数占一行。*/
int main()
{
    int a[10],b[10];int j = 9;for (int i = 0; i < 10; i++){
    scanf("%d", &a[i]);b[j] = a[i];j--;}for (int i = 0; i < 10; i++)printf("%d\n", b[i]);return 0;
}

问题 C: 习题6-6 杨辉三角

#include <cstdio>
//输入 输入只包含一个正整数n,表示将要输出的杨辉三角的层数。
//输出 对应于该输入,请输出1 - 相应层数的杨辉三角,每一层的整数之间用一个空格隔开, 最多输出10层
int main()
{
    int n, a[10] = {
     1, 1 };scanf("%d", &n);for (int i = 1; i <= n; i++){
    //打印第1,2层if (i == 1) printf("%d\n", a[0]);else if (i == 2) printf("%d %d\n", a[0], a[1]);else{
    //打印其它层int temp[10];temp[0] = 1;int j;//从a的现在一层推导出下一层,存入临时数组for (j = 1; j <= i - 2; j++)temp[j] = a[j - 1] + a[j];temp[j] = 1;//打印这一层for (int k = 0; k <=j; k++)printf("%d ", temp[k]);printf("\n");//更新数组afor (int m = 0; m < i; m++)a[m] = temp[m];}}return 0;
}

问题 D: 习题6-12 解密

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
//第一个字母变成第26个字母,第i个字母变成第(26 - i + 1)个字母,非字母字符不变。
//要求根据密码译回原文,并输出。
//输入 输入一行密文; 输出 解密后的原文,单独占一行。
int main()
{
    char str[100];gets(str);for (int i = 0; i < strlen(str); i++){
    if (str[i] >= 65 && str[i] <= 90){
    str[i] = 155 - str[i];}else if (str[i] >= 97 && str[i] <= 122){
    str[i] = 219 - str[i];}}puts(str);//syetem("pause");std::cin.get();return 0;}

问题 E: 习题6-13 字符串比较


#include <cstdio>
#include <cstring>
//比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;
//若s1 = s2,则输出0;若s1<s2,则输出一个负数。
// 要求:不用strcpy函数;两个字符串用gets函数读入。
// 输入 输入2行字符串
// 输出 一个整数,表示这两个字符串 比较的差值,单独占一行。
int main()
{
    char s[100], t[100];int temp;gets(s);gets(t);int a=strlen(s);int b=strlen(t);int lt = a < b ? a : b;for (int i = 0;i < lt; i++){
    temp=s[i] - t[i];if (temp)//如果不等于0break;else{
    if (a == b && i == a - 1)break;}	}printf("%d\n", temp);return 0;
}

问题 F: 例题6-1 逆序输出数组元素

#include <cstdio>
//输入 10个整数,以空格分隔
//输出 将输入的10个整数逆序输出,每个数占一行。
int main()
{
    int a[10];for (int i = 0; i < 10; i++)scanf("%d", a+i);for (int i = 9; i >= 0; i--)printf("%d\n", a[i]);return 0;
}

问题 G: 例题6-2 数组求解Fibonacci数列问题

#include <cstdio>
//输入 无
//输出 Fibonacci数列的前20个数,每个数占一行。
int main()
{
    int fib[20] = {
     1, 1 };for (int i = 2; i < 20; i++)fib[i]=fib[i - 1] + fib[i - 2];for (int i = 0; i < 20; i++)printf("%d\n", fib[i]);return 0;
}

问题 H: 例题6-3 冒泡排序

#include <cstdio>int main()
{
    int a[10];for (int i = 0; i < 10; i++)scanf("%d", &a[i]);for (int i = 1; i <= 9; i++){
    for (int j = 0; j <= 9-i; j++){
    if (a[j] > a[j+1]){
    int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}for (int i = 0; i < 10; i++)printf("%d\n", a[i]);return 0;
}

问题 I: 例题6-4 矩阵转置

#include <cstdio>
//输入 2行数据,每行3个整数,以空格分隔。
//输出 行列互换后的矩阵,3行,每行2个数据,以空格分隔
int main()
{
    int a[2][3];for (int i = 0; i < 2; i++){
    for (int j = 0; j < 3; j++){
    scanf("%d", &a[i][j]);}}/*for (int i = 0; i < 3; i++){for (int j = 0; j < 2; j++){printf("%d ", a[j][i]);}printf("\n");}*/int aT[3][2];for (int i = 0; i < 2; i++){
    for (int j = 0; j < 3; j++){
    aT[j][i] = a[i][j];}}for (int i = 0; i < 2; i++)printf("%d %d\n", aT[i][0], aT[i][1]);return 0;
}

问题 J: 例题6-9 字符串求最大值

#include <cstdio>
#include <cstring>
//输入 输入3行,每行均为一个字符串。
//输出 一行,输入三个字符串中最大者
int main()
{
    char s1[100], s2[100], s3[100], *Max;gets(s1);gets(s2);gets(s3);Max = s1;if (strcmp(Max, s2) < 0) Max = s2;if (strcmp(Max, s3) < 0) Max = s3;printf("%s", Max);return 0;
}

函数

问题 A: 习题7-5 字符串逆序存放

#include <cstdio>
#include <cstring>
//输入 一行字符串。
//输出 输入字符串反序存放后的字符串。单独占一行
void reverse(char a[])
{
    int len = strlen(a);for (int i = 0; i < len/2; i--){
    int temp = a[i];a[i] = a[len - 1 - i];a[len - 1 - i] = temp;}}
int main()
{
    char a[100];gets(a);reverse(a);printf("%s\n", a);return 0;
}

问题 B: 习题7-7 复制字符串中的元音字母

//输入 一个字符串(一行字符)。
//输出 该字符串所有元音字母构成的字符串。行尾换行
void vowels(char s1[],char s2[])
{
    int len = strlen(s1),j = 0;for (int i = 0; i < len; i++){
    if (s1[i] == 'a' || s1[i] == 'e' || s1[i] == 'i' || s1[i] == 'o'|| s1[i] =='u'){
    s2[j] = s1[i];j++;}}s2[j] = '\0';
}
int main()
{
    char s1[100],s2[100];gets(s1);vowels(s1,s2);printf("%s\n", s2);return 0;
}

指针

问题 A: C语言10.1


#include <cstdio>
//输入a和b两个整数,按先大后小的顺序输出a和b
//注意请使用指针变量的方式进行比较和输出
int main()
{
    int a, b;scanf("%d%d\n", &a, &b);int *p=&a, *p1=&b;if (*p >= *p1)printf("%d %d\n", *p, *p1);elseprintf("%d %d\n", *p1, *p);return 0;
}

问题 B: C语言10.2

#include <cstdio>
//输入 三个用空格隔开的整数a、b和c。
//输出 按先大后小的顺序输出a、b和c,用空格隔开。请注意行尾输出换行
int main()
{
    int a[3];scanf("%d%d%d\n", &a[0], &a[1], &a[2]);for (int i = 1; i <= 2; i++){
    for (int* p = a; p < a+2; p++){
    if (*p < *(p + 1)){
    int temp = *p;*p = *(p + 1);*(p + 1) = temp;}}}printf("%d %d %d\n", *a, *(a + 1), *(a + 2));return 0;
}

问题 C: C语言10.10

#include <cstdio>
#include <cstring>
//给定字符串定义char *a = “I love China!”,
//读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串。
//输入 一个整数n,保证0 <= n<13.
//输出 输出进行了题目描述中赋值操作之后a对应的字符串.请注意行尾输出换行
int main()
{
    char* a = "I love China!";int n;scanf("%d", &n);puts(a + n);return 0;
}

问题 D: C语言10.15

#include <cstdio>
#include <cstring>
//输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理。
//输入 3行,每行一个用字符串。保证每个字符串的长度不超过20。
//输出 按从小到大的顺序输出这3个字符串,每个字符串一行
void swap(char a[], char b[])
{
    char t[21];strcpy(t, a);strcpy(a, b);strcpy(b, t);
}
int main()
{
    char s[3][21];for (int i = 0; i < 3; i++)gets(s[i]);if (strcmp(s[0], s[1])>0)swap(s[0], s[1]);if (strcmp(s[1], s[2]) > 0)swap(s[1], s[2]);if (strcmp(s[0], s[1]) > 0)swap(s[0], s[1]);puts(s[0]);puts(s[1]);puts(s[2]);return 0;
}

问题 E: C语言10.16

#include <cstdio>
//输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求
//用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
//输入 用空格隔开的10个整数。
//输出 输出进行题目描述操作之后的10个整数,每个整数之后输出一个空格
void inp(int a[])
{
    for (int i = 0; i < 10; i++)scanf("%d", a + i);
}
void swap(int *a, int *b)
{
    int temp = *a;*a = *b;*b = temp;
}
void tackle(int a[])
{
    int min=*a, max=*a,mink=0,maxk=0;for (int i = 1; i < 10; i++){
    if (a[i] < min){
    min = *(a + i);mink = i;}if (a[i] > max){
    max = *(a + i);maxk = i;}}swap(a, a + mink);swap(a + 9,a + maxk);
}
void oup(int a[])
{
    for (int* p = a; p < a+10; p++){
    printf("%d ", *p);}printf("\n");
}
int main()
{
    int a[10];inp(a);tackle(a);oup(a);return 0;
}

结构体

问题 A: C语言11.1

#include <cstdio>
#include <cstring>
//输入第一行有一个整数n,表示以下有n张选票信息将会输入。保证n不大于100。
//以后的n行中,每一行包含一个人名,为选票的得票人。保证每一个人名都是Li,
//Zhang和Fun中的某一个。
//输出
//有三行,分别为Li,Zhang和Fun每人的得票数。格式为首先输出人名,其后输出一个冒号,
//最后输出候选人的得票数。注意行尾输出换行
struct person{
    char name[20];int count;
}leader[3] = {
     "Li", 0, "Zhang", 0, "Fun", 0 };
int main()
{
    int n;char name1[20];scanf("%d", &n);for (int i = 0; i < n; i++){
    scanf("%s", &name1);if (!strcmp(name1, leader[0].name))leader[0].count++;else if (!strcmp(name1, leader[1].name))leader[1].count++;else leader[2].count++;}for (int i = 0; i < 3; i++){
    printf("%s:%d\n", leader[i].name, leader[i].count);}return 0;
}

问题 B: C语言11.2

#include <cstdio>
//输入 第一行有一个整数n,表示以下有n个学生的信息将会输入。保证n不大于20。
//以后的n行中,每一行包含对应学生的学号、名字、性别和年龄,用空格隔开。保证每一个人名
//都不包含空格且长度不超过15,性别用M和F两个字符来表示。
//输出 有n行,每行输出一个学生的学号、名字、性别和年龄,用空格隔开
struct student{
    int num;char name[20];char sex;int age;
};
int main()
{
    int n;scanf("%d", &n);student stu[20],*ptrToStu[20];for (int i = 0; i < n; i++){
    scanf("%d %s %c %d\n", &stu[i].num, &stu[i].name, &stu[i].sex, &stu[i].age);ptrToStu[i] = &stu[i];}for (int i = 0; i < n; i++)//printf("%d %s %c %d\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age);printf("%d %s %c %d\n", ptrToStu[i]->num, ptrToStu[i]->name, ptrToStu[i]->sex, ptrToStu[i]->age);return 0;
}

问题 C: C语言11.4

#include <cstdio>
struct body{
    int num;char name[10];char sex;char job;union{
    int classes;char position[10];}category;
}member[100];
int main()
{
    int n;scanf("%d", &n);for (int i = 0; i < n; i++){
    scanf("%d %s %c %c", &member[i].num, member[i].name, &member[i].sex,&member[i].job);if (member[i].job == 's')scanf("%d", &member[i].category.classes);else if (member[i].job == 't')scanf("%s", member[i].category.position);}for (int i = 0; i < n; i++){
    if (member[i].job == 's')printf("%d %s %c %c %d\n", member[i].num, member[i].name, member[i].sex, member[i].job, member[i].category.classes);else if (member[i].job == 't')printf("%d %s %c %c %s\n", member[i].num, member[i].name, member[i].sex, member[i].job, member[i].category.position);}return 0;
}

问题 D: C语言11.7

#include <cstdio>
typedef struct student {
    int num;char name[20];int score1;int score2;int score3;
};
void input(student stds[]) {
    for (int i = 0; i < 5; i++)scanf("%d %s %d %d %d", &stds[i].num, stds[i].name, &stds[i].score1, &stds[i].score2, &stds[i].score3);
}
void print(student *stds) {
    for (int i = 0; i < 5; i++)printf("%d %s %d %d %d\n", stds[i].num, stds[i].name, stds[i].score1, stds[i].score2, stds[i].score3);
}int main()
{
    struct student stds[5];input(stds);print(stds);return 0;
}

问题 E: C语言11.8

#include <cstdio>
struct student{
    int num;char name[20];int score[3];
};
void input(student stu[])
{
    for (int i = 0; i < 10; i++)scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
}
void print(student stu[])
{
    double sum[3] = {
     0 }, max_aver = (stu[0].score[0] + stu[0].score[1] + stu[0].score[2]) / 3.0;int k = 0;for (int i = 0; i < 10; i++){
    sum[0] += stu[i].score[0];sum[1] += stu[i].score[1];sum[2] += stu[i].score[2];double now_max = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;if (now_max > max_aver){
    k = i;max_aver = now_max;}}printf("%.2f %.2f %.2f\n", sum[0] / 10, sum[1] / 10, sum[2] / 10);printf("%d %s %d %d %d\n", stu[k].num, stu[k].name, stu[k].score[0], stu[k].score[1], stu[k].score[2]);
}
int main()
{
    student stu[10];input(stu);print(stu);return 0;
}