算法练习-循环结构

本文详细介绍了多个涉及循环结构的编程题目,包括求余数、求乘积末尾的0、进位的三位数、找零钱、特殊回文数、完全平方数个数等,涵盖了数论、数位操作、完全平方数、回文数等多个知识点,旨在帮助读者熟练掌握循环结构的运用。


前言

本章主要记录循环结构的算法练习,顺序结构可以查看上一篇文章,算法-顺序结构


1、求余数

1.描述

输入一个
正整数n

输出
输出余数

输入样例 1

1
输出样例 1

6

2.分析

本题最直接的方法就是先取余数再求和最后再取余数,切记不可先全部求和再取余数,因为这样会超时,也会超过整型范围。
当然还有一种方法,我们发现这个式子是有规律的,所以就可以打表记录每一次的余数,看看是否有规律。我们就可以先看前40个余数

res = []
t = 0
for i in range(1, 40):
    t += 6 ** i
    mod = t % 7
    res.append(mod)
print(res)
[6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6]

我发现奇数位余数为6,偶数位余数为0,所以我们只需要判断数的奇偶性就可以直接的出答案

3.代码

方法一:

#include <iostream>
using namespace std;
int main(){
	int n,i,ans=0,s=1;
	cin>>n;
	for(i=1;i<=n;i++){
		s=s*6%7;
		ans=(ans+s)%7;
	}
	cout<<ans;
}

方法二:

n=int(input())
x=n%2
if x==0:
    print(0)
else:
    print(6)

2、求余数(2)

1.描述

求1+11+111+1111+…+11….11(n个1)的和除以7的余数是多少?
输入
一行:一个正整数n

输出
一行:所得的余数

输入样例 1

1
输出样例 1

1

2.分析

这个题也是一样的,可以打表找到规律,也可以先求余数在求和再求余数

3.代码

方法一:
python
通过打表发现余数为42个为一组,这个可能不太好发现

a = []
s = 0
for i in range(1, 86):
    s += int(str('1') * i)
    a.append(s % 7)
print(a)

[1, 5, 4, 2, 4, 4, 5, 2, 1, 6, 1, 1, 2, 6, 5, 3, 5, 5, 6, 3, 2, 0, 2, 2, 3, 0, 6, 4, 6, 6, 0, 4, 3, 1, 3, 3, 4, 1, 0, 5, 0, 0, 1, 5, 4, 2, 4, 4, 5, 2, 1, 6, 1, 1, 2, 6, 5, 3, 5, 5, 6, 3, 2, 0, 2, 2, 3, 0, 6, 4, 6, 6, 0, 4, 3, 1, 3, 3, 4, 1, 0, 5, 0, 0, 1]

还有就是要注意数组的下标

a = []
s = 0
for i in range(1,43):
    s += int(str('1')*i)
    a.append(s%7)
n = int(input())
x = n % 42
print(a[x-1])

方法二:
c语言

#include <stdio.h> 
int main(){
 int s=0,k=0,n;
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
 {
   k=k*10+1;
   k=k%7;
   s=s+k;
 }
 printf("%d\n",s%7);
 return 0;
}

3、乘积末尾的0

1.描述

输入一个正整数n;求n!=123*…*n,的乘积结果末尾有多少个0?

输入
输入一个正整数n。(n<=10000000)

输出
输出一行,表示乘积结果末尾是0的个数

输入样例 1

10
输出样例 1

2

2.分析

这个题就是数论里面的基本题,这里大家有兴趣可以去搜索一下证明过程

3.代码

n = int(input())
c=0
while(n):
    c+=n//5
    n//=5
print(c)

4、进位的三位数

1.描述

输入一个三位数a,求有多少个三位数与a的和发生进位的个数。

输入
输入一个三位数

输出
输出发生进位的三位数个数

输入样例 1

999
输出样例 1

900

2.分析

发生进位就是两个数字加起来大于10,也就是我们把这个三位数每一位都分离开来,然后进行判断,这里的话直接用python里面的map()函数。

3.代码

n = int(input())
a,b,c=map(int,str(n))
q=0
for i in range(100,1000):
    x,y,z=map(int, str(i))
    if z+c>=10 or y+b>=10 or x+a>=10:
        q+=1
print(q)

4、字母的值

1.描述

A、B、C各代表不同的数字,要使下面的等式成立:

