-
2021-12-07 20:58:53
编程序实现:输入一个不超过9位的非负整数,将其每一位数分离出来,并按照先高位后低位的顺序输出,要求各位数字之间以空格分隔。
输入格式:
一个不超过9位的非负整数。
输出格式:
每一位数之后跟一个空格,最后换行。
输入样例:
135790268
输出样例:
在这里给出相应的输出。例如:
1 3 5 7 9 0 2 6 8#include<stdio.h> int main( ) { int n,sum[10],count=0,i; scanf("%d",&n); while(n>0) { sum[count]=n%10; n=n/10; count++; } for(i=count-1;i>=0;i--) { if(i!=0) { printf("%d ",sum[i]); } else printf("%d\n",sum[i]); } return 0; }
更多相关内容 -
7.整数拆分
2018-09-13 00:13:07给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例2: 输入: 10 输出: 36 解释: 10 = 3 +...给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
这和《零钱兑换》那道题是同种类型,都是通过动态规划进行整数拆分,不过那道题是为找零,这道是为了求乘积。
本来,同种类型的题是不应该再记录的,但我想起当初被《零钱兑换》支配的恐惧,所以还是把这道题记录下来
思路:
dp[n]是整数n拆分后整数的最大乘积(或者叫拆n),记dp[0]=1,dp[1]=1,dp[2]=1(不解释);
(1)下面罗列的拆分方法不列举n个1相乘的情况
①拆3:一种,1和2,所以dp[3]=2;
②拆4:三种,即1*3,2*2和1*2*1。
但是由于2又可以拆分成1和1,所以其实1*2*1与2*2可以合并成同一种类型,
所以拆4可以表示为两大类型:拆1和拆3(dp[1]*dp[3]),拆2和拆2(dp[2]*dp[2]),选出最大即可
③拆5:1*4,2*3,1*2*2,1*1*1*2,1*1*3
同理,因为4可以拆成2和2,1和3;3可以拆成1和2,2可以拆成1和1,
所以拆5可以也可以表示为两大类型:dp[1]*dp[4],dp[2]*dp[3],选出最大即可
④拆6:1*5,2*4,3*3,1*4*1,1*3*1*1,1*2*2*1,1*1*1*2
不必说:5可以拆成3和2,1和4;4可以拆成2和2,3可以拆成1和2,2可以拆成1和1
所以拆6可以表示为3大类型:dp[1]*dp[5],dp[2]*dp[4],dp[3]*dp[3],再选最大。。。
(2)说了这么多,想必都可以看出来了,
数字n拆分成整数的最大乘积是从
dp[1]*(n-1),dp[2]*(n-2),dp[3]*[n-3] 。。。 dp[n-1]*(1) 这些数字里面选出来的,所以代码如下:
class Solution { public int integerBreak(int n) { if(n==2){ return 1; } if(n==3){ return 2; } int dp[]=new int[n+2]; dp[0]=1;dp[1]=1;dp[2]=1; for(int i=2;i<=n+1;++i){ for(int j=1;j<=i;++j){ int d=dp[j]*(i-j); if(d>dp[i]){ dp[i]=d; } } } return dp[n+1]; } }
-
整数拆分
2018-12-04 13:27:20给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + ...给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。思路:
1.使用递归的思想,将n拆分成i和n-i 可以得到一个积 然后对n-i进行递归
//利用递归的思想 //从1开始遍历,在res,i*(n-i)-->就是说一个数n只拆分一次即i和n-i来比较一下,还有就是对n-i再继续拆分 public int integerBreak(int n) { if(n==1) return 1; int res=Integer.MIN_VALUE; for (int i = 1; i < n; i++) { res=Math.max(res, Math.max(i*(n-i), i*integerBreak(n-i))); } return res; }
2.还是递归的思想 不过对代码进行记忆化搜索,加入到map中
//记忆化搜索 //利用递归的思想 HashMap<Integer, Integer> map=new HashMap<>(); public int integerBreak1(int n) { if(n==1) return 1; if(map.containsKey(n)){ //看map是否包含 之前是否计算过 return map.get(n); } int res=Integer.MIN_VALUE; for (int i = 1; i < n; i++) { res=Math.max(res, Math.max(i*(n-i), i*integerBreak1(n-i))); } 将每次递归结束后的值存储一下 map.put(n, res); return res; }
3.暴力递归改动态规划
//动态规划 public static int integerBreak3(int n) { int[] dp = new int[n+1]; dp[1] = 1; for(int i=2;i<=n;i++){ for(int j=1;j<i;j++){ System.out.println(dp[i]); dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j])); } } return dp[n]; }
-
C++ 整数拆分方法详解
2021-05-19 06:08:17一、问题背景整数拆分,指把一个整数分解成若干个整数的和如 3=2+1=1+1+1 共2种拆分我们认为2+1与1+2为同一种拆分二、定义在整数n的拆分中,最大的拆分数为m,我们记它的方案数为 f(n,m)即 n=x1+x2+······+xk-...一、问题背景
整数拆分,指把一个整数分解成若干个整数的和
如 3=2+1=1+1+1 共2种拆分
我们认为2+1与1+2为同一种拆分
二、定义
在整数n的拆分中,最大的拆分数为m,我们记它的方案数为 f(n,m)
即 n=x1+x2+······+xk-1+xk ,任意 x≤m
在此我们采用递归递推法
三、递推关系
1、n=1或m=1时
拆分方案仅为 n=1 或 n=1+1+1+······
f(n,m)=1
2、n=m时
S1选取m时,f(n,m)=1,即n=m
S2不选取m时,f(n,m)=f(n,m-1)=f(n,n-1),此时讨论最大拆分数为m-1时的情况
可归纳 f(n,m)=f(n,n-1)+1
3、n
因为不能选取m,所以可将m看作n,进行n=m时的方案,f(n,m)=f(n,n)
4、n>m时
S1选取m时,f(n,m)=f(n-m,m),被拆分数因选取了m则变为n-m,且n-m中可能还能选取最大为m的数
S2不选取m时,f(n,m)=f(n,m-1),此时讨论最大拆分数为m-1时的情况
可归纳 f(n,m)=f(n,m-1)+f(n-m,m)
总递推式为
代码如下
#include
#include
#include
#include
#include
#include
using namespace std;
int f(int n,int m)
{
if ((n!=1)&&(m!=1))
{
if (n>m) return f(n-m,m)+f(n,m-1);
else return 1+f(n,n-1);
}
else return 1;
}
void work()
{
int n,m;
cin>>n>>m;
cout<
}
int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
work();
return 0;
}
以上所述是小编给大家介绍的C++ 整数拆分方法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
-
C语言实验——分割整数
2021-05-19 20:24:34题目描述从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。输入正整数n,不含前导零。输出分割的整数序列,各整数之间用空格格开。注意,最后一个数字后面没有空格!示例输入654321示例输出654321//... -
PTA---整数拆分
2020-11-14 21:54:40将一个正整数拆分成若干个正整数的和。 输入格式: 一个正整数n 输出格式: 若干行,每行一个等式(每个数或者等号间都有一个空格,第一个数前没有空格,最后一个数后面没有空格,数与数之间要求非降序排列)。最后一... -
【九度OJ】题目1084:整数拆分
2012-08-17 16:35:00一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式。 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2... -
提示用户输入任意位数的正整数然后反向输出
2021-11-13 23:55:23提示用户输入任意位数的正整数然后反向输出 -
一个整数拆开相加后最后结果为个位数的算法
2018-03-20 23:29:00一个整数拆开相加后最后结果为个位数的算法 -(void)number:(int)number{ int x ; for(x = 0; number ; number = number / 10){ x = x + number % 10; } if (x > 9) { number = x; ... -
逆序拆分输出(任意整数)
2022-03-08 23:12:05题目描述 输入一个不确定位数的正整数,将它完全拆分,并逆序输出。 输入 一行,包含一个正整数。 输出 一行,包含若干个正整数,依次从最低位到最高位,数字与数字之间用一个空格隔开。 样例输入 Copy 1230 样例... -
五位数拆分出各位
2021-03-16 14:42:355、输入一个五位数,输出一个反转的五位数输入-》12345输出-》54321//这是五位数字拆分方法。System.out.println("请输入五位数的数字:"); // 比如:12345int g1=num%10;int g2=num/10%10;int g3=num/100%10;int g4... -
C语言实例--拆分一个整数
2016-05-09 23:18:01C语言实例--拆分一个整数 -
小白学JAVA之三——利用循环结构逆序输出任意正整数
2021-03-16 11:02:49小白学JAVA之四——利用循环结构逆序输出任意正整数 一. 原理分析 以输入的正整数1234为例: 因此,可以利用循环结构,每一次执行相同的取余和取整循环体,直至取整的结果为零。 代码如下: public static void ... -
C语言-对一个整数的各位进行分割
2021-08-30 16:42:22在实际应用中,我们常常需要将整数的各位分割后进行使用。 对整数的分割我们可以用一个while循环进行处理,并将分割后的整数置于一个数组中存储。... //记录整数位数 a=a/10; } i--; //结束while循环后i肯定 -
利用js实现将任意一个整数分解成几个整数的和
2020-03-27 16:42:47利用JavaScript实现将一个整数分解成几个数的和,例如4可以分解为(1+1+1+1)(1+1+2)(1+3)(2+2); var num = 4; var arr = []; function summation ( n, m, s ) { if ( n > 0 ) { for ( var i = m; i &... -
C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出。
2021-02-07 12:41:02C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出。 #include <stdio.h> int main(void) { int a,b,c,d; printf("请输入一个三位数的整数:\n"); scanf("%d",&... -
OpenJudge NOI 1.13 44:正整数的任意进制转换
2022-06-20 21:59:10OpenJudge NOI 1.13 44:正整数的任意进制转换 注意:题目说是正整数的进制转换,而实际上输入的数字可能有0。先处理字符串,将输入的字符串拆分成p,p进制字符串n,及q。先考虑如果涉及的都是低精度数字,应该如何将... -
用一种无法处理的语言处理大量数字?
2021-04-24 01:51:01我正在尝试思考如果语言构造无法处理大于某个特定值的数字时,我将如何对极大的数字进行计算(无穷大-整数不浮点数)。我确定我不是第一个也不是最后一个问这个问题的人,但是我使用的搜索字词并未给我提供处理这些... -
统计用户输入任意一个正整数中每个数字出现的次数并打印
2021-11-14 17:19:15任意一个正整数对10取余,都可以把个位求出来,而拆出来的个位数,对应数组的下标 //1.提示用户输入一个正整数并使用变量记录 System.out.println("请输入一个正整数"); Scanner scanner = new Scanner(System.... -
通过键盘输入任意四位正整数,计算并验证(输出)该正整数各位数字之和
2020-09-08 00:22:37//通过键盘输入任意四位正整数,计算并验证(输出)该正整数各位数字之和。 public static void main(String[] args) { System.out.println("请输入一个四位数"); String num = sc.next(); int sum =0 ... -
Math.random() 获取随机数,获取任意范围内随机整数
2022-06-25 20:12:210-100好理解一点,那我们怎么取 [2,32) 之间随机整数呢,思路相同: 当random取到0时,我们希望最后结果是2,所以需要有个加2的操作,那么32的情况只能拆分成30 + 2,所以应该是先乘法得到30,再有个加2的操作,像... -
java案例之任意整数的逆序结果(基础)
2019-08-01 11:43:27import java.util.Scanner; public class ForReverse{ public static void main(String[] args){ System.out.println("请输入一个正整数:"); Scanner sc = new Scanner(System.in); int num =sc... -
c++实验1 7-4 求整数的位数及各位数字之和
2019-03-12 23:24:257-4 求整数的位数及各位数字之和 (15 分) 对于给定的正整数N,求它的位数及其各位数字之和。 输入格式: 输入在一行中给出一个不超过10 9 的正整数N。 输出格式: 在一行中输出N的位数及其各位数字之和,... -
用Python6种方法:给定一个不超过5位的正整数,判断有几位
2021-01-12 10:40:56假设是在5位的情况下,不考虑其他状况 In [1]: 6666 // 10000 Out[1]: 0 除以10000为零证明是小于5位数 In [2]: 6666 // 1000 Out[2]: 6 但是如果能被1000整除,它就是一个4位数 In [3]: 6666 // 100 Out[3]: 66 In ... -
代码练习:整数分解(输入一个整数,输出该整数各位数字)
2021-09-26 17:25:13题目分析:要想拆分一个整数,首先要确认它的位数,之后再根据规律逐个拆分各位。 确认整数位数,就要使用Java中的length()函数,该函数可以计算出一个字符串类型的位数(注:空格也会算作一位),如: String a... -
java程序设计代码:显示一个三位整数的各位数字 输入一个整数,分别显示其百位、十位和个位数字。
2021-04-17 07:46:37java程序设计代码:显示一个三位整数的各位数字 输入一个整数,分别显示其百位、十位和个位数字。关注:124答案:3mip版解决时间 2021-02-07 12:45提问者〖舉燈向ηáη〗2021-02-06 21:51图形用户界面如图所示。要求... -
定义一个函数,在该函数中可以实现任意两个整数的加法。java实现
2015-12-30 14:50:48这道题实际上是一道面试题的拓展,原题是要求打印1到最大的n位数。原题是这样描述的:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,4,5一直到最大的三位数999。拿到这道题之后,对于没有... -
C语言程序设计:编写程序,输入一个正整数,统计该整数的位数并计算其各个数位上的数字之和。...
2021-04-27 11:10:39点击查看C语言程序设计:编写程序,输入一个正整数,统计该整数的位数并... /*定义整形函数,用n代替输入的数,sum为和,m代表位数*/ printf("请输入一个整数:\n"); /*输入一个整数*/ scanf("%d",&n); /*输入一...