头哥C++编程基础实训

第1关:对称数生成

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

 int num;

 cin>>num;

//请在此添加代码,输入数字,并判断是否为正数,不是则输出“-1”;

//如果是大于3位的正整数,只取最后三位数字,并生成对称数;如果是小于等于三位的正整数,则直接生成对称数;

/**********Program**********/

if(num>0){

    int t;

    int a;

    a=num;

    for(t=0;num>0;t++){

        num=num/10;

    }

    num=a;

    if(t>3){

        cout<<num%1000;

        int j=0;

        for(;j<3;j++){

            cout<<num%10;

            num=num/10;

        }

    }else{

        cout<<num;

        int j=0;

        if(num>=100){

            for(;j<3;j++){

            cout<<num%10;

            num=num/10;

        }

        }else{

            for(;j<2;j++){

            cout<<num%10;

            num=num/10;

        }

        }

        }

   

}else{

    cout<<"-1";

}

/**********  End  **********/

 return 0;

}

第2关:黑洞陷阱

// 包含两种I/O库,可以使用任一种输入输出方式

#include <stdio.h>

#include <iostream>

using namespace std;

/**

 * 获取一个数字的每位数的数组,不足三位补 0

 * @param num

 */

int *getDigits(int num) {

    int *digits = new int[3];

    if (num < 10) {

        digits[0] = num;

        digits[1] = digits[2] = 0;

    } else if (num < 100) {

        digits[0] = num / 10;

        digits[1] = num % 10;

        digits[2] = 0;

    } else if (num < 1000) {

        digits[0] = num / 100;

        digits[1] = (num / 10) % 10;

        digits[2] = num % 10;

    }

    return digits;

}

/**

 * 获取最大值

 * @param nums

 * @return

 */

int getMax(const int nums[3]) {

    int max = 0;

    for (int i = 0; i < 3; ++i) {

        max = max > nums[i] ? max : nums[i];

    }

    return max;

}

/**

 * 获取最小值

 * @param nums

 * @return

 */

int getMin(const int nums[3]) {

    int min = 10;

    for (int i = 0; i < 3; ++i) {

        min = min < nums[i] ? min : nums[i];

    }

    return min;

}

/**

 * 一个数重组后的最大值

 * @param num

 * @return

 */

int getMaxNum(int num) {

    int *digits = getDigits(num);

    int max = getMax(digits);

    int min = getMin(digits);

    int mid = digits[0] + digits[1] + digits[2] - max - min;

    return max * 100 + mid * 10 + min;

}

/**

 * 一个数重组后的最小值

 * @param num

 * @return

 */

int getMinNum(int num) {

    int *digits = getDigits(num);

    int max = getMax(digits);

    int min = getMin(digits);

    int mid = digits[0] + digits[1] + digits[2] - max - min;

    return max + mid * 10 + min * 100;

}

int main() {

    int n;

    // 请在此添加代码,输出整数进入黑洞过程

    /********** Begin *********/

    int max, min, index = 0;

    cin >> n;

    while (n != 495) {

        index++;

        max = getMaxNum(n);

        min = getMinNum(n);

        n = max - min;

        cout << index << ":" << max << "-" << min << "=" << n << endl;

    }

    /********** End **********/

    return 0;

}

第3关:登月纸桥

#include <iostream>

using namespace std;

// foldTimes-计算建纸桥的折叠次数

// 参数:dis-星际距离(千米),thick-纸的厚度(毫米)

// 返回值:建桥需要折叠的次数

int foldTimes(double dis, double thick);

int main() {

    double dis, thick;

    cin >> dis >> thick;

    cout << "需要折叠" << foldTimes(dis, thick) << "次" << endl;

    return 0;

}

/**

 * 计算折叠的次数

 * @param dis

 * @param thick

 * @return

 */

int foldTimes(double dis, double thick) {

    // 请在这里补充代码,实现函数foldTimes

    /********** Begin *********/

    int cnt = 0;

    while (thick < dis * 1000000) {

        thick *= 2;

        cnt++;

    }

    return cnt;

    /********** End **********/

}

第4关:递归求函数值

#include <iostream>

using namespace std;

//请在此添加代码,定义recursion_fun()函数,输入int型数据,输出int型函数值;

/**********Program**********/

int recursion_fun(int n)

{

    if(n<=2)

        return n;

    else if(n<=5&&n>2)

        return (n-1)*(n-1);

    else return recursion_fun(n-1)-recursion_fun(n-4);

}

第5关:最大销售增幅

#include <iostream>

using namespace std;

// 函数maxIncrease:计算销售额增幅

// 参数:s-销售额数组,n-销售额数组长度,n>1

// 返回值:销售额最大增幅

int maxIncrease(int s[], int n);

int main()

{

    int n, a[30], i;     // 定义变量及数组,n-销售额个数,a-销售额数组

    cin >> n;      // 输入销售额数量,n>1

    // 输入n个销售额,分别存入a[0]到a[n-1]

    for(i = 0; i < n; i++)

        cin >> a[i];

    i = maxIncrease(a,n);

    cout << "最大销售增幅为:" << i << endl;

    return 0;

}

