这个月练习了一些算法题,打算从简单题入手,逐步练习达到PAT甲级的程度,把Java和C++的熟练度捡回来。Java的一些基础知识还不是很熟,大一学习的时候只能算是囫囵吞枣,到了面试技术岗的时候才觉得当时真的是猴子捡香蕉式学习。希望在我大四毕业前可以把这些知识都融会贯通,可以在毕业后一年内找到满意的工作。
题源链接:https://wenku.baidu.com/view/4dafb43a00f69e3143323968011ca300a6c3f6a5.html
1.分解质因数
//分解质因数
int k = 2;
public void myPrime(int n) {
System.out.print("n = ");
while(n > k) {
if(n % k == 0) { //找到因数
System.out.printf(k+" * ");
n /= k; //类似递归的思路
}else {
k++;
}
}
System.out.println(k);
}
2.求完数
//一个数如果恰好等于它的因子之和 这个数就称为"完数" 例如找出 1000 以内的所有完数。
public void perferctNum() {
int sum = 0;
int num = 0;
for(int n = 1;n <= 1000;n++) {
sum = 0;
num = n;
for(int i = 1;i <= n / 2;i++) {
if(n % i == 0) {
sum += i;
}
}
if(num == sum) {
System.out.println(num);
}
}
}
3.统计输入字符类型与计数
//输入一行字符 分别统计出其中英文字母 空格 数字 和其它字符的个数。
public void countString() {
int engNum = 0;
int kongNum = 0;
int numNum = 0;
int otherNum = 0;
Scanner sc = new Scanner(System.in);
String string = sc.nextLine();
for(int i = 0;i < string.length();i++) {
char c = string.charAt(i);
if((c >= 'A') && (c <= 'Z')) {
engNum++;
}else if((c >= 'a') && (c <= 'z')){
engNum++;
}else if ((c >= '0') && (c <= '9')) {
numNum++;
}else if (c==' ') {
kongNum++;
}else {
otherNum++;
}
}
System.out.println("字母" + engNum + ";数字 = " + numNum + ";空格 = " + kongNum
+ ";其他 = " + otherNum);
sc.close();
}
4.求s=a+aa+aaa+aaaa+aa...a的值
//求s=a+aa+aaa+aaaa+aa...a的值
public long getNum(int a,int n) {
int num = 0;
for(int i = n-1 ;i >= 0;i--) {
num += Math.pow(10, i) * a;
}
return num;
}
public void getSum(int a,int n) {
int sum = 0;
for(int i = 1;i <= n;i++) {
sum += getNum(a, i);
}
System.out.println(sum);
}
5. 第10次反弹多高?
//一球从一百米高度自由落下 每次落地后反跳回原高度的一半
//再落下 求它在第十次落地时 共经过多少米 第10次反弹多高?
public void getHeight(int n) {
double h = 100; //初次高度
double sum = 100; //总高度的初始值
double fan = 0; //每次反弹高度
for(int i = 1; i <= n; i++) {
sum += fan * 2;
fan = h / 2;
h /= 2;
}
System.out.println("sum = "+sum+"fan = "+fan);
}
6.求符合条件的数
//1个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问
boolean isPinfang(int n) { //判断是否是完全平方数
if(Math.sqrt(n) % 1 == 0) {
return true;
}
return false;
}
public void getPin() {
for(int i = 0;i < 10000000;i++) {
if(isPinfang(i+100)&&isPinfang(i+268)) {
System.out.println(i);
}
}
}
7,输入某年某月某日 判断是这一年第几天
//输入某年某月某日 判断是这一年第几天
//初始化
int[] mday1 = {31,28,31,30,31,30,31,31
,30,31,30,31};
int[] mday2 = {31,29,31,30,31,30,31,31
,30,31,30,31};
int[] sum = new int[12];
//判断闰年
public boolean isRun(int yy) {
if(((yy % 4 == 0) && (yy % 100 != 0))
||(yy % 400 == 0)) {
return true;
}
return false;
}
//sum[i]所求月份之前的总和天数
public void initMonth(int yy) {
if(isRun(yy)) {
for (int i = 0; i < 12; i++) {
for(int j = i; j >= 0; j--) {
sum[i] += mday2[j];
}
}
}else {
for (int i = 0; i < 12; i++) {
for(int j = i; j >= 0; j--) {
sum[i] += mday1[j];
}
}
}
}
public void whichDay(int yy,int mm,int dd) {
initMonth(yy);
int ans = sum[mm-2] + dd; //因为月份是1开头,sum是0开头,且要算包含(mm-1)月的天数
System.out.printf("今天是%d年的第%d天\n",yy,ans);
}
8.逆序输出数组(原地实现)
public void reverse(int[] a) {
for (int i = 0, j = a.length - 1; i < j; ++i, --j) {
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
}
9.猴子吃桃
//猴子吃桃
//猴子第一天摘下若干个桃子 当即吃了一半 还不瘾 又多吃了一个
//第二天早上又将剩下的桃子吃掉一半又多吃了一个
//以后每天早上都吃了前一天剩下的一半零一个
//到第十天早上想再吃时 见只剩下一个桃子了 求第一天共摘了多少。
/**
* b1=1 b2=2b1+2 b3=2b2+2....
*/
public int peach(int n) {
if(n == 1) {
return 1;
}else {
return (2*peach(n-1))+2;
}
}
public void monkey() {
System.out.println(peach(11));
}
10.给出1,2,3,4四个数字,求出一共有几个互不相同,且无重复的三位数
public class Test27 {
static int count = 0;
int m = 4;
int n = 3;
int[] htable = new int[m+1];
Stack<Integer> stack = new Stack<Integer>();
//给出1,2,3,4四个数字,求出一共有几个互不相同,且无重复的三位数
public void FNum(int now) {
if(now == n) {
count++;
for (int is : stack) {
System.out.print(is);
}
System.out.print(";");
//System.out.println(stack);
return;
}
for(int i = 1; i <= m; i++) {
if(htable[i] == 0) {
stack.push(i);
htable[i]++;
FNum(now+1);
stack.pop();
htable[i]--;
}
}
}
public static void main(String[] args) {
Test27 test27 = new Test27();
test27.FNum(0);
System.out.println("\n共有"+count+"个互不相同且无重复数字的三位数");
}
}