「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。
本文不介绍C++和Java基本语法,想要学习请点击下方链接
今天我们介绍经典回型输出与大数输出(会用到Java和C++进行对比)
例题
1.计算2的N次方(N<10000)
虽然本提看起来简单,但是指数式增长是一种增长及其快的增长方式,所以我们即使使用long long 也是存储不下的,所以我们要使用其他方法
#include<iostream>
#include<algorithm>
using namespace std;
int main()//本题的主要思路就是将long long存储不下的数据用数组来存储(模拟我们所使用的乘法)
{
int a[10000],size=1,n;//size是用来统计位数
a[0]=1;
cin>>n;
while(n--){//从n开始进行循环,循环n次,求2^n,并将结果存入数组中
int t=0;
for(int i=0;i<size;i++){//size用来控制输出的位数。
t+=a[i]*2;
a[i]=t%10;//取余用来进行保留个位数
t/=10;//用来判断是否超出10,逢10进一
}//for循环中的操作,就是将每一位数进行乘二,然后每一位数据存储在数组中
if(t) a[size++]=t;//t不为0,意味着有十位以上的数据,将size++,使得下一次for循环正确
}
for(int i=size-1;i>=0;i--)//输出值
cout<<a[i];
cout<<endl;
return 0;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
//Java读取可以使用BUfferReader也可以使用Scanner。相比较来说Scanner运行效率更慢,但是Scanner可以输入具体的数据类型,而BUfferReader输入后都是字符串,需要进行分割转化。
BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(scan.readLine());//将输入的数据转化成一个int类型的值
BigInteger bignum = BigInteger.valueOf(1);
//BigInteger是用来进行大数操作的类,该类是不可以直接进行+、-、*、/的必须调用相关方法,并且不能与int型进行运算,如要进行运算,必须用BigInteger.valueOf()转化成BigInteger。因为BigInteger底层使用数组来实现
for(int i=1;i<=n;i++){
bignum =bignum.multiply(BigInteger.valueOf(2));//bignum.multiply是BigInteger进行乘法的方法
}
System.out.println(bignum);
}
}
Java中 BIgInteger 是 Java.math包下的,C++也有类似的BigInt(我还没用到过,之后可能会介绍)
2.打印回字形
输入一个n行m列的矩阵,从左上角开始将其按回字形的顺序顺时针打印出来。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
int arr[50][50];
cin>>n>>m;
for(int i=0;i<n;i++){//输入值
for(int j=0;j<m;j++){
cin>>arr[i][j];
}
}
bool st[50][50]={false};
int dx[4]={-1,0,1,0},dy[4]{0,1,0,-1};//dx[0],dy[0]对应着输出方向向上,dx[1],dy[1]对应着输出方向向左
//dx[2],dy[2]对应着输出方向向下,dx[3],dy[3]对应着输出方向向右
int d=1,x=0,y=0;
for(int i=0;i<n*m;i++){
int a=x+dx[d],b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||st[a][b]){//用来判断何时转向,转向有两个条件,1.边界,2.已经被输出过(用bool数组判断)
d=(d+1)%4;//通过改变d的值控制输出转向
a=x+dx[d],b=y+dy[d];//保留原先的位置
}
cout<<arr[x][y]<<" ";
st[x][y]=true;//保证不会重复,类似于day02的第一题的第二种方法的思路
x=a,y=b;//保留输出的位置,用到下一次for循环
}
cout<<endl;
}
很经典的一道面试题,希望大家都可以掌握