LevOJ P1468 高逐位整除数

2024-03-21 11:50
文章标签 整除 p1468 levoj 高逐位

本文主要是介绍LevOJ P1468 高逐位整除数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

我为什么要写这么一篇呢,因为我原本不想写的,找了半天都找不到源代码,花了我半小时(sad.jpg)和我一样懒的同志直接往下翻代码好了/doge

(学校的OJ,题目甚至有错别字,叹气.jpg)

分析题目,因为是高逐位整数,我们可以很方便的使用数组进行存储数字,需要进行运算的时候多用一步转换取出来就好

聪明的读者们肯定能一眼看出,这是典型的回溯问题,我也就不多加阐释了。但是我们需要注意,这里面有一点小小的容易出错的地方,我们注意到题目中最大位数是24位,然而我们c中long long int 变量能存储大概20位的长度,很容易溢出,这个时候我们就要寻求数学的帮助了。

我们给出324这么个数字

容易知道324%11 = 5;

由于知道这题会出现溢出,我们对这个数字进行一定的拆解:

3%11 = 3;

3*10+2 = 32 % 11 =10;

10*10+4 = 104 %11 = 5 我们惊奇的发现这样步步取模是可以避免溢出的,因此,我们只需要用int甚至不用long long int就能存下我们的数字(运算步骤中最大貌似是25*10+24吧,没仔细看)

当然,题主不会用数学的方法证明,只能找找规律用一用,如果有大佬会证,欢迎把链接放在下面

比心)

然后小细节我们放在代码的注释中,下面上代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>#define ll long long int	
int a4[26] = { 0 };
void fun02(int length,int n)//这个length是递归的深度,最初传入深度0
{//显然n>=1if (n == 0)return;//没有上头这步运行程序,尝试数字26发现没有操作,说明最大符合要求的数字是25位// 因此添加以下边界条件if (n >= 26)return;//满足搜索边界条件,进行逐位输出操作if (length == n){if (a4[0] == 0)return;//第一位不能是0for (int i = 0; i < n; i++)printf("%d", a4[i]);printf("\n");}//不满足条件一位一位填充数字else {for (int i = 0; i <= 9; i++){a4[length] = i;ll temp = 0;//看到题主一开始没注意这么个问题,用了long long intlength += 1;for (int j = 0; j < length; j++)//算出前N位的数{temp = temp * 10 + a4[j];temp %= length;//取模防止溢出}if (temp == 0)//满足条件,进入下一层递归{fun02(length, n);length -= 1;//出来回溯,重新覆写上一个位置}else length -= 1;//不满足,重新覆写上一个位置}}}int main()
{int n;while (scanf("%d",&n) != EOF){fun02(0,n);}return 0;
}

后记:

受益的懒懒们点个赞叭(鞠躬 

这篇关于LevOJ P1468 高逐位整除数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832567

相关文章

数论 - 整除问题 --- 整数集合中找出3的最大倍数

Mean:   题目描述:给一个包含非负整数的数组(长度为n),找出由这些数字组成的最大的3的倍数,没有的话则输出impossible。 analyse: 首先想到的就是直接暴力,这是最蠢的方法,数据一大的话,必会TLE。 直接用蛮力的话,生成所有的组合,为 2^n个,对每个数字再进行比较判断,需要 O(n)的时间,因为n可能会比较大,需要每个位的比较。总的时间复杂度为O(n * 2

[a, b]区间内找到一些数满足可以被一个整数c整除

/***************************************************************** 问题描述: 牛牛想在[a, b]区间内找到一些数满足可以被一个整数c整除,现在你需要帮助牛牛统计区间内一共有多少个这样的数满足条件?  输入描述: 首先输入两个整数a,b,(-5*10^8 ≤ a ≤ b ≤ 5*10^8)接着是一个正整数c(1 <=

学习笔记 ---- 数论分块(整除分块)

文章目录 算法概述引理引理 1 1 1引理 2 2 2 数论分块结论(区间右端点公式)过程 N N N 维数论分块向上取整的数论分块 例题 H ( n ) H(n) H(n)[CQOI2007] 余数求和[清华集训2012] 模积和 算法 概述 数论分块可以快速计算一些含有除法向下取整的和式(即形如 ∑ i = 1 n f ( i ) g ( ⌊ n i ⌋ ) \sum

信息安全数学基础(1)整除的概念

前言        在信息安全数学基础中,整除是一个基础且重要的概念。它涉及整数之间的特定关系,对于理解数论、密码学等领域至关重要。以下是对整除概念的详细阐述: 一、定义      设a, b是任意两个整数,其中b ≠ 0。如果存在一个整数q,使得等式a = q × b成立,那么称b整除a,或者a被b整除,记作b | a。此时,b叫作a的因数,a叫作b的倍数。反之,如果不存在这样的整

力扣1590.使数组和能被P整除

力扣1590.使数组和能被P整除 同余 转化为求一段区间和余p为xi - j = x j = i - x class Solution {public:int minSubarray(vector<int>& nums, int p) {int x = accumulate(nums.begin(),nums.end(),0LL) % p;if(x == 0) return 0;int

Golang | Leetcode Golang题解之第368题最大整除子集

题目: 题解: func largestDivisibleSubset(nums []int) (res []int) {sort.Ints(nums)// 第 1 步:动态规划找出最大子集的个数、最大子集中的最大整数n := len(nums)dp := make([]int, n)for i := range dp {dp[i] = 1}maxSize, maxVal := 1, 1f

C语言 | Leetcode C语言题解之第368题最大整除子集

题目: 题解: int cmp(int* a, int* b) {return *a - *b;}int* largestDivisibleSubset(int* nums, int numsSize, int* returnSize) {int len = numsSize;qsort(nums, numsSize, sizeof(int), cmp);// 第 1 步:动态规划找出最

洛谷 P10584 [蓝桥杯 2024 国 A] 数学题(整除分块+杜教筛)

题目 思路来源 登录 - Luogu Spilopelia 题解 参考了两篇洛谷题解,第一篇能得出这个式子,第二篇有比较严格的复杂度分析 结合去年蓝桥杯洛谷P9238,基本就能得出这题的正确做法 代码 #include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<map>#include<uno

HDU——2097.sky数、2098.分拆素数和、2099.整除的尾数

目录 2097.sky数 题目描述 运行代码 代码思路 2098.分拆素数和 题目描述 运行代码 代码思路 2099.整除的尾数 题目描述 运行代码 代码思路 2097.sky数 题目描述 Problem - 2097 Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这

HDU2099 整除的尾数【水题】

整除的尾数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 26163    Accepted Submission(s): 11044 Problem Description 一个整数,