算法设计与分析hw(1)

  • Post author:
  • Post category:其他


1.输入联系【Java】

【问题描述】

任务很简单:

给定若干个整数,请编程输出它们的和。

【输入形式】

输入包含多组测试用例。

每组测试数据首先是一个正整数N,表示本组数据有N个整数。

请处理到文件结束。

【输出形式】

请计算每组数据的和,每组输出占一行。

【样例输入】

4 1 3 4 9 5 10 2 30 4 50

【样例输出】

17 96

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true){
		 
            if(sc.hasNext()){
			   String s = sc.nextLine();
                String[] str = s.split(" ");
                int sum = 0;
                int n = Integer.parseInt(str[0]);
                for (int x = 1; x < n+1; x++) {
                    sum += Integer.parseInt(str[x]);
                }
                System.out.println(sum);
            }else break;

        }

    }
}

2.丑数 【Java】

【问题描述】

丑数的定义是这样的——

一个数,如果它分解后的素因子最多只有2、3、5、7四种,这个数则称为“丑数”。比如,前20个丑数是:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27。

现在你的任务是:给你一个数,你能判断是否是丑数吗?

【输入形式】

输入数据的第一行首先是一个整数C,表示测试数据的个数,然后是C组数据,每组测试数据包含一个整数n(1 <= n <= 2^31-1)。

【输出形式】

对于每组测试数据,如果n是丑数,则请输出“ Yes”,否则,请输出“No”.

【样例输入】

3 12 385875 11

【样例输出】

Yes Yes No

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 = 0; i < n; i++) {
            int num = sc.nextInt();
            if (check(num)==1) System.out.println("Yes");
            else System.out.println("No");
        }
    }
    public static int check(int num){
        while(num%2==0){
            num/=2;
        }

        while(num%3==0){
            num/=3;
        }
        while(num%5==0){
            num/=5;
        }
        while(num%7==0){
            num/=7;
        }
        if(num==1)
            return 1;
        return 0;
    }
}

3.字符三角形【Java】

【问题描述】

我们学习了编程,通过对程序的控制,可以做一些有趣的输出。

比如,这个题目就是给定一个正整数N,请你输出一个由N行的*组成的三角形。

但是——为了图形的美观,我们希望输出的是一个等腰三角形!

具体规则如下:

第一行是1个*

第二行是3个*

第三行是5个*

……

依次类推,一直到第N行(第N行的开始没有空格)。

更多了解可以参见样例。

【输入形式】

输入数据第一行是一个正整数C,表示一共有C组测试用例。

接下来C行,每组数据占一行,是一个正整数N(1<=N<=40),N的含义见题目描述。

【输出形式】

对于每组数据给定的N,请按照要求输出由*组成的N行等腰三角形。

【样例输入】

2 3 5

【样例输出】

*

***

*****

*

***

*****

*******

*********

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 k = 0; k < n; k++) {
            int num = sc.nextInt();
            for (int i = 1; i <=num; i++) {	//输出4行
                for (int j = 0; j < num-i; j++) {
                    System.out.print(" ");
                }
                for (int j = 1; j <= 2*i-1; j++) {
                    System.out.print("*");
                }
                System.out.println();
            }

        }

    }
}

4.奋勇争先【Java】

【问题描述】

在丁爸信奥培训班中,每一次的作业,大家都奋勇争先,想拿下第一名。

现在已知某次测验的每位同学的解题数量和罚时,希望你能够告诉老师谁是第一名。

注:

首先依据解题数量从大到小排名,若解题数量相同,则比较罚时,罚时少的排名靠前。

【输入形式】

第一行是数据组数C,代表有C组测试实例。

每一组数据第一行为一个N,代表下面有N个人的成绩。

接下来N行,每一行依次给出名字Name,解题数量num和罚时time

( 1<=C<=10, 2<N<=1000, Name的长度最大为10, 1<=num<=10,

10<=time<=100000 )

【输出形式】

每组测试数据输出一行,依次为第一名的名字、解题数量和罚时,中间用空格隔开。

【样例输入】

1 3 Bob 5 50 Alice 4 46 John 5 48

【样例输出】

John 5 48

import java.util.Arrays;
import java.util.Scanner;
class student{
    private String name;
    private int num;
    private int time;

    public student(String name,int num,int time){
        this.name = name;
        this.num = num;
        this.time = time;
    }
    public String getName(){
        return this.name;
    }

    public int getTime() {
        return this.time;
    }

    public int getNum() {
        return this.num;
    }
    public String tell(){
        return  this.name+" "+this.num+" "+this.time;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//        几组数据
        int n = sc.nextInt();
        for (int k = 0; k < n; k++) {
//            输入几行数字
            int m = sc.nextInt();
//            申请几个数组
            student[] st_arr = new student[m];
            for (int i = 0; i < m; i++) {
                String data1 = sc.next();
                int data2 = sc.nextInt();
                int data3 = sc.nextInt();
                student st_data = new student(data1,data2,data3);
                st_arr[i] = st_data;
            }
            int index=0;
            String name = st_arr[0].getName();
            int max_num = st_arr[0].getNum();
            int time = st_arr[0].getTime();
            for (int i = 0; i < m; i++) {
                if (max_num<st_arr[i].getNum()){
                    name = st_arr[0].getName();
                    max_num = st_arr[i].getNum();
                    time = st_arr[i].getTime();
                    index =i;

                }
                if (max_num==st_arr[i].getNum()){
                    if(time>st_arr[i].getTime()){
                        name = st_arr[0].getName();
                        max_num = st_arr[i].getNum();
                        time = st_arr[i].getTime();
                        index = i;
                    }
                }
            }
            System.out.println(st_arr[index].tell());
        }
    }
}

