精华内容
下载资源
问答
  • N正整数联接成最小整数

    千次阅读 2011-10-15 21:24:49
    设有n正整数,将它们联接成一排,组成一个最小的多位整数。 例如: n=2,2个整数32,321连接成的最小整数:32132, n=4,4个整数55,31,312, 33 联接成的最小整数:312313355 分析: 其实这题就是...
     
    

    题目描述:
    设有n个正整数,将它们联接成一排,组成一个最小的多位整数。

    例如:
    n=2时,2个整数32,321连接成的最小整数为:32132,
    n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355


    分析:

    其实这题就是将这些整数以字符串方式排序,整数的第一位越小,其越靠前;若第一位相同则同理比较第二位。依次类推,直至能确定其顺序。当其中一个数是另一个数的部分时,如32(记为A)和321(记为B),则比较B(321)与B的剩余位(1)与A的连接(即132)的大小。

    代码如下:

    #include<iostream>
    using namespace std;
    
    struct Node
    {
     char str[11];
     Node* next;
    };
    
    int Compare(const char* str1,const char* str2)
    {
       char c1=str1[0],c2=str2[0];
       int i=1;
       while(c1==c2)
       {
        c1=str1[i];
        c2=str2[i];
        if(c1=='\0')
        {
          if(c2=='\0') return 0;
          char temp[10];
          strcpy(temp,str2+i);
          strcat(temp,str1);
          return Compare(str2,temp);
        }
        if(c2=='\0')
        {
          char temp[10];
          strcpy(temp,str1+i);
          strcat(temp,str2);
          return Compare(temp,str1);
        }
        i++;
       }
       return c1-c2;
    }
    
    void main()
    {
     int n,arr[100],i;
     cout<<"请输入要输整数的个数:";
     cin>>n;
     for(i=0;i<n;i++)
     {
      cout<<"请输入第 "<<(i+1)<<" 个整数:";
      cin>>arr[i];
     }
     //排序
     Node *head=new Node;
     Node *p=new Node;
     head->next=p;
     p->next=NULL;
     itoa(arr[0],p->str,10);
       
     Node *newNode;
     bool isEnd;
     for(i=1;i<n;i++)
     {
       //生成新节点
       newNode=new Node;
       itoa(arr[i],newNode->str,10);
       newNode->next=NULL;
       //插入节点
       p=head;
       isEnd=false;
       while(Compare(newNode->str,p->next->str)>=0)
       {
         if(p->next->next==NULL)
         {
            isEnd=true;
            break;
         }
         p=p->next;
       }
       if(isEnd) p->next->next=newNode;
       else 
       {
        newNode->next=p->next;
        p->next=newNode;
       }
     }
     cout<<"有上述整数连接成的最小整数是:";
     p=head->next;
     while(p!=NULL)
     {
       cout<<p->str<<" ";
       p=p->next;
     }
     cout<<endl;
    }
    

     

     

     

     

     

     

     

     

     



     

    展开全文
  • 要求定义和调用函数int even(int n)判断整数n的奇偶性,当为奇数返回1,否则返回0。 输入输出示例 输入:11 3 7 6 8 9 11 0 输出:sum = 41 代码: #include <stdio.h> #include <stdlib.h> int even...

    我是川川,QQ2835809579,有问题留言or私我
    原题:

    输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数int even(int n)判断整数n的奇偶性,当为奇数时返回1,否则返回0。

    输入输出示例

    输入:11 3 7 6 8 9 11 0

    输出:sum = 41

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    int even(int n)
    { 
    return n %2 ==0?1: 0;
    }
    int main()
    {
    int n,sum=0;
    printf("请输入-批数整数: \n");
    scanf( "%d", &n);
    while (n != 0) {
    if(even(n)==0)
    {
    sum+= n;
    }
    scanf( "%d", &n);
    }
    printf("sum=%d\n",sum);
    return 0;
    } 
    

    结果:
    在这里插入图片描述

    展开全文
  • 问题:设有n正整数,将它们连接成一排,组成一个最大的多位整数。例如:n=4,4个整数7,13,4,246,连成的最大整数7424613。 个人思路:一开始看到这个题目的时候并没有想到和贪心算法有什么关系,我的思路...

    问题:设有n个正整数,将它们连接成一排,组成一个最大的多位整数。例如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。

    个人思路:一开始看到这个题目的时候并没有想到和贪心算法有什么关系,我的思路也很简单就是运用排序,把这几个数字的首数字进行排序首数字大的排在前面,就题目给定的几个数字运用我这方法是可行的,但是当我写出来之后,发现并不适合所有的情况,例如:121和122,当这两个数字排在一起的时候,无法通过我一开始提出的思路进行求解,当查阅资料后发现需要自定义一个比较大小的方法,即

    /*
    * a+b >= b+a说明a >= b  
    * a+b <= b+a说明a <= b
    * */

    举例 “121”+“122” = “121122”  “122”+“121”=“122121”很明显122>121,很好的解决上述冲突问题

     

    代码:

    package com.wxh.suanfa.贪心算法;
    
    public class BigNumber {
        private static String num[] = {"7","131","132","26"};//定义要比较的数
        private static int length = num.length;
        public static void main(String[] args) {
            String s = merge();
            System.out.println("最大整数为:"+s);
        }
        public static String merge(){
    
            int a ;//定义要比较的字符串
            int b ;
            String s = "";//合并后的字符串
    
            /*for (int i = 0; i<length-1; i++){
                    for (int j = i+1; i<length; j++){*/
    
            for (int i = 1; i<length; i++){//类似于冒泡排序
                for (int j = 0; j < length-i; j++){
                    a = Integer.parseInt(num[j] + num[j+1]);//先转化为int方便比较大小
                    b = Integer.parseInt(num[j+1] + num[j]);
                    /*
                     * a+b >= b+a说明a >= b
                     * a+b <= b+a说明a <= b
                     * */
                    if (a <= b){//从大到小排序
                        String temp = num[j];
                        num[j] = num[j+1];
                        num[j+1] = temp;
                    }
                }
            }
            for (int i = 0; i<length;i++){//将排序完的数组按照顺序进行一个输出
                s = s + num[i];
            }
            return s;
        }
    }
    

    代码很简单,只要认真的读应该是没问题的,欢迎大家一起交流!

    展开全文
  • 给一个n位的正整数,要求:(1)求出他是几位数;...以上针对的是当n为正整数时,当n为一个整数时,分三种情况:整数、负数和0。当n为负数时,只需增加一个if语句进行判断,使n转化为正整数,然后进

    给一个n位的正整数,要求:(1)求出他是几位数; (2)分别输出每一位数字; (3)按逆序输出给位数字,例如原数为321,应输出123。

    (1)对于一个n位正整数,要求出他是几位数,只需定义一个变量count存储这个数的位数,初始化count为0,利用while循环对整数n整除10,整除一次count加一,当n整除10为0时循环结束,函数返回值为整数位数count;
    以上针对的是当n为正整数时,当n为一个整数时,分三种情况:整数、负数和0。当n为负数时,只需增加一个if语句进行判断,使n转化为正整数,然后进行正整数求位数;n为0时直接返回1即可;
    代码实现如下:

    int  Show(int n)
    {
     int count=0; //存储n的位数 
     if(n<0) n=-n; //负数转换为正数再求位数 
     if(n==0) return 1; //n为0是直接返回位数为1 
     while(n!=0) //对正整数求位数 
     {
      n/=10;
      count++;
     }
     return count;
    }

    (2)要输出n的每一位数字,需要引用前面的求位数函数,判断他是几位数,方便判断从哪位开始输出,然后依次求出他的每一位数字并输出。先定义变量i存放n的位数,再定义一个变量a存放10^i-1,用while循环:1、对n对a整除,求出每个位数的数字并输出;2、n对a取余剔除最高位数字;3、a/=10为下趟循环做准备。
    以上是针对当a为正整数时,当n为0或负数时方法和上面的方法类似,在此就不再赘述。
    代码实现如下:

    void Show1(int n)
    {
     int i=Show(n); //存放n的位数 
     int a=pow(10,i-1); //存放最高位的10的整数次幂求每位数字 
     if(n==0) //n为0时输出0 
     {
      printf("0\n");
     }
     if(n<0) //n为负数时先输出负号后再输出每位数字 
     {
      printf("-");
      n=-n;
     }
     while(n!=0) //输出每位数字 
     {
      printf("%d ",n/a);
      n%=a;
      a/=10;
     }
    } 
    

    注:不用a存放pow(10,i-1)而直接使用【n%=pow(10,i-1);i–;】时,会发生数据类型不匹配的错误。

    (3)按逆序输出给位数字,例如原数为321,应输出123。输出n的每位数字只需利用while循环对n%10并输出,然后n/=10为下趟循环准备,n=0时循环结束。
    当n为0或负数时和以上方法类似。
    代码实现如下:`

    void Show2(int n)
    {
     if(n==0) //n为0时输出0 
     {
      printf("0\n");
     }
     if(n<0) //n为负数时先输出负号后再输出每位数字 
     {
      printf("-");
      n=-n;
     }
     while(n!=0) //输出每位数字
     {
      printf("%d ",n%10);
      n/=10;
     }
    } 

    主函数:

    int main()
    {
     printf("%d\n",Show(123456));	//统计位数
     Show1(654123);	//顺序输出每位数字
     Show2(654321);	//逆序输出每位数字
    }
    展开全文
  • 找出所有和为n的连续正整数序列

    千次阅读 2014-03-02 21:10:26
    给出一个正整数n,要你找出所有和为n的连续正整数序列。 比如n=15,那么和15的连续正整数序列有:7 8, 4 5 6,1 2 3 4 5.这三个序列都是连续的,并且和都是15。 思路:想想另外一个问题。《找出序列中和为n...
  • n为正整数,将n写成若干个正整数之和,使这些正整数的乘积最大。 要求: 1)这些正整数互不相同 2)这些正整数可以相同 问题分析:1) 可以手模找找规律, n>=5,5=2+3;6=2+4;7=3+4;8=3+5;9=2+3+4;10=2+...
  • 正整数n可以拆分成若干个正整数之和,考虑拆分方案的个数。 1.证明 对一个数i拆分,选择j拆分点,这其可对1~j-1拆分,也可对i-j~i进行查分。记g(i,j)表示拆分整数i最大加数不超过j的方案个数,则g(i,j) = ...
  • 试例如下,当n=16将返回: {1,2,Three,4,Five,Three,7,8,Three,Five,11,Three,13,14,Fifteen,16} 参考代码1: package com.gx.demo; import java.util.Arrays; import java.util.Scanner; public class Test1 { ...
  • * ** ... int i, j, n; scanf("%d", &n); for (i = n; i > 0; i--){ for(j=i;j>1;j--){ printf (" "); } for(j=i;j<=n;j++){ printf ("*"); } printf ("\...
  • 例如,当n=12 ,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务: 对于给定的正整数n,编程计算n共有多少种不同的分解式。 Input 输入数据...
  • 给定一个正整数 n,将其拆分至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3...
  • 输入一个正整数n,输出n!的值。

    千次阅读 2019-08-03 09:17:17
    输入一个正整数n,输出n!的值。 其中n!=123*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算...首先将a设1,然后乘2,乘3,乘到n时,即得到了n!的值。   输入格式 输入包含一个...
  • 数据规模较大,递归的方式效率很低。 public class Main { static int fun2(int n, int k) { int arr[][]=new int[n+1][k+1]; for(int i=1;i&lt;=n;i++) { for(int j=1;j&lt;=k;j+...
  • 个人思路: ...②sum等于N时,记录。sum大于N时,下一个数开始累加。 /* 输入一个正数N,输出所有和为N的连续正数数列 例如:输入15 输出[[1,2,3,4,5],[4,5,6],[7,8]] */ function ByteDanc...
  • 我们知道只有两个数相乘或者单个数10的倍数,才有可能增加尾随零,也就是说阶乘中出现2*5的时候,一定会产生尾随零。 由于能被2整除的频率要远大于被5整除的频率,那么实际上,阶乘式子中出现5的次数,就是...
  • 面试题:用java编程,在不适用循环变量的条件下,给正整数n,以2n,4n,8n...8n,4n,2n的方式输出,大于5000,以特定的方式输出: 比如n=1234,输出结果: 1234, 2468, 4936, 9872, 9872, 4936, ...
  • 循环赛日程表 题目: 设有n个运动员要进行...(3)当n为偶数要进行n-1天的比赛;当n为奇数要进行n天的比赛 分治法代码如下: #include <iostream> using namespace std; int b[100];//随便设置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,059
精华内容 1,223
关键字:

当n为正整数时