编程练习————part7

本文介绍两种算法实现:一是通过循环计算直至得到数根的一位数结果,二是调整数组使得所有偶数位或奇数位分别存放偶数或奇数,确保时间与空间复杂度高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.

题目:

数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于24 来说,把2 和4 相加得到6,由于6 是一位数,因此6 是24 的数根。
再比如39,把3 和9 加起来得到12,由于12 不是一位数,因此还得把1 和2 加起来,最后得到3,这是一个一位数,因此3 是39 的数根。
现在给你一个正整数,输出它的数根。

输入:24 39
输出: 6 3

思路:这题意思很明确,将所有的位数加起来,如果大于等于10,再把所有的位数加起来,直到最后的数小于10,将数输出。

我们在输入的过程中,为了避免数字过大,我们采取字符串的方式进行输入,然后把字符串的每一位加起来进行树根的判断

代码:
#include <iostream>
#include <string>
using namespace std;
int GetRoot(int sum)
{
    if(sum<10)
        return sum;
    int count = 0;
    while(sum)
    {
        int tmp = sum%10;
        sum/=10;
        count+=tmp;
    }
    return count;
}
int main()
{
    string s;
    while(cin>>s)
    {
        int count = 0;
        for(int i=0;i<s.size();i++)
            count+=s[i]-'0';
        while(count>=10)
        {
            count = GetRoot(count);
        }
        cout<<count<<endl;
    }
    return 0;
}

二.

题目:

给定一个长度不小于2的数组arr。 写一个函数调整arr,使arr中要么所有的偶数位上都是偶数,要么所有的奇数位上都是奇数上。 要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6…算作偶数位,下标1,3,5,7…算作奇数位,例如[1,2,3,4]调整为[2,1,4,3]即可。

思路:

我们定义两个变量i,j分别指向奇数位和偶数位,当奇数位的数%2余1,说明该位是奇数,i+=2;当偶数位的数%2余0,说明该位是偶数,j+=2,当都不满足时,说明奇数位是偶数,偶数位是奇数,把两个位置的数交换即可。

代码:
class Solution {
public:
    /**
     *  奇数位上都是奇数或者偶数位上都是偶数
     *  输入:数组arr,长度大于2
     *  len:arr的长度
     *  将arr调整成奇数位上都是奇数或者偶数位上都是偶数
     */
    void oddInOddEvenInEven(vector<int>& arr, int len) 
    {
        int i=0;
        int j=1;
        while(i<len&&j<len)
        {
            if(arr[i]%2==0)
            {
                i+=2;
                continue;
            }
            if(arr[j]%2!=0)
            {
                j+=2;
                continue;
            }
            swap(arr[i],arr[j]);
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值