题目:*~整数加法
请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error
输入描述: 输入为一行,包含两个字符串,字符串的长度在[1,100]。
输出描述: 输出为一行。合法情况输出相加结果,非法情况输出error
【解题思路】:
加法运算,每一位的值等于当前对应位的两数之和+进位。
由于是加法,所以当前位的和最多是19(9 + 9 +进位1),所以产生的进位最多为1。
故第一步:计算对应位的和,对应位相加 + 上一位的进位
第二步:更新当前位的值,和 % 10 ,把值转成字符(和 - ‘0’)存入字符结果中
第三步:更新进位,和 /10,然后计算下一位的值
最后一步:如果计算完之后,进位为1,说明最高位产生了进位,所以需要再加一位,才是最后的结果。结果产生之后,需要逆置,得到最终结果
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
String str=scan.nextLine();
String[] s=str.split(" ");
System.out.println(add(s[0],s[1]));
}
}
public static String add(String s1,String s2){
char[] c1=s1.toCharArray();
char[] c2=s2.toCharArray();
if(!check(c1)||!check(c2)){
return "error";
}
if(c1.length<c2.length){
char[] tmp=c1;
c1=c2;
c2=tmp;
}
int jw=0;
int i=c1.length-1;
int j=c2.length-1;
for(;j>=0;j--,i--){
int add=c1[i]-'0'+c2[i]-'0'+jw;
c1[i]=(char)(add%10+'0');
jw=add/10;
}
for(;i>=0;i--){
int add=jw+c1[i]-'0';
c1[i]=(char)(add%10+'0');
jw=add/10;
}
StringBuilder bf=new StringBuilder();
if(jw!=0){
bf.append(jw);
}
for(i=0;i<c1.length;i++){
bf.append(c1[i]);
}
return bf.toString();
}
public static boolean check(char[] c){
for(int i=0;i<c.length;i++){
if(c[i]>'9'||c[i]<'0'){
return false;
}
}
return true;
}
}
题目:*~杨辉三角形的变形
题目描述
1
1 1 11 2 3 2 1
1 3 6 7 6 3 1
1 4 10 16 19 16 10 4 1
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
输入n(n <= 1000000000) 本题有多组输入数据,输入到文件末尾,请使用while(cin>>)等方式读入 输入描述:
输入一个int整数输出描述: 输出返回的int值
【解题思路】:
按照题目意思,可以发现第n行有2n - 1个元素,第i,j元素等于上一行第j - 2,j - 1,j三列元素之和,每一行的第一列和最后一列都为1,如果是第二列,则只是两个元素之和
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
int n=scan.nextInt();
int m=2*n-1;
int[][] a=new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
a[i][j]=0;
}
}
a[0][0]=1;
for(int i=1;i<n;i++){
a[i][0]=a[i][2*i]=1;
for(int j=1;j<2*i;j++){
if(j==1){
a[i][j]=a[i-1][j]+a[i-1][j-1];
}else{
a[i][j]=a[i-1][j]+a[i-1][j-1]+a[i-1][j-2];
}
}
}
int k=0;
for(;k<m;k++){
if(a[n-1][k]%2==0){
System.out.println(k+1);
break;
}
}
if(k==m){
System.out.println(-1);
}
}
}
}
方法二:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int n = in.nextInt();
if(n<=2)
System.out.println(-1);
else if(n%2==1){
System.out.println(2);
}else{
if(n%4==0)
System.out.println(3);
else
System.out.println(4);
}
}
}
}