int maxIncrease(int s[], int n)

{

    //请在此添加代码,实现函数maxIncrease

    /********** Begin *********/

    int ans = 0xefefefef;

    for (int i = 0; i < n; i ++ ) {

        for (int j = i; j < n; j ++ ) {

            ans = max(ans, s[j] - s[i]);

        }

    }

    return ans;

    /********** End **********/

}

第6关:队列变换

#include <iostream>

using namespace std;

// 函数rotateLeft:矩阵循环左移

// 参数:a-100*100的二维数组,用来存储n行n列的数组(n<100),存储在其~n-1行和~n-1列,

// m-循环左移的位数(0<m<n)

// 返回值:无,循环左移的结果写入原二维数组中

// 说明:传递多维数组时,形式参数中,除了第一维外,其它维的大小必须给出

// 方便编译器计算每个数组元素的地址

void rotateLeft(int a[][100],int n,int m);

int main()

{

    int a[100][100];     // 定义存储二维数组的空间

    int n, m;

    cin >> n >> m;     // 输入n和m

    // 输入n*n的矩阵,存储在数组a的~n-1行和~n-1列

    int i, j;

    for(i = 0; i < n; i++)

        for(j = 0; j < n; j++)

            cin >> a[i][j];

    // 循环左移

    // 说明:传递多维数组时,实在参数只需要给出数组名就可以了

    rotateLeft(a,n,m);

    // 输出循环右移的结果

    for(i = 0; i < n; i++)

    {

        for(j = 0; j < n; j++)

            cout << " " << a[i][j];

        cout << endl;

    }

    return 0;

}

int b[110][110];

void rotateLeft(int a[][100],int n,int m)

{

    // 请在此添加代码,实现函数rotateLeft

    /********** Begin *********/

    for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) b[i][j] = a[i]

[j];

    for (int i = 0; i < n; i ++ ) {

        for (int j = 1; j <= m; j ++ ) a[i][n - m + j - 1] = b[i][j - 1];

        for (int j = 1; j <= n - m; j ++ ) a[i][j - 1] = b[i][m + j - 1];

    }

    /********** End **********/

}

第7关:大写字母好看

#include <iostream>

using namespace std;

void toUp(char * str);

int main()

{

    char s[1024];

    cin.getline(s,1024);     // 输入一行字符

    toUp(s);     // 调用toUp函数,转换成大写字母

    cout<<s<<endl;     // 输出变更后的新字符串

    return 0;

}

// 函数toUp:将str指向的字符串中的小写字母变成对应的大写字母

// 参数:str-指向字符串

void toUp(char * str)

{

    // 请在此添加代码,实现函数toUp

    /********** Begin *********/

    char*p=str;

    while(*p!='\0'){

        if(*p>='a' && *p<='z'){

            *p=*p+'A'-'a';

        }

        p++;

    }

    /********** End **********/

}

第8关:用指针实现pswap函数

#include <iostream>

using namespace std;

void pswap(int * p, int *q);

int main()

{

    int a, b;

    cin >> a >> b;     // 输入两个整数

    pswap(&a,&b);     // 调用pswap函数,交换a、b的值

    cout << a << " " << b << endl;     // 输出a、b的值

    return 0;

}

//函数pswap:交换指针p和q指向的单元中的整数值

//参数:p,q-int类型指针,指向要交换的整数

void pswap(int * p, int *q)

{

    // 请在此添加代码,实现函数pswap

    /********** Begin *********/

    int temp=*p;

    *p=*q;

    *q=temp;

    /********** End **********/

}

第9关:最大值函数

int Max(int a,int b)

{

    /********* Begin *********/

    //找出两个参数中最大的那个并返回

return a > b?a : b;

   

   

    /********* End *********/

}

int Max(int a,int b,int c)

{

    /********* Begin *********/

    //找出三个参数中最大的那个并返回

return Max(a,Max(b,c));

   

   

    /********* End *********/

}

第10关:猴子选大王

#include <iostream>

using namespace std;

// 函数king:猴子选大王

// 参数:a-猴子数组n-1个猴子分别占据下标为~n-1的位置,n-数组长度

// 返回值:新猴王的下标序号

int king(int a[], int n);

int main()

{

    // 定义变量及数组,n-猴子数量,a-猴子数组

    int n, a[1000], i;

    // 输入猴子数量,n>0

    cin >> n;

    // 初始化猴子数组,n个猴子分别占据~n的位置

    a[0] = 0; // 0号位置没有猴子

    for(i = 1;i <= n; i++)

        a[i] = i;

    // 选大王啦

    i = king(a, n );

    cout << i << "号猴子是大王。" << endl;

    return 0;

}

int king(int a[], int n)

{

    // 请在此添加代码,实现函数king

    /********** Begin *********/

int i,j,t=0;

for(i=0;i<=n;i++)

a[i]=1;

for(i=1;i<=n;i++)

{

    j=1;

    while(j<=3)

    {

        t=(t+1)%n;

        if(a[t]==1)j++;

    }

    a[t]=0;

}

return t;

    /********** End **********/

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值