算法训练 寂寞的数  

时间限制:1.0s   内存限制:256.0MB

问题描述

  道德经曰:一生二,二生三,三生万物。
  对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。
  因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))....例如,从33开始的递增序列为:
  33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
  我们把n叫做d(n)的生成元,在上面的数列中,33是39的生成元,39是51的生成元,等等。有一些数字甚至可以有两个生成元,比如101,可以由91和100生成。但也有一些数字没有任何生成元,如42。我们把这样的数字称为寂寞的数字。

输入格式

  一行,一个正整数n。

输出格式

  按照升序输出小于n的所有寂寞的数字,每行一个。

样例输入

40

样例输出

1
3
5
7
9
20
31

数据规模和约定

  n<=10000

1到n每个数都做生成元,代码:

 

 

import java.util.Scanner;

public class Main {

static int[] data=new int[100*100+1];

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=getNum(0);
while(k!=-1){
int t=k;
while(t<n){
int sum=t;
while(t>0){
sum+=t%10;
t/=10;
}
if(sum<=n)
data[sum]=1;
t=sum;
}
k=getNum(k);
}
for (int i = 1; i <= n; i++) {
if(data[i]==0)
System.out.println(i);
}
}
private static int getNum(int t) {
for (int i = t+1; i < data.length; i++) {
if(data[i]==0)
return i;
}
return -1;
}
}

 

 

 

 

 

算法训练 连续正整数的和  

时间限制:1.0s   内存限制:256.0MB

问题描述

  78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。
  输入一个正整数 n(<=10000)
  输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+...+b=n。
  对于多种表示法,a小的方案先输出。

样例输入

78

样例输出

1 12
18 21
25 27

用数学累加求和的公式,代码:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();

for (int i = 1; i < n; i++) {
for (int j = i+1; j < n; j++) {
double sum=(double)(j-i+1)*(i+j)/2;
if(sum==n)
System.out.println(i+" "+j);
}
}
}
}

 

 

 

  算法训练 学做菜  

时间限制:1.0s   内存限制:256.0MB

问题描述

  涛涛立志要做新好青年,他最近在学做菜。由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜,我们给这四种原料标上字母A,B,C,D。
  涛涛现在会做的菜有五种:
  1、 西红柿炒鸡蛋 原料:AABDD
  2、 酸辣鸡丁 原料:ABCD
  3、 宫保鸡丁 原料:CCD
  4、 水煮西红柿 原料:BBB
  5、 怪味蛋 原料:AD
  这天早上,开开去早市给涛涛买了一些原料回来。由于事先没有什么计划,涛涛决定,对于现存的原料,每次尽量做菜单上靠前(即编号小)的菜。
  现在请你写一个程序,判断一下开开和涛涛中午能吃到哪些菜。

输入格式

  共4个整数a,b,c,d。分别表示开开买的A,B,C,D这4种原料的数量。每种原料不会超过30份。

输出格式

  输出5行。其中第i行表示涛涛做的第i种菜的数目。

样例输入

3
1
2
4

样例输出

1
0
1
0
1

一个个的做就是了,代码:

 

import java.util.Scanner;

public class Main {
static int[] data=new int[4];
public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

while(sc.hasNext()){
int[] data=new int[4];
int[] arr=new int[5];
for (int i = 0; i < data.length; i++) {
data[i]=sc.nextInt();
}
//1
while(data[0]>1&&data[1]>0&&data[3]>1){
arr[0]++;
data[0]-=2;
data[1]-=1;
data[3]-=2;
}
//2
while(data[0]>0&&data[1]>0&&data[2]>0&&data[3]>0){
arr[1]++;
data[0]-=1;
data[1]-=1;
data[2]-=1;
data[3]-=1;
}
//3
while(data[2]>1&&data[3]>0){
arr[2]++;
data[2]-=2;
data[3]-=1;
}
//4
while(data[1]>2){
arr[3]++;
data[1]-=3;
}
//5
while(data[0]>0&&data[3]>0){
arr[4]++;
data[0]-=1;
data[3]-=1;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
}