题目描述
这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?
输入 输入月数n(1<=n<=44)。
输出 输出第n个月有多少对兔子。
样例输入 Copy
3
样例输出 Copy
2
提示
本题是一个经典的递推入门题目: 用f(n)表示第n个月的兔子数目,则: f(n) = f(n-1) + 本月新生兔子数 而,本月新生兔子数 = f(n-2) (因为上上个月已存在的每只兔子,本月都会新生一只兔子) 所以,f(n) = f(n-1) + f(n-2) 这就是著名的fabinacci数列,后一项等于前两项的和: 1 1 2 3 5 8…
#include
int main()
{
int n,i,a,b,t;
t=1,a=1;
scanf("%d",&n);
for(i=3;i<=n;i++)
{
b=a;
a+=t;
t=b;
}
if(n<=2)
printf("1\n");
else
printf("%d\n",a);
}
Vs
n = int(input())
t = a = 1
for i in range(3,n+1):
b = a
a += t
t = b
if n <= 2:
print("1")
else:
print(a)
题目描述
小明对某些数字有偏爱,例如,他喜欢7的倍数,而不喜欢4的倍数,如果一个整数是7的倍数,而不是4的倍数,小明会认为这个数字是他的幸运数字。现在给定两个整数m和n,请你帮小明找m到n范围内的最大的幸运数字。如果m到n范围内没有幸运数字,则输出“no”
输入 两个正整数m和n(m < =n,且均小于10的9次方)
输出 一个整数,即m到n范围内的最大的幸运数字。
样例输入 Copy
90 100
样例输出 Copy
98
//方法一
#include
#include
int main()
{
int i,m,n,max;
scanf("%d%d",&m,&n);
max=INT_MIN;
/*在limits头文件中,INT_MIN表示无穷小,
对应INT_MAX表示无穷大*/
for(i=m;i<=n;i++)
{
if(i%4!=0&&i%7==0)
{
max=(max>i)?max:i;
}
}
if(max!=INT_MIN)
printf("%d",max);
else
printf("no");
}
//方法二
#include
int main()
{
int answer=0;
int a,b,x;
scanf("%d%d",&a,&b);
while(b>=a)
{
if(b%7==0&&b%4!=0)
{
printf("%d",b);
answer = 1;
break;
}
else
b--;
}
if(answer==0)
printf("no");
}
Vs
m,n =map(int,input().split())
i = n
flag = 0
while i >= m:
if i % 7 == 0 and i % 4 != 0:
print(i)
flag = 1
break
i-=1
if flag == 0:
print("no")
题目描述
输入一个正整数n,判断n是否是素数,若n是素数,输出”Yes”,否则输出”No”。
输入 输入一个正整数n(n<=1000)
输出 如果n是素数输出"Yes",否则输出"No"。输出占一行。
样例输入 Copy
2
样例输出 Copy
Yes
#include
#include
int main()
{
int i, m,k,find;
scanf("%d",&m);
k=(int)sqrt(m);
find=0;
for(i=2;i<=k;i++)
if(m%i==0)
{
find=1;
break;
}
if(find==1||m==1)
printf("No\n");
else
printf("Yes\n");
}
Vs
#方法一
import math
m = int(input())
k = int(math.sqrt(m))
find = 0
for i in range(2,k+1):
if m % i == 0:
find = 1
break
if find == 1 or m == 1:
print("No",end='')
else:
print("Yes",end='')
#方法二
import math
def in_prime(n):
if n<2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if m % i == 0:
return False
return True
m = int(input())
if in_prime(m):
print("Yes",end='')
else:
print("No",end='')
题目描述
已知不等式 1!+2!+3!+…+m!‹n,请编程对用户指定的n值计算并输出满足该不等式的m的整数解。
输入 输入一个整数n,n为int范围内的正整型。
输出 输出m的取值范围,具体格式见输出样例。
样例输入 Copy
2000000000
样例输出 Copy
m<=12
#include
int main()
{
int m;
double sum,n,fact;
scanf("%lf",&n);
fact=1,sum=0;
for(m=1;sum<n;m++)
{
fact=fact*m;
sum=sum+fact;
}
printf("m<=%d",m-2);
}
Vs
n = float(input())
fact = i = 1
sum = 0
while True:
fact *=i
sum +=fact
if sum >= n:
print ("m<=%d" %(i-1))
break
i+=1
题目描述
输入一批学生的成绩(整数),输出最高分。
输入 输入包含多个非负整数和一个负整数。该负数不作为有效成绩,只表示输入结束。
输出 输出一个整数,即最高分。单独占一行。
样例输入 Copy
7 6 5 9 2 -1
样例输出 Copy
9
#include
int main()
{
int max,score;
scanf("%d",&score);
max=score;
while(score>0)
{
scanf("%d",&score);
max=(score>max)?score:max;
}
printf("%d\n",max);
}
Vs
a = input().split()
i = max = 0
while True:
if int(a[i]) < 0:
break
if int(a[i]) > max:
max = int(a[i])
i += 1
print(max)
题目描述
输入一个正整数,将其逆序输出,每个数字后有一个空格。
输入 输入一个正整数n,你可以假设n在int范围内
输出 将n按其逆序输出,每个数字后有一个空格,输出占一行。例如,输入12354,输出4 5 3 2 1
样例输入 Copy
12354
样例输出 Copy
4 5 3 2 1
提示
整数n对10取模可得到个位上的数字,而利用整数商是整数这一特点,整数n除以10的商正好“扔掉”了个位上的数字
#include
int main()
{
int n,m;
scanf("%d",&n);
while(n!=0)
{
m=n%10;
printf("%d ",m);
n=n/10;
}
}
Vs
n = int(input())
while n != 0:
m = n % 10
print(m,end=' ')
n = n // 10
题目描述
输入一个不大于10的9次方的正整数,从高位开始逐位分割并输出各位数字。
输入 输入一个正整数n,n是int型数据
输出 依次输出各位上的数字,每一个数字后面有一个空格,输出占一行。例如,输入 12345 ,输出 1 2 3 4 5
样例输入 Copy
12345
样例输出 Copy
1 2 3 4 5
提示
注意整数运算避免使用double类型的函数如pow()。
本题可先用一个循环计算出最高位的位权h,然后再用一个循环,循环内容为: 输出最高位(n/h)、扔掉最高位(n = n%h)、降低最高位位权(h = h/10),直到位权h为0。
#include
int main()
{
int n, temp, base;
scanf("%d", &n);
temp = n;
base = 1;
while( temp > 9) //得到最高位位权base
{
temp /= 10; //扔掉各位
base *= 10; //位权增加
}
while(base > 0)
{
printf("%d ", n/base); //输出最高位
n %= base; //扔掉最高位
base /= 10; //位权降低
}
printf("\n");
return 0;
}
Vs
n = int(input())
temp = n
base = 1
while temp > 9:
temp //= 10
base *= 10
while base > 0:
print(n // base,end=' ')
n %= base
base //= 10
题目描述
输入两个不大于10的9次方的正整数,输出其最大公约数。
输入 输入两个正整数m和n,数据之间用空格隔开。
输出 输出一个整数,表示m和n的最大公约数。
样例输入 Copy
4 6
样例输出 Copy
2
提示
请查阅欧几里得定理及辗转相处法。
#include
int main()
{
int a,b,r;
scanf("%d %d",&a,&b);
while(r=a%b,r!=0)
{
a=b;
b=r;
}
printf("%d",b);
}
Vs
a,b = map(int,input().split())
r = a % b
while r != 0:
a = b
b = r
r = a % b
print(b,end=' ')
题目描述
输入两个正整数,输出其最大公约数和最小公倍数。
输入 输入两个正整数n和m(n,m<=1000000)。输入保证最终结果在int范围内。
输出 输出两个整数,用空格隔开。表示m和n的最大公约数和最小公倍数。
样例输入 Copy
4 6
样例输出 Copy
2 12
提示
注意运算过程中的溢出问题
#include
int main(void)
{
int a,b,r,x,y;
scanf("%d%d",&a,&b);
x=a;
y=b;
while(r = a % b, r != 0)
//当余数不为0,用(b,r)更新(a,b)
{
a = b;
b = r;
}
printf("%d %d\n", b, x / b * y);
//先除再乘,避免中间结果溢出
return 0;
}
Vs
a,b = map(int,input().split())
x = a
y = b
r = a % b
while r != 0:
a = b
b = r
r = a % b
print(b,x//b*y)
题目描述
从键盘输入一批字符,以@结束,按要求加密并输出。
输入 从键盘输入一批字符,占一行,以@结束。
输出 输出占一行
加密规则:
1)所有字母均转换为小写。
2)若是字母’a’到’y’,则转化为下一个字母。
3)若是’z’,则转化为’a’。
4)其它字符,保持不变。
样例输入 Copy
Kyh520@
样例输出 Copy
lzi520
#include
int main()
{
char ch;
while(scanf("%c",&ch),ch!='@')
{
if(ch>='A'&&ch<='Y')
{
ch=ch+33;
}
else if(ch>='a'&&ch<='y')
ch=ch+1;
else if(ch=='z'||ch=='Z')
ch='a';
printf("%c",ch);
}
}
Vs
a = input()
j=0
for i in range(len(a)):
x = str(a[j])
if x == '@':
break
if x >= 'A' and x <= 'Z':
x = chr(ord(x) + 32)
if x >= 'a' and x <= 'y':
x = chr(ord(x) + 1)
elif x == 'z':
x = 'a'
print(x,end='')
j += 1
题目描述
输入一行字符,以回车符作为输入结束的标志。统计其中数字字符的个数。
输入 多个字符,以回车符结束,回车符不作为有效字符。
输出 输出一个整数,表示数字字符的个数。
样例输入 Copy
12abrt12@2013
样例输出 Copy
8
#include
int main()
{
char ch;
int sum=0;
while(scanf("%c",&ch),ch!='\n')
{
if(ch>='0'&&ch<='9')
sum++;
}
printf("%d",sum);
}
Vs
a = input()
j = k = 0
for i in range(len(a)):
x = str(a[j])
if x >= '0' and x <= '9':
k +=1
j += 1
print(k)