AAA +BBB + CCC=CBBC

输出满足条件的A、B、C

输入

输出
输出A、B、C三个数,数与数之间用空格分开

输入样例 1


输出样例 1

1 1 1(输出样例)

2.分析

这里的话直接开三个循环,利用python里面的字符型和整型之间的转换快速完成判断

3.代码

for i in range(1, 9):
    for j in range(1, 9):
        for k in range(1, 9):
            a = str(i) * 3
            b = str(j) * 3
            c = str(k) * 3
            if int(a) + int(b) + int(c) == int(str(k) + str(j) * 2 + str(k)):
                print("{} {} {}".format(i, j, k))
8 2 1

5、敲七

1.描述

输入一个正整数n,输出1~n中,含7和7的倍数的个数,还有包含7的数字例如(17,27,37…70,71,72,73…)

输入
输入正整数n:1<=n<=10000000

输出
输出一个正整数(即含7或7的倍数的个数)

2.分析

这里直接把每个数字分离开来看是否含有7,另外单独判断7的倍数,这里考察的就是数位分离的基本

3.代码

n = int(input()) # 输入
ans = 0
for i in range(1, n + 1):
    j = i
    if i % 7 == 0:
        ans += 1
        continue
    while j > 0: # 数字分离
        if j % 10 == 7:  # 判断
            ans += 1
            break
        j //= 10
print(ans)

6、特殊回文数

1.描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n。

输入
输入一行,包含一个正整数n。

输出
输出满足条件的回文整数的个数。

输入样例 1

52
输出样例 1

3

2.分析

思路也是一样的把数的每一位分离开来,先判断是否是回文数,再求合,判断。这里题目明确了5位和6位的数,所以这里可以借用python的map()函数。也可用除的形式来保留每一位。

3.代码

python:

n = int(input())
count = 0
for i in range(10000, 100000):
    if str(i) == str(i)[::-1]:
        a, b, c, d, e = map(int, str(i))
        if a + b + c + d + e == n:
            count += 1
for j in range(100000, 1000000):
    if str(j) == str(j)[::-1]:
        a, b, c, d, e, f = map(int, str(j))
        if a + b + c + d + e + f == n:
            count += 1
print(count)
44
22

c++:

#include <iostream>
using namespace std;
int main(){
	int n, ans=0,a,b,c;  
	 ans=0;
	cin>>n;
    for(int i=100;i<1000;i++){
    	a=i/100;b=i%100/10;c=i%10;
    	if((a+b+c)*2==n) ans++;
	}
	for(int i=10;i<100;i++){
		for(int j=0;j<10;j++){
			a=i/10;b=i%10;
			if((2*(a+b)+j)==n) ans++;
		}
	}
	cout<<ans<<endl; 	 
}

7、完全平方数个数

1.描述

输入整数n;求在1~n的整数中,使得:2020+7*n为完全平方数。求所有完全平方数的个数。

输入
一个正整数:n(1<n<=1000000)

输出
输出满足条件的完全平方数的个数

输入样例 1

100
输出样例 1

2

2.分析

这里主要是判断完全平方数,这里用到的一个技巧就是用int()对sqrt()函数返回的值取整,然后再对取整的值进行平方运算看是否等于原来的数值,当然,python里面**表示多少次方,后面乘以0.5就是开方,2就是平方。

3.代码

python 法一:

import math

n = int(input())
ans = 0
for i in range(1, n + 1):
    x = 2020 + 7 * i
    j = int(math.sqrt(x))
    if j * j == x:
        ans += 1
print(ans)

python 法二:

n = int(input())
ans = 0
for i in range(1, n + 1):
    x = 2020 + 7 * i
    if int(x ** 0.5) == x ** 0.5:
        ans += 1
print(ans)

奈何python是解释性语言,速度太慢了,最后还是用c++过的,不过 这里主要是要明白思想
c++:

#include <cstdio>
#include <iostream>
#include<cmath> 
using namespace std;
 
int main(){ 
	int x,y,ans=0;	
	 cin>>y;
    for(int n=1;n<=y;n++){
    	x=2020+7*n; 
    	int j=(int)sqrt(7*n+2020);
    	if(j*j==x)ans++;
		}
	cout<<ans<<endl;	 
    return 0;
}

8、求六位数

1.描述

编程计算:六位数20□□08能被99整除,□□是多少?

