C/C++、Java、Python的比较及学习(4)

  • 冒泡排序:首先将待排序数列中的第1个元素和第2个元素进行比较,如果是逆序进行一次交换;
    接着对第2个元素和第3个元素进行比较,如果是逆序进行一次交换;依次类推,直到对第n-1个元素和第n个元素比较完为止。此过程称为一轮冒泡,这时最大的一个元素便被“沉”到了最后一个元素的位置上。然后再从第1个元素开始到第n-1个元素进行第二轮冒泡比较交换,将次大元素“沉”到了倒数第二个元素的位置上。如此这般,直到第n-1轮冒泡后,没有元素需要交换为止。
#include<stdio.h>

void sort(int score[],int n){
	int i,j,temp;
	for(i=0;i<n-1;i++)
		for(j=0;j<n-i-1;j++)
			if(score[j]>score[j+1]){
				temp = score[j];
				score[j] = score[j+1];
				score[j+1] = temp;
			}
}
void main(){
	int score[40];
	int i,j,n;
	printf("Input total numbers:\n");
	scanf("%d",&n);
	printf("Input score:\n");
	for(i=0;i<n;i++)
		scanf("%d",&score[i]);
	sort(score,n);
	printf("output score:\n");
	for(i=0;i<n;i++)
		printf("%d ",score[i]);
}
#include<iostream>
#include<algorithm>
using namespace std;

void main(){
	int score[40];
	int i,j,n;
	printf("Input total numbers:\n");
	scanf("%d",&n);
	printf("Input score:\n");
	for(i=0;i<n;i++)
		scanf("%d",&score[i]);
	sort(score,score+n);
	printf("output score:\n");
	for(i=0;i<n;i++)
		printf("%d ",score[i]);
}
import java.util.*;
public class one {
	public static void main(String args[]) {
		int i;
		int[] score=new int[100];
		Scanner sc = new Scanner(System.in);
		System.out.println("Input total numbers:");
		int n = sc.nextInt();
		System.out.println("Input score:");
		for(i=0;i<n;i++)
			 score[i]=sc.nextInt();
		Arrays.sort(score,0,n);
		System.out.println("output score:");
		for(i=0;i<n;i++)
			System.out.print(score[i]+" ");
    }
}
print("Input total numbers:")
n = input()
# 输入一个一维数组
score = input()
# 将输入每个数以空格键隔开做成数组
nums = [int(n) for n in score.split()]
nums.sort()
print("Input score:")
print(nums)
  • Python输入的程序归类: Python输入(一维数组、字符串、二维数组、三维数组等)程序 。

1.输入一个一维数组

#输入一个数组
arr = input()
num = [int(n) for n in arr.split(',')] #如果是输入一系列由空格隔开的数就是split()
print(num)

2.输入一个二维数组

# 输入一个二维数组
n = int(input())
line = [[0]*n]*n
for i in range(n):
    line[i] = input().split(" ")
    line[i] = [int(j) for j in line[i]]
print(line)
  1. 输入一个字符串将其放入列表中
# 输入一个二维数组
arr = []
n = str(input())
for i in n:
    arr.append(i)
print(arr)

如果想把这个列表中的数合并成一个字符串输出:

# 输入一个二维数组
arr = []
n = str(input())
for i in n:
    arr.append(i)
s = "".join(arr)
print(s)
  1. 输入三维列表
t = int(input())  #输入这个三维的列表包含几个二维列表
n_list = []
for k in range(t):
    n = int(input())   #输入二维列表中包含几个一维列表
    arr = [[0]*n]*2
    for i in range(0,2):
        arr[i] = input().split(" ")
        arr[i] = [int(j) for j in arr[i]]
    n_list.append(arr)
