关于java整数划分并求出划分的个数的问题,有代码,能输出整数的划分,但输出的划分个数不对。

关于java整数划分并求出划分的个数的问题,有代码,能输出整数的划分,但输出的划分个数不对。,第1张

import javautilScanner;

public class numberDiv {

  // private static final huafen numberrDiv = null;

  // static int d[]=new int[32];

  public static void main(String[] args) {

    Systemoutprintln("请输入的整数:");

    Scanner sc = new Scanner(Systemin);

    int number = scnextInt();

    int num = numberDivDivision(number, number, "");

    Systemoutprintln("num=" + num);

  }

  public static int Division(int m, int n, String str) {

    if ((m <= 0) || (n <= 0))

      return 0;

    if ((m == 1) || (n == 1)) {

      Systemoutprint(str);

      for (int i = 1; i < m; i++) {

        Systemoutprint("1+");

      }

      Systemoutprintln("1");

      return 1;

    }

    if (n == m) {

      Systemoutprintln(str + m);

      return 1 + numberDivDivision(m, n - 1, str);

    }

    if (m > n) {

      int n1 = numberDivDivision(m - n, n, str + n + "+");

      int n2 = numberDivDivision(m, n - 1, str);

      return n1 + n2;

    }

    return numberDivDivision(m, m, str);

  }

}

Division方法返回分解的个数,所以numberDiv类不需要再定义成员变量static int num=0;。

Division方法中if ((m == 1) || (n == 1))成立时,本次是一个分解,并且不需要再递归分解,所以返回1。

Division方法中if (n == m)成立时,本次是一个分解,且需要递归分解,所以返回1+递归分解个数。

Division方法中if (m > n)成立时,返回两个递归分解的个数之和。

Division方法中最后代码即为m < n,直接返回递归分解的个数。

如图,类比杨辉三角的递推思想,写出O(n²)时间复杂度,空间也是O(n²),用矩阵把结果都存起来了,所以输入组数T不影响复杂度。

我就没按AC的输入格式写了,我按leetCode的格式写,能做算法题的,不至于连这个输入部分都不会写吧。

源代码见网页端:(C++环境)有解法思想哦!如果有哪个运行结果不对请提出,有哪点不明白的请追问(仅限我的算法思想)。

/算法思想:

①简化数值:

∵n=2k 而且分成若干个偶数之和

∴可以将所有数÷2,简化计算

②划分思维:

记 Rmax(n,m)为 正整数n分为若干个≤m的正整数之和有多少种分法

则:R1(2n)=Rmax(n,n)

靠拆分的最大整数不同来保证不重复!

而Rmax的计算可以通过递归取得,再用矩阵将计算结果存起来,避免重复运算

③递归算法:

边界条件:Rmax(0,0)=1; Rmax(n>0,0)=0; Rmax(n,1)=1;

递推式:

当n≥i时:Rmax(n,i)=Rmax(n,i-1)+Rmax(n-i,i)

解释:如R(13,5) 分成若干个不超过5的数之和的分法,

首先要算上分成不超过4的分法,即R(13,4)

然后算必须有5的分法:那就只剩下13-5=8,分这个8,即R(8,5)

∴R(13,5)=R(13,4)+R(8,5)

当n<i时,Rmax(n,i)=Rmax(n,n)

/

#include<vector>

#include<iostream>

#include<stdioh>

using namespace std;

typedef long long INT64;

//偶数的划分

class solution{

public:

solution();

INT64 R1(int n);

INT64 Rmax(int n,int i);

private:

vector<vector<INT64>> RM; //Rmax表(上三角矩阵)

};

int main() {

solution S;

printf("%I64d\n", SR1(800));

system("pause");

}

INT64 solution::Rmax(int n, int i) {

if (i > n)i = n;

if (RM[n][i]>=0){

// cout << "RM[" << n << "][" << i << "]=" << RM[n][i]<<endl;

return RM[n][i]; //表里有

}

else { //递推(同时造表)

// cout<< "RM[" << n << "][" << i << "]= " << "Rmax(n, i-1)+ Rmax(n-i, i)" << endl;

return RM[n][i] = Rmax(n, i - 1) + Rmax(n - i, i);

}

}

solution::solution(){

RMresize(801);//2≤n≤800 由用户保证

RM[0]push_back(1); //Rmax(0,0)=1; 

for (int n = 1; n < RMsize(); n++) {

RM[n]resize(n + 1,-1); //用初始值-1 表示此结果还未被计算

RM[n][0] = 0; //边界条件:Rmax(n>0,0)=0;

RM[n][1] = 1; //边界条件:Rmax(n,1)=1;

}

}

INT64 solution::R1(int n) {//2≤n≤800 且n为偶数 由用户保证

return Rmax(n / 2, n / 2);

}

#include<stdioh>

int main(){

    int value;

    int count = 0;

    int buff[256];

    printf("输入整数序列,以空格分割,按回车结束如(1 2 9 6 4 3)\n请输入:");

    char ch;

    do{

        scanf("%d", &(buff[count++]));

        ch = getchar();

    } while (ch != '\n');

    printf("\n分为两部分后为:");

    printf("\n左边:");

    for (int i = 0; i < count; i++){

        if (buff[i] % 2 != 0)

            printf("%d ", buff[i]);

    }

    printf("\n右边:");

    for (int i = 0; i < count; i++){

        if (buff[i] % 2 == 0)

            printf("%d ", buff[i]);

    }

    getchar();

    return 0;

}

这道题时间复杂度太高,大概是O(2^61)-长整型范围(当原数本身就是素数时)

就算最高级的筛素数方法也就能做到O(n),在这里也完全做不了啊。。

我只能给你大概是O(n log n)的算法,如果需要请追问

求一个正整数n的位数可以先定义一个变量num,并初始化为0,依次把该整数n除以10,直到其为0为止,并且每除一次10,变量num的个数就自加1,最后num的值就是该整数n的位数。

#include <stdioh>

int main()

{

int n,num=0;

scanf("%d",&n);

while(n){

num++;

n/=10;

}

printf("%d\n",num);

return 0;

}

/

输出:

123456

6

/

扩展资料:

正整数,即大于0的整数,如,1,2,3…

0既不是正整数,也不是负整数(0是整数)。

负整数,即小于0的整数,如,-1,-2,-3…

知道正整数的一种分类办法是按照其约数或积因子的多少来划分的,比如仅仅有两个的(当然我们总是多余地强调这两个是1和其本身),就称之为质数或素数,而多于两个的就称之为合数。

参考资料来源:百度百科-正整数

最大范围的数是复数,复数分为实数(0,15,-3等)和虚数(i,1+2i等),实数分为有理数和无理数,虚数分为纯虚数和非纯虚数,有理数又分为正数和负数,整数和分数,整数又分为自然数和负整数,奇数和偶数

以上就是关于关于java整数划分并求出划分的个数的问题,有代码,能输出整数的划分,但输出的划分个数不对。全部的内容,包括:关于java整数划分并求出划分的个数的问题,有代码,能输出整数的划分,但输出的划分个数不对。、编程题,如图:偶数的划分(c或c++)、设计一个c语言程序,录入一个整数序列,将其划分为左右两部分,使左边元素值为奇等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10639304.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存