输入

输出
输出一个两位数

输入样例 1


输出样例 1

11(样例)
提示

2.分析

这里和上面的题大同小异,两种思路,一是把中间两位看成1-100之间的数末尾和首都确定了,直接*100相加判断,二是字符串的拼接,
这里我给出字符串拼接的方式

3.代码

法一:

for i in range(1, 100):
    s = 200008 + i * 100
    if s % 99 == 0:
        print(i)
        break

法二:

for i in range(9):
    for j in range(9):
        if int('20'+str(i)+str(j)+'08')%99==0:
            print("{}{}".format(i,j))

结果

71

9、-统计能被3、5整除不能被7整除的数字

1.描述

编程实现:在100内,能被3或5整除但不能被7整除的正整数的个数?

输入

输出
一个正整数表示统计结果

输入样例 1


输出样例 1

1(样例)

2.分析

这个直接判断就好,先找出能被3和5整除的放到列表里面,再删掉不能被7整除的

3.代码

x = []
for i in range(1, 100):
    if i % 3 == 0 or i % 5 == 0:
        x.append(i)
for j in x:
    if j % 7 == 0:
        x.remove(j)
print(len(x))

# 结果
40

10、数字串第30项

1.描述

下面是一串有规律的数

9,22,39,60,85,114,…

这串数中的第30个数是多少?

输入

输出
一个正整数

输入样例 1


输出样例 1

1(样例)

2.分析

这个不难看出就是一个等差数列

3.代码

s = 9
for i in range(29):
    t = 13 + 4 * i
    s += t
print(s)

# 结果
2010

11、k的最大值

1.描述

设a1、a2、…ak是k个互不相等的大于0的自然数,而且它们的和为2006,那么k的最大值是多少?

输入

输出
输出一个正整数

输入样例 1


输出样例 1

1(样例)
提示

2.分析

这里直接从第一项开始累加和,如果>=2006就把下标输出

3.代码

j, ans = 0, 0
for i in range(1, 2006):
    ans += i
    j = i
    if ans >= 2006:
        break
print(j - 1)
# 结果
62

12、找零钱

1.描述

书店里有一套漫画书共9册,第一册需24元,第二册需23元,第三册需22元,

以此类推,每册的售价都比它前面的一册要少一元,

如果哆啦A梦用200元去买这套漫画书,书店老板应该找他多少钱?

输入

输出
一个正整数

输入样例 1


输出样例 1

11(样例)

2.分析

一道中学数学题

3.代码

s = 0
for i in range(9):
    s += 24-i
print(200-s)
# 结果
20

13、求满足条件五位数的最大最小值

1.描述

在一个互不相同数字的五位数中,统计能被3、7、11同时整除的整数个数,并输出最小值和最大值?

输入

输出
两个数,所求得的最小值和最大值,用空格分开

输入样例 1


输出样例 1

12345 23456(样例)

2.分析

根据题目要求挨个判断就可

3.代码

s = []
for i in range(10000, 100000):
    a, b, c, d, e = map(int, str(i))
    if a != b and b != c and c != d and d != e and a != c and a != d and a != e and b != d and b != e and c != e:
        if i % 3 == 0 and i % 7 == 0 and i % 11 == 0:
            s.append(i)
print('{} {}'.format(min(s), max(s)))
# 结果
10395 98637

14、末尾的数字

1.描述

在12 3 100 的积中,从右边数有多少个0,和第 25 个数字是多少?

输入

输出
输出两个正整数:末尾是0的个数和从右到左第25个数字,用空格隔开

输入样例 1


输出样例 1

21 9(样例)

2.分析

这个题python可以直接求阶乘不用怕超范围,然后把数字放到数组里面

3.代码

import math

a = []
for i in str(math.factorial(100)):
    a.append(int(i))

a = a[::-1]
n = a[24]
c = 0
for j in a:
    if j == 0:
        c += 1
    else:
        break
print(c, end=' ')
print(n)
# 结果
24 4

15、三角平方数

1.描述

称能够表示成1+2+3+…+k的形式的自然数为三角数。

有一个四位数N它既是三角数,又是完全平方数,则N的最小值是多少?

输入

输出
一个问题答案的正整数

输入样例 1


输出样例 1

123(样例)

2.分析

题目是四位数,所以我们大概可以确定发范围,k<=200,在进行累加判断是否是完全平方数