5.超级密码【Java】

【问题描述】

上次设计的“高级密码”被你们破解了,一丁小朋友很不服气!

现在,他又设计了一套更加复杂的密码,称之为“超级密码”。

说实话,这套所谓的“超级密码”其实也并不难:

对于一个给定的字符串,你只要提取其中的数字,然后连在一起构成一个整数,再乘以刘一丁小朋友的幸运数字513,就是解密后的结果了~

比如,字符串“ads2d4,122”,提取后的整数是24122,然后乘以513,就能得到解密后的结果:12374586。

注:题目保证解密后的结果在32位无符号整数范围。

【输入形式】

输入首先包括一个正整数N,表示有N组测试用例。

每组数据占一行,包含一个长度不超过30的字符串。

【输出形式】

请根据题目要求输出解密后的结果,每组数据输出一行。

【样例输入】

2 ads2d4,122 0023asdf2AA90

【样例输出】

12374586 11947770

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 = 0; i <n; i++) {
            StringBuilder buf=new StringBuilder();
            String pword = sc.next();
            int sum=0;
            for (int j = 0; j < pword.length(); j++) {
                if(pword.charAt(j)>='0' && pword.charAt(j)<='9'){
                    buf.append(pword.charAt(j));
                }
            }
            //将StringBuilder转换成String
            String number = buf.reverse().toString();
            for (int j = 0; j < number.length(); j++) {
                sum +=Integer.valueOf(number.charAt(j)-48)*Math.pow(10,j);
            }
            System.out.println(sum*513);
        }
    }
}

6.求根号n【C】

【输入形式】输入一个正整数

【输出形式】输出答案

【样例输入】10

【样例输出】3

【样例说明】表示对n开平方后向下取整。

#include <stdio.h>
int szys_sqrt(int n)
{
    int i=1;
l:     if(i*i==n)
         return i;
    if(i*i>n)
        return i-1;
    i=i+1;
    goto l;
}
int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n",szys_sqrt(n));
    return 0;
}

7.学生成绩排序【C】

【问题描述】

对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序。

【输入形式】

从键盘依次输入最多不超过50个学生的学生姓名和成绩:

第一行输入班级学生人数;

在单独行上输入空格隔开的学生姓名和成绩,其中学生成绩是整数。

【输出形式】

按学生成绩由高到低顺序输出学生姓名和成绩,每行输出一位学生的姓名和成绩,其中姓名(英文)占15位,成绩占5位,均按缺省方式对齐。成绩相同时按输入次序排序。

【输入样例】

4

aaa 50

bbb 70

ccc 65

ddd 90

【输出样例】

############ddd###90

############bbb###70

############ccc###65

############aaa###50

(注意:其中&ldquo;#&rdquo;号代表空格)

【样例说明】

输入了四个学生姓名和成绩,按成绩排序输出。

#include <stdio.h>
struct student
{
    char name[50];
    int score;
};
int main()
{
    struct student a[50];
    struct student t;
    int i,n,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%s%d",&a[i].name,&a[i].score);
    for(i=1;i<n;i++)
        for(j=0;j<n-i;j++)
            if(a[j].score<a[j+1].score)
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
    for(i=0;i<n;i++)
        printf("%15s%5d\n",a[i].name,a[i].score);


    return 0;
}

8.学生成绩排序(冒泡)【C】

【问题描述】对一含有n个整数的数组,使用选择排序将其由小到大排序。

【输入形式】第一行为元素个数n,第二行为n个整数(以空格隔开)。

【输出形式】输出n个整数(以空格隔开)

【样例输入】

6

43 2 56 1 22 9

【样例输出】

1 2 9 22 43 56


#include <stdio.h>
void sort(int a[], int n)
{
    int i, t, j;
    for(i=0; i<n-1; i++)
    {
        for(j=i+1; j<n; j++)
        {
            if(a[j]<a[i])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    int i;
    int score[n];
    for(i=0;i<n;i++)
        scanf("%d",&score[i]);
    sort(score,n);
    for(i=0;i<n;i++)
        printf("%d ",score[i]);
    return 0;
}


9.十进制到八进制的转换【C++】

【问题描述】对于输入的任意一个非负十进制整数n(0=<n<100000),打印输出与其等值的八进制数

【输入形式】非负十进制整数

【输出形式】相应十进制整数转换后的八进制正整数,若输入不符合要求,提示错误,重新输入

【样例输入】5548

【样例输出】12654

【样例说明】先判断输入是否符合非负正整数要求

//十进制到八进制的转换
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int i,t=0;
	cin>>i;
	vector<int>nums;
	if(i>0)
	{
		for(;i>0;i/=8)//每次都除8 
	    {
		    t=i%8;
		    nums.push_back(t);//压入余数 
	    }
	}
	else
	{
		cout<<"0";
	 } 
	for(int time=nums.size()-1;time>=0;--time)
	{
		cout<<nums[time];//输出除以8的余数 
	}
}



版权声明:本文为vi_vigara原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。