奇数倍数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
请你找到最小的整数 X 同时满足:
X 是 20192019 的整倍数;
X 的每一位数字都是奇数。
求解
C++比较快。
#include <iostream>
using namespace std;
int main()
{
long long X=2019;
int i;
for(i=3;;i+=2)
{
bool flag=true;
long long ans=X*i;
long long a=ans;
while(a>0)
{
if(a%10%2==0)
{
flag=false;
break;
}
a=a/10;
}
if(flag)
{
cout<<ans;
break;
}
}
return 0;
}求值
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 St 。
例如 S1=1,S2=2,S3=4,S4=6,⋅⋅⋅ 。
现在小明想知道,当t=100 时,St 是多少?即S100 是多少?
求解
C++比较快。
#include <iostream>
using namespace std;
int main()
{
long long i,j;
for(i=30000;;i++)
{
int yueshu=0;
for(j=1;j<=i;j++)
{
if(i%j==0)
yueshu++;
}
if(yueshu>100)
{
cout<<-1;
break;
}
if(yueshu==100)
{
cout<<i;
break;
}
}
return 0;
}求和
问题描述
给定 n 个整数a1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数a1,a2,⋯,an。
输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
求解
通过观察可得,S可表示为从a2到an与各自前缀和的乘积的和,由此可写以下python代码:
n=int(input())
a=[0]+list(map(int,input().split()))
s=[0]*(n+1)
for i in range(1,n+1):
s[i]=a[i]+s[i-1]
S=0
for i in range(1,n+1):
S+=a[i]*s[i-1]
print(S)数位排序
问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式
输入第一行包含一个正整数 n 。
第二行包含一个正整数 m 。
输出格式
输出一行包含一个整数, 表示答案。
样例输入
13
5样例输出
3样例说明
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。
评测用例规模与约定
对于30% 的评测用例, 1≤m≤n≤300 。
对于 50% 的评测用例, 1≤m≤n≤1000 。
对于所有评测用例, 1≤m≤n≤10^6 。
求解
本人初始解法(通过率90%)
使用一个嵌套列表的列表,其中每个列表元素表示数字与其位数和,用cmp函数来决定sort函数排序的规则。对于第5行,return 1表示调换,-1表示不调换。
不过对于求位数和的操作,我是用整除-取余进行操作的,操作多,所以有2个案例超时了。
import functools
def cmp(n1,n2):
if n1[1]!=n2[1]:
return 1 if(n1[1]>n2[1]) else -1
elif n1[0]!=n2[0]:
return 1 if(n1[0]>n2[0]) else -1
n=int(input())
m=int(input())
l=[[0,0] for i in range(n+1)];
for i in range(1,n+1):
l[i][0]=i
temp=i;
weishuhe=0
while(True):
weishuhe+=temp%10
if(temp//10==0):
break;
else:
temp=temp//10
l[i][1]=weishuhe
l.sort(key=functools.cmp_to_key(cmp))
print(l[m][0])
求和-lanqiao0363831855的代码(通过率100%)
这位大佬使用整型和字符转换的方式求数位和。而且因为对原来的数组来说,已经是按数字从小到大顺序的方式排序元素了,所以不需多加“当数位之和相等时, 将数值小的排在前面”的操作。
n=int(input())
m=int(input())
s=list(range(1,n+1))
s.sort(key=lambda x:sum(int(i) for i in str(x)))
print(s[m-1])
浙公网安备 33010602011771号