print(n_list)
  • 二分查找:
    第一步:把一个包含n个数的有序数列放在数组a中,将待查的数放在x中。设3个位置变量d,m,h。d用来表示查找范围的顶部,即d的初值为0。h用来表示查找范围的底部,即h的初值为n-1。m用来表示查找范围的中间位置,即m=(d+h)/2。再把m作为数组a的下标,这样就把n个数分成以a[m]为中点的两段区间。
    第二步:重复进行以下三种判断,不断缩小查找范围,并在下列两种情况下不再重复进行判断而退出循环:一是已找到,则可以退出循环;二是没有找到,即本身数组a中不存在这个数,以至于使d大于h了,这时也应该退出循环。
    (1)如果x等于a[m],则已找到,就此可以结束查找过程。
    (2)如果x大于a[m],则x必定落在大于后半段范围,即在a[m+1]~a[h]范围内,所以舍弃前半段范围,保留后半段范围,定出新的d和m的值,并在新定义出的区间内重新再划分两段范围,重新进行判断。
    (3)如果x小于a[m],则x必定落在前半段范围,即在a[d]~a[m-1]范围内。这时再重新定义h和m,并在新定出的范围内重新再划分两段范围,重新进行判断。

折半查找法:也称为二分查找法, 二分搜索。是一种在有序数组中查找某一特定元素的搜索算法。搜索过程中从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于元素的那一半中查找。而且跟开始一样从中间元素开始比较,若某个步骤中数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。这种方法对待查找的列表有两个要求–必须采用顺序存储结构–必须按关键字大小有序排列。

#include<iostream>
#include<algorithm>
using namespace std;
void main(){
	int a[10],d,h,x,i,m;
	printf("Please input 10 numbers:");
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	printf("Please input x:");
	scanf("%d",&x);
	sort(a,a+10);
	d=0,h=9;
	while(d<=h){
		m=(d+h)/2;
		if(x==a[m])
			break;
		else if(x>a[m])
			d=m+1;
		else
			h=m-1;
	}
	if(d<=m)
		printf("%d is the position %d\n",x,m);
	else
		printf("there is no %d\n",x);
}
  • 杨辉三角形:
1
1  1
1  2  1
1  3  3  1
1  4  6  4  1
1  5 10 10  5  1
#include<stdio.h>
#define N 15
void main(){
	int i,j,n,a[N][N];
	printf("Input n(1-15):\n");
	scanf("%d",&n);
	for(i=0;i<=n;i++)
		a[i][0]=a[i][i]=1;
	for(i=2;i<=n;i++)
		for(j=1;j<i;j++)
			a[i][j]=a[i-1][j-1]+a[i-1][j];
	for(i=0;i<=n;i++){
		for(j=0;j<=i;j++)
			printf("%d  ",a[i][j]);
	    printf("\n");
	}
}
  • 魔方阵:每行每列和对角线之和均相等。