3.代码

s = 0
for i in range(1, 200):
    s += i
    if s < 1000:
        continue
    k = int(s ** 0.5)
    if s == k * k:
        break
print(s)
# 结果
1225

16、最小六位数

1.描述

在947后面添上三个不同的数字,

组成一个被2、3、5同时整除的最小的六位数,这个数是多少?

输入

输出
满足条件的最小的六位数

输入样例 1


输出样例 1

123456(样例)

2.分析

和上面的题的思路一样,字符串拼接

3.代码

for i in range(123, 1000):
    a, b, c = map(int, str(i))
    if a != b and a != c and b != c:
        s = int('947' + str(i))
        if s % 2 == 0 and s % 5 == 0 and s % 3 == 0:
            print(s)
            break
# 结果
947130

17、刘叔叔养的兔子

1.描述

刘叔叔养了400多只兔子,每3只兔子关在笼子里,那么最后一个笼子里有2只;如果每5只兔子关在一个笼子里,最后一个笼子有4只,如果7只兔子关在笼子里,最后一个笼子里有5只,问刘叔叔一共养了多少只兔子?

输入

输出
一个正整数:满足条件的最小值

输入样例 1


输出样例 1

400(样例)

2.分析

简单的判断

3.代码

for i in range(400, 500):
    if i % 3 == 2 and i % 5 == 4 and i % 7 == 5:
        print(i)
        break
# 结果
404

18、数数小木块

1.描述

在墙角堆放着一堆完全相同的正方体小木块,如下图所示:

在这里插入图片描述

因为木块堆得实在是太有规律了,你只要知道它的层数就可以计算所有木块的数量了。

输入
只有一个整数 n ,表示这堆小木块的层数,已知1 <= n <= 1000 。

输出
只有一个整数,表示这堆小木块的总数量。

输入样例 1

5
输出样例 1

35
提示

2.分析

话不多说,简单的中学数学题

3.代码

n = int(input())
a=[]
x=1
for i in range(n):
    x=x+i
    a.append(x+i)
print(sum(a))

19、求a、b、c的值

1.描述

已知一个8位数 123ab45c能被792整除,求a,b,c的值?

输入
输入格式:无

输出
输出格式:

三个数字用空格隔开

输入样例 1


输出样例 1

1 1 1(样例)

2.分析

这样类型的题都可以直接字符串拼接解决

3.代码

for i in range(10):
    for j in range(10):
        for k in range(10):
            s = int('123' + str(i) + str(j) + '45' + str(k))
            if s % 792 == 0:
                print('{} {} {}'.format(i, j, k))
# 结果
6 9 6

20、完全平方数个数2

1.描述

输入一个正整数n,求1~n中某个数m,m本身是完全平方数,其各个数值之和也是

完全平方数,输出满足这两个条件的正整数的个数。

输入
输入格式:一个正整数n

输出
输出格式: 输出满足条件的完全平方个数

输入样例 1

1
输出样例 1

1

2.分析

直接判断就好

3.代码

n = int(input())
ans = 0
for i in range(1, n + 1):
    if int(i ** 0.5) == i ** 0.5:
        x = [int(i) for i in str(i)]
        s = sum(x)
        if int(s ** 0.5) == s ** 0.5:
            ans += 1
print(ans)

21、求不循环小数的个数

1.描述

输入两个正整数 n和m,求n/1,n/2,n/3,…,n/m中有多少个不是循环小数?

输入
输入格式:两个正整数n和m,用空格隔开

输出
输出格式 输出满足条件的个数

输入样例 1

2 2
输出样例 1

2

2.分析

这个题注意一个技巧,分子乘以10000000000对分母取余进行判断

3.代码

n, m = map(int, input().split())
ans = 0
for i in range(1, m + 1):
    if n * 10000000000 % i == 0:
        ans += 1
print(ans)

22、与7无关的数

1.描述

一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,

则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和。

输入
输入为一行,正整数n

输出
输出

输出一行,包含一个整数,即小于等于n的所有与7无关的正整数的平方和。

输入样例 1

21
输出样例 1

2336

2.分析

这个题和第五题差不多,注意输出结果

3.代码

方法一:

n = int(input())
res = 0


def check(k):  # 判断数字7
    f = True
    while k:
        t = k % 10
        if t == 7:
            f = False
            break
        k //= 10
    return f


for i in range(1, n + 1):
    if i % 7 == 0 or not check(i):
        continue
    else:
        res += i ** 2
print(res)

方法二:

n = int(input())
res = 0
for i in range(1, n + 1):
    if i % 7 == 0 or 7 in [int(j) for j in str(i)]: # 这里利用list放每位数
        continue
    else:
        res += i ** 2
print(res)

23、数字统计

1.描述

请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。

比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,

在数20中出现1次,在数21中出现1次,在数22中出现2次,

所以数字2在该范围内一共出现了6次。

输入
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。

输出
输出共 1 行,表示数字 2 出现的次数。

输入样例 1

2 22
输出样例 1

6
输入样例 2

2 100
输出样例 2

20
提示

数据规模:

1<L<R<100000

2.分析

直接用python里面的count()函数

3.代码

n,m=map(int,input().split())
c=0
for i in range(n,m+1):
    c+=str(i).count('2')
print(c)

24、我家的门牌号

1.描述

我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,

求我家的门牌号及总共有多少家。数据保证有唯一解。

样例输入

输入
输入

一个正整数n。

输出
输出

一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。

输入样例 1

100

输出样例 1

10 15
提示

数据规模:

1<n < 100000

2.分析

这里注意逻辑,直接按照题目要求做就是了

3.代码

n = int(input())
for i in range(1, 100000):
    f = True # 循环终止的判断
    temp = (1 + i) * i // 2  # 看作等差数列求和
    for j in range(1, n + 1):
        if temp - j * 2 == n:  # 判断是否符合要求
            print(f'{j} {i}')
            f = False
            break
    if f == False:
        break

25、寻找完全数

1.描述

一个数如果恰好等于它的真因子之和,这个数就称为“完全数”。

例如6=1+2+3。编程找出N以内的所有完全数。1没有真因子,

因此1不是完全数。编程实现求取2~n之间的完全数的个数

输入
一个整数N。

输出
一个正整数,即所求的完全数个数

输入样例 1

10
输出样例 1

1

2.分析

基础题直接上代码

3.代码

n = int(input())
res = 0
for i in range(2, n + 1):
    ans = 0 # 统计因子的和
    for j in range(2, i // 2 + 1): # 求因子
        if i % j == 0:
            ans += j
    if ans + 1 == i:
        res += 1
print(res)

26、求数根

1.描述

数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,

那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。

如此进行下去,直到得到是一位数为止。

比如,对于24来说,把2和4相加得到6,由于6是一位数,因此6是24的数根。再比如39,

把3和9加起来得到12,由于12不是一位数,因此还得把1和2加起来,最后得到3,

这是一个一位数,因此3是39的数根。

输入
一个正整数n。

输出
两个正整数,分别表示输入数字的数根和转换为树根的次数,之间用一个空格隔开。

输入样例 1

24
输出样例 1

6 1
提示

数据规模:

1<n<10000000

2.分析

这道题用字符串会更好做一点

3.代码

n = int(input()) # 输入
ans = 0 # 记录转换次数
while True: 
    s = str(n) # 转为字符串
    if len(s) == 1: # 循环终止条件,只有一个数字
        res = int(s) # 转为整型并记录
        break
    x = [int(i) for i in s] # 数字每一位分解放到列表里面
    n = sum(x) # 求和
    ans += 1 # 次数加一
print(f'{res} {ans}')

27、A钱买A鸡

1.描述

“A钱买A鸡”的问题:3文钱可以买1只公鸡,2文钱可以买1只母鸡,

1文钱可以买3只小鸡,要用A文钱买A只鸡,请输出总的方案数。

输入
一个正整数A。

输出
一个正整数,表示用A文钱买A只鸡的总的方案数。

输入样例 1

100
输出样例 1

6

2.分析

注意直接三个循环可能会超时

3.代码

a = int(input())
res = 0 # 记录方案数
for i in range(a // 3 + 1):
    for j in range(a // 2 + 1):
        k = a - j - i # 减少循环次数
        if k % 3 != 0:
            continue
        if i * 3 + j * 2 + k // 3 == a :
            res += 1
print(res)

总结

以上就是一些基本的循环结构的题,主要还是熟悉一些基本的语法,题目相对都是入门题。欢迎大家留言交流。下一篇 算法训练-循环模拟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值