一.
题目:
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于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]);
}
}
};