8   1   6
3   5   7
4   9   2
#include<stdio.h>
#define n 3
void main(){
	int i,j,k,i1,j1;
	int a[n][n]={0};
	j=n/2;i=0;
	a[i][j]=1;
	for(k=2;k<=n*n;k++){
		i1=i,j1=j;
		i--;j++;
		if(i<0) i=n-1;
		if(j>n-1) j=0;
		if(a[i][j]==0) 
			a[i][j]=k;
		else{
			i=i1+1;
			j=j1;
			a[i][j]=k;
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			printf("%d  ",a[i][j]);
	    printf("\n");
	}
}
  • 螺旋方阵:
1  2  3  4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
#include<stdio.h>

void main(){
	int n,s[15][15],x=1;
	scanf("%d",&n);
	int t=n,a=1,b=n;
	while(n){
		if(n==1){
			s[t/2+1][t/2+1]=t*t;
			n=0;
			continue;
		}
		n=n-2;
		//第一部分  
		for(int i=a;i<=t-a;i++)
			s[a][i]=x++;
		//第二部分 
		for(int i=a;i<=t-a;i++)
			s[i][b]=x++;
		//第三部分 
		for(int i=b;i>t-b+1;i--)
			s[b][i]=x++;
		//第四部分  
		for(int i=b;i>t-b+1;i--)
			s[i][a]=x++;	
		a++,b--;
	}
	for(int i=1;i<=t;i++){
		for(int j=1;j<=t;j++)
			printf("%3d",s[i][j]);
		puts("");
	}
}
  • 在C语言中没有专门的字符串变量,通常用一个字符数组来存放和处理一个字符串。
  • 字符数组的输入与输出:
    (1)用格式符%c一个字符一个字符地输入或输出。
    (2)用格式符%s将字符串作为一个整体来输入或输出。
#include<stdio.h>

void main(){
	char str1[6],str2[6],str3[6];
	printf("input string:\n");
	scanf("%s%s%s",str1,str2,str3);
	printf("%s %s %s\n",str1,str2,str3);
}

(3)用字符串处理函数gets和puts来输入或输出一个字符串。

#include<stdio.h>

void main(){
	char str[15];
	printf("input string:\n");
	gets(str);
	puts(str);
}
  • 常用的字符串处理函数:
    1、字符串连接函数strcat strcat(字符数组名1,字符数组名2)
    功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符数组1中字符串后的串标志“\0”。函数返回的是字符数组1的首地址。
#include<stdio.h>
#include<string.h>

void main(){
	char str1[25]="My name is:";
	char str2[50];
	printf("input your name:\n");
	gets(str2);
	strcat(str1,str2);
	puts(str1);
}

2、字符串复制函数strcpy strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串复制到字符数组1中。字符串结束标志"\0"也一同复制。字符数组2也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。

#include<stdio.h>
#include<string.h>

void main(){
	char str1[25],str2[]="C language";
	strcpy(str1,str2);
	puts(str1);
}

3、字符串比较函数strcmp strcmp(字符串1,字符串2)
功能:按照ASCII码值比较两个字符串的大小,并由函数返回值返回比较结果。结果分为三种情况:
(1)字符串1=字符串2,返回值为0。
(2)字符串1>字符串2,返回值为一个正整数。
(3)字符串1<字符串2,返回值为一个负整数。
字符串的比较方法为:对两个字符串从左至右按字符的ASCII码值大小逐个字符相比较,直到出现不同的字符或遇到’\0’为止。也就是说,当出现第一对不相等的字符时,就由这两个字符的大小来决定所在字符串的大小。

#include<stdio.h>
#include<string.h>

void main(){
	int k;
	char str1[25],str2[]="C language";
	printf("input a string:\n");
	gets(str1);
	k=strcmp(str1,str2);
	if(k==0) printf("str1==str2\n");
	if(k>0) printf("str1>str2\n");
	if(k<0) printf("str1<str2\n");
}
  • 求字符串长度函数strlen()
  • 输入一个字符串,统计其中有多少个单词。单词之间用空格分隔开。
#include<stdio.h>

void main(){
	char str[80],c;
	int i,num=0,flag=0;
	printf("Please input string:\n");
	gets(str);
	for(i=0;(c=str[i])!='\0';i++)
		if(c==' ')
			flag=0;
		else if(flag==0){
			flag=1;
			num++;
		}
	printf("There are %d words in the string.\n",num);
}
import java.util.*;
public class one {
	public static void main(String args[]) {
		int n=0;
		Scanner sc = new Scanner(System.in);
	    String str = sc.nextLine();
	    String[] split = str.split(" ");
	    for(String string : split){
	    	System.out.println(string);
	    	n++;
	    }	   
	    System.out.print(n);
	}
}

Python:首先,我们需要导入 Python 的 re 模块,这个模块提供了正则表达式的功能,可以帮助我们按照空格分割字符串。
然后,我们可以定义一个函数,接受一个字符串作为输入,使用 re.split() 函数按照空格分割字符串,并返回分割后的单词列表。
最后,我们只需要返回列表的长度即可得到单词的个数。

import re

def count_words(string):
  # 使用 re.split() 函数按照空格分割字符串
  words = re.split(r'\s', string)
  # 返回列表的长度
  return len(words)

s = str(input())
print(count_words(s))
  • 输入一个无符号整数,将其转换成二进制字符串并输出。
    思路:将十进制整数转换成二进制一般采用“除2取余”的方法,即将该十进制数不断除以2,并保留每次除以2所得的余数,直到余数为0为止。然后再将所得余数按逆序(即倒着排列)排列,即为所求的二进制数。
#include<stdio.h>

void main(){
	unsigned n;
	char str[10],t;
	int k,i,j;
	printf("Please input:");
	scanf("%u",&n);
	for(i=0;n!=0;i++){
		str[i]=n%2+'0';
		n/=2;
	}
	str[i]='\0';
	printf("The result is:");
	for(k=0,j=i-1;k<j;k++,j--){
		t=str[k];//这里不开辟数组的原因在于仅用一个变量便可代替数组,大大节省了空间开销。
		str[k]=str[j];
		str[j]=t;
	}
	puts(str);
}
  • 输入5个国家的名称,并按字母排序排列输出这些国家名称。
    具体的算法步骤:
    (1)输入5个国家名保存到二维数组name中。
    (2)用冒泡法对数组name按由小到大顺序排列。
    思路:可设一个5X20的二维字符数组name来存放5个国家名。由于C语言规定可以把一个二维数组当成多个一维数组处理,因此二维字符数组name又可以按5个一维数组处理,而每个一维数组就代表一个国家名字符串。
#include<stdio.h>
#include<string.h>
void main(){
	char str[20],name[5][20];
	int i,j;
	printf("input country's name:\n");
	for(i=0;i<5;i++)
		gets(name[i]);
	for(i=0;i<4;i++)
		for(j=0;j<4-i;j++)
			if(strcmp(name[j],name[j+1])>0){
				strcpy(str,name[j]);
				strcpy(name[j],name[j+1]);
				strcpy(name[j+1],str);
			}
	printf("The result is:\n");
	for(i=0;i<5;i++)
		puts(name[i]);
}

注意:java这里的容器使用要多看看练练!

import java.util.*;
public class one {
	public static void main(String args[]) {
		Scanner scanner=new Scanner(System.in);
		  int len=scanner.nextInt();//几个字符串
		  String[] target=new String[len];//定义长度为n的字符串数组
		  for (int i = 0; i < len; i++) {
		   target[i]=scanner.next();
		  }
		  //按字典排序
		  Arrays.sort(target);
		  //输出
		  for (String string : target) {
		   System.out.println(string);
		  }
    }
}
c = []
n = int(input())
for i in range(n):
    s = input()
    c.append(s)
c.sort()
for i in range(n):
    print(c[i])
  • 判断任意一个字符串是否为回文。
#include<stdio.h>
#include<string.h>
char fin(char a[]);
int main(){
    char a[80];
    printf("Input a string:\n");
    gets(a);
    if (fin(a)){
        printf("This string is a plalindrome.\n");
    }
    else{
        printf("This string is not a plalindrome.\n");
    }
}
char  fin(char a[]){
    int i, j;
    for (i = 0, j = strlen(a) - 1; i < j; i++, j--){
        if (a[i] != a[j]){//这里表示回文不需要两个数组,一个数组即可,时间空间都得到减少。
            return 0;
        }
    }
}
import java.util.*;
public class one {
	//判断一个数是否为回文数
	public static void main(String args[]) {
		Scanner input = new Scanner(System.in);
        System.out.print("请输入需要判断的数字:");
        int num = input.nextInt();
        String s = Integer.toString(num);//此处涉及到库中的容器要记住下次使用!
        char[] array = s.toCharArray();//此处调用了很多库函数要好好注意!
        boolean flag = true;
        for (int i = 0; i < array.length / 2; i++) {
            if (array[i] != array[array.length - i - 1]) {
                flag = false;
                System.out.println("你输入的数字不是回文数!");
                break;
            }
        }
        if (flag)
            System.out.println("你输入的数字是回文数!");
    }
}

python:
1:整数转字符串,通过下标对比确定该整数是否为回文数。

x = int(input())
str_x = str(x)
t = 1
for i in range(0,int(len(str_x)/2)):
    if str_x[i] != str_x[len(str_x)-i-1]:
        t = 0
        print("NO!")
        break
if t==1:
    print("Yes!")

2:字符串切片操作,str[index:index:step],中括号里面分别为:字符起点、终点和步长。

x = int(input())
str_x = str(x)
if str_x == str_x[::-1]:
        print("Yes!")
else:
    print("No!")

3:数学计算的方法,对比反转整数的值。

x = int(input())
if x<0:
    print("No!")
temp_x = x
palindromeNum = 0
while temp_x != 0:
  palindromeNum = palindromeNum*10 + temp_x%10
  temp_x = int(temp_x/10)
if palindromeNum == x:
    print("Yes!")
else:
    print("No!")

4:整数转字符串,反转字符串,对比反转后字符串与原字符串是否相等。(特别关注!)

x = int(input())
str_x = str(x)
str_y = ""
for i in str_x:
  str_y = i + str_y
if str_y == str_x:
    print("Yes!")
else:
    print("No!")

以上是这篇使用python实现回文数的四种方法小结。

  • C语言规定,数组可以作为函数的参数使用来进行数据传送。数组用作函数参数有两种形式:
    一种是把数组元素作为实参使用;另一种是把数组名作为函数的参数使用。

  • 选择排序:先找出10个数中的最小者(降序是找最大者)与数组中的第一个数a[0]交换,再从a[1]~a[9]中找出最小数与a[1]交换…每比较一轮找出一个未经排序的数中的最小数,共比较9轮。

#include<stdio.h>

void sort(int a[],int n){
	int i,j,k,t;
	for(i=0;i<n-1;i++){
		k=i;
		for(j=i+1;j<n;j++)
			if(a[j]<a[k])
				k=j;
		if(k!=j){
			t=a[k];
			a[k]=a[i];
			a[i]=t;
		}
	}
}

void main(){
	int s[10],i;
	printf("input the array:\n");
	for(i=0;i<10;i++)
		scanf("%d",&s[i]);
	sort(s,10);
	printf("output the array:");
	for(i=0;i<10;i++)
		printf("%4d",s[i]);
	printf("\n");
}
  • 用数组名作为函数参数时还应该注意以下几点:
    (1)形参数组和实参数组的数组名可以不同,但类型必须一致,否则将引起错误。
    (2)形参数组和实参数组的长度可以不相同,因为在调用时只传送实参数组的首地址,而不检查形参数组的长度。
void nzp(int a[5]){}
void main(){
     int b[8];
     nzp(b);
}

(3)在函数形参表中,允许不给出形参数组的长度。为了在被调用函数中处理数组元素的需要,可以另设一个参数,传递数组元素的个数。

void nzp(int a[],int n){
     for(i=0;i<n;i++){
     
     }
}
void main(){
      int b[8];
      nzp(b,8);
}
  • 用多维数组名作为函数参数时,在被调用函数中定义形参数组可以指定每一维的长度,也可以省去第一维的长度。
int fun(int a[3][10])或者int fun(int a[][10])

但要注意不能把第二维以及其他高维的大小说明省略,例如下面的写法就不合法:

int fun(int a[3][])

举个例子:
在矩阵a中选出各行最大的元素组成一个一维数组b。例如:

a=[3  16  87   65      b=[87 108 37]
   4  32  11  108
   10 25  12   37]   
#include<stdio.h>

void fun(int a[][4],int b[]){
	int i,j;
	for(i=0;i<=2;i++){
		b[i]=a[i][0];
		for(j=0;j<=3;j++)
			if(a[i][j]>b[i])
				b[i]=a[i][j];
	}
}

void main(){
	int a[][4]={3,16,87,65,4,32,11,108,10,25,12,37};
	int b[3],i,j;
	fun(a,b);
	printf("\narray a:\n");
	for(i=0;i<=2;i++){
		for(j=0;j<=3;j++)
			printf("%5d",a[i][j]);
		printf("\n");
	}
	printf("array b:\n");
	for(i=0;i<=2;i++)
		printf("%5d",b[i]);
	printf("\n");
}
  • 数组是在内存中连续存储的具有相同类型的一组数据的集合。
  • 数组在内存中连续存放且元素下标越大,其地址越高。
  • 数组是使用下标来访问的,下标是从0开始。
  • 数组的大小可以通过计算得到:int sz = sizeof(arr)/sizeof(arr[0])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值