ZZULIOJ.1055:兔子繁殖问题 —— 1065: 统计数字字符的个数(C语言 Vs Python)

1055: 兔子繁殖问题

题目描述
这是一个有趣的古典数学问题,著名意大利数学家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<stdio.h>
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);
}
//或者
#include<stdio.h>
int f(int n)
{
	if(n==1||n==2)
		return 1;
	else
		return f(n-1) + f(n-2);		
} 
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d",f(n));
}

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)

1056: 幸运数字

题目描述
小明对某些数字有偏爱,例如,他喜欢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<stdio.h>
#include<limits.h>
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<stdio.h>
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")

1057: 素数判定

题目描述
输入一个正整数n,判断n是否是素数,若n是素数,输出”Yes”,否则输出”No”。

输入 输入一个正整数n(n<=1000)
输出 如果n是素数输出"Yes",否则输出"No"。输出占一行。
样例输入 Copy
2
样例输出 Copy
Yes

#include<stdio.h>
#include<math.h> 
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='')

1058: 求解不等式

题目描述
已知不等式 1!+2!+3!+…+m!‹n,请编程对用户指定的n值计算并输出满足该不等式的m的整数解。

输入 输入一个整数n,n为int范围内的正整型。
输出 输出m的取值范围,具体格式见输出样例。

样例输入 Copy
2000000000
样例输出 Copy
m<=12

#include<stdio.h>
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

1059: 最高分

题目描述
输入一批学生的成绩(整数),输出最高分。

输入 输入包含多个非负整数和一个负整数。该负数不作为有效成绩,只表示输入结束。
输出 输出一个整数,即最高分。单独占一行。

样例输入 Copy
7 6 5 9 2 -1
样例输出 Copy
9

#include<stdio.h>
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)

1060: 逆序数字

题目描述
输入一个正整数,将其逆序输出,每个数字后有一个空格。

输入 输入一个正整数n,你可以假设n在int范围内
输出 将n按其逆序输出,每个数字后有一个空格,输出占一行。例如,输入12354,输出4 5 3 2 1

样例输入 Copy
12354
样例输出 Copy
4 5 3 2 1

提示
整数n对10取模可得到个位上的数字,而利用整数商是整数这一特点,整数n除以10的商正好“扔掉”了个位上的数字

#include<stdio.h>
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

1061: 顺序输出各位数字

题目描述
输入一个不大于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<stdio.h>
 
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

1062: 最大公约数

题目描述
输入两个不大于10的9次方的正整数,输出其最大公约数。

输入 输入两个正整数m和n,数据之间用空格隔开。
输出 输出一个整数,表示m和n的最大公约数。

样例输入 Copy
4 6
样例输出 Copy
2

提示
请查阅欧几里得定理及辗转相处法。

#include<stdio.h>
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=' ')

1063: 最大公约与最小公倍

题目描述
输入两个正整数,输出其最大公约数和最小公倍数。

输入 输入两个正整数n和m(n,m<=1000000)。输入保证最终结果在int范围内。
输出 输出两个整数,用空格隔开。表示m和n的最大公约数和最小公倍数。

样例输入 Copy
4 6
样例输出 Copy
2 12

提示
注意运算过程中的溢出问题

#include<stdio.h>
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)

1064: 加密字符

题目描述
从键盘输入一批字符,以@结束,按要求加密并输出。

输入 从键盘输入一批字符,占一行,以@结束。
输出 输出占一行

加密规则:
1)所有字母均转换为小写。
2)若是字母’a’到’y’,则转化为下一个字母。
3)若是’z’,则转化为’a’。
4)其它字符,保持不变。

样例输入 Copy
Kyh520@
样例输出 Copy
lzi520

#include<stdio.h>
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

1065: 统计数字字符的个数

题目描述
输入一行字符,以回车符作为输入结束的标志。统计其中数字字符的个数。

输入 多个字符,以回车符结束,回车符不作为有效字符。
输出 输出一个整数,表示数字字符的个数。

样例输入 Copy
12abrt12@2013
样例输出 Copy
8

#include<stdio.h>
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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值