时间限制 : 1 秒
内存限制 : 128 MB
数根是这样定义的:对于一个正整数n,将它的各个数位上的数字相加得到一个新数,如果这个数是一位数,我们就称之为n的数根,否则重复处理直到它成为一个一位数。
例如,n=34,3+4=7,7是一位数,所以7是34的数根。
再如,n=345,3+4+5=12,1+2=3,3是一位数,所以3是345的数根。
对于输入数字n,编程计算它的数根。
输入
输入正整数n(1 <= n < 10,000,000)
输出
输出n的数根。
样例
输入
345
输出
3
答案:
#include
using namespace std;
int main() {
int n, r;
cin >> n;
int sum = 0;
while (true) {
while (n) {
r = n % 10;
sum += r;
n = n / 10;
}
if (sum >= 10) {
n = sum;
sum = 0;
}
else {
break;
}
}
cout << sum << endl;
return 0;
}
分析:这个题难度还不小,第一次写好几次都没整明白逻辑。但经过几次修改算是整明白了。用sum变量来记录这个数各个位数之和,如果sum大于等于10,再把sum赋值给n,此时sum的值要重新赋值为0。直到sum小于10即可。这个题难度还是不小的。
是否通过:
时间限制 : 1 秒
内存限制 : 128 MB
求一个数的最大质因数(包含它本身)。
输入
正整数n(2<=n<=10,000,000,000,000)
输出
正整数n的最大质因数
样例
输入
12
输出
3
答案:
#include
#include
using namespace std;
long long int isFlag(long long int n) {
int flag = 1;
int ret = 0;//用来记录最大质因数
if (n == 1||n == 2) {
return n;
}
else {
for (long long int i = 2; i <= sqrt(n);i++ ) {
if (n % i == 0) {
flag = 0;
break;
}
}
}
if (!flag) {
for (long long i = 2; i <= n; i++) {
/*这个循环是让n依次找到从小到大的质因数,然后依次除以这个质因数
* 直到当前这个数本身就为质数。
*/
while (n % i == 0) {
n /= i;
ret = i;
}
}
return ret;
}
return n;
}
int main() {
long long n;
cin >> n;
cout << isFlag(n) << endl;
return 0;
}
分析:本题难度非常大,首先你得直到任何一个合数都可以写成若干个质数的乘积,比如4=2*2,
30=2*3*5,再如455=5*7*13。当然,如果这个数是素数的话,最大质因数就是它本身。我们现在就是求任意数的最大质因素。算法如下:
1、首先判断该数n(n>=2)是不是素数,如果是,则最大质因素是它本身
2、如果该数不是素数,则让该数从i(i=2)开始对该数取余,如果余数为0,则让n除以i,之后i++,最后知道n为素数为止,此时n为最大质因数。
是否通过:
时间限制 : 1 秒
内存限制 : 128 MB
某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子?(第一年年薪N万,房价200万)
输入
一行,包含两个正整数N(10 <= N <= 50), K(1 <= K <= 20),中间用单个空格隔开。
输出
如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下,否则输出Impossible。
样例
输入
50 10
输出
8
答案:
#include
using namespace std;
int main() {
int N, K;
int count = 1;
double price = 200;
cin >> N >> K;
int step = N;
double rat = K / 100.0;
while (N < price) {
N += step;
price *= (1 + rat);
count++;
if (count > 20) {
break;
}
}
if (count <= 20) {
cout << count << endl;
}
else {
cout << "Impossible" << endl;
}
return 0;
}
分析:本题难度不大,但是容易陷入死循环,当年薪N很小,跟不上房价涨的速度,则N可能会永远小于price,则陷入死循环。因此当count大于20时要跳出循环。这是这个题容易出错的一个点。
是否通过:
时间限制 : 1 秒
内存限制 : 128 MB
一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下。 编程计算气球在第10次落地时,共经过多少米? 第10次反弹多高?
输入
输入一个整数h,表示球的初始高度。
输出
输出包含两行:
第1行:到球第10次落地时,一共经过的米数。
第2行:第10次弹跳的高度。
注意:结果可能是实数,结果用double类型保存。
提示:输出时不需要对精度特殊控制,用cout << ANSWER,或者printf("%g", ANSWER)即可。
样例
输入
20
输出
59.9219 0.0195313
答案:
#include
using namespace std;
int main() {
int h;
cin >> h;
int n = 10;
double sum = h;
double step = h;
for (int i = 1; i <= n - 1; i++) {
sum += step;
step /= 2.0;
}
cout << sum << endl;
cout << step/2.0 << endl;
return 0;
}
分析:这个题让我想起在大一第一次学编程老师讲这个题,当时感觉好难好难。因为当时没有入门,就感觉编程特难,现在再看这个题,感觉一般。但是这个题就是要注意一点:
第i次落地,要循环计算i-1次
第i次落地时,也就是第i-1次弹起时。因此在计算第i次弹起高度时,要再除以2.0
是否通过:
时间限制 : 1 秒
内存限制 : 128 MB
监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。
输入
第一行为一个正整数n,n < 100
其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。
输出
输出仅一行,血压连续正常的最长小时数(注意审题)
样例
输入
4 100 80 90 50 120 60 140 90
输出
2
答案:
#include
bool isFlag1(int a, int b) {
if (a >= 90 && a <= 140 && b >= 90 && b <= 140) {
return true;
}
return false;
}
bool isFlag2(int a, int b) {
if (a >= 60 && a <= 90 && b >= 60 && b <= 90) {
return true;
}
return false;
}
using namespace std;
int main() {
int n,count=1,max=0;
int a[100],b[100];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
for (int i = 0; i < n-1; i++) {
if (isFlag1(a[i], a[i + 1]) && isFlag2(b[i], b[i + 1])) {
count++;
}
else {
max = max < count ? count : max;
count = 1;
}
}
max = max < count ? count : max;
cout << max << endl;
return 0;
}
分析:这个题难度还是稍稍较大,首先是对题目的理解。这个题目求的是血压连续正常最长的小时数,注意有个连续。当出现不连续的情况下,coun要置0,从当前位置又要重新开始计算。
是否通过: