奇数倍数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

请你找到最小的整数 X 同时满足:

  1. X 是 20192019 的整倍数;

  1. 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=a1a2+a1a3+⋯+a1an+a2a3+⋯+an−2an−1+an−2an+an−1an

输入格式

输入的第一行包含一个整数 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≤mn≤300 。

对于 50% 的评测用例, 1≤mn≤1000 。

对于所有评测用例, 1≤mn≤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])
posted on 2023-03-05 13:54  快乐的乙炔  阅读(1)  评论(0)    收藏  举报  来源