java问题啊~如果给你一串数字,一共有12个(123456789123),我要把偶数位上面的数字相加

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java问题啊~如果给你一串数字,一共有12个(123456789123),我要把偶数位上面的数字相加相关的知识,希望对你有一定的参考价值。

java问题啊~如果给你一串数字,一共有12个(123456789123),我要把偶数位上面的数字相加,然后再相加奇数位上面的,应该怎么做?我用了long,但是到了后面,开头的三位数就不能用了~不知道怎么解决……
long b11 = (((code-b1)-(b2*10)-(b3*100)-(b4*1000)-(b5*10000)-(b6*100000)-(b7*1000000)-(b8*10000000)-(b9*100000000)-(b10*1000000000))%(a2))/(a1);
long b12 = (code-b1)-(b2*10)-(b3*100)-(b4*1000)-(b5*10000)-(b6*100000)-(b7*1000000)-(b8*10000000)-(b9*100000000)-(b10*1000000000)-(b11*(a1))/(a2);
最后两行我是这么写的~a1是10的10次方;a2是11次方~
我现在就是卡在这边~因为要求数字独立先出现,再计算~不知道到底出了什么问题

参考技术A 解法一: 写一个可以表示很长整数的类(困难 麻烦)
解法二:
把12个数字用 字符串 存起来,再操作字符串啊
偶数位 就是 字符串下标索引为 1 3 5 7 .。。这样的奇数 str[1] 就是第二个数字,str[3]就是第四个数字
奇数位 就是 下标为 偶数的数字 str[0] 就是第一个 str[2] 就是第三个
==============================================
取出每个字符元素后,需要转为 整型 就可以做加法了
参考技术B 我给你写了个
public class Tst1
public static void main(String[] args)
long a = 123456789123l;
long oddSum = 0;
long evenSum = 0;
for (int i = 0; i < 12; i++)
if(i % 2 == 0)
oddSum += (a % 10);
else
evenSum += (a % 10);

a = a / 10;

System.out.println(oddSum);
System.out.println(evenSum);


有不懂的call我
参考技术C 给你写了个例子,你看看。
public class Test
public static void main(String[] args) throws Exception
int sum_Oshu = 0;
int sum_Jishu = 0;
Long bb = new Long("123456789123");
String aa = String.valueOf(bb);
for (int i = 0; i < aa.length(); i++)
char ina = aa.charAt(i);
if ((i + 1) % 2 == 0)
sum_Oshu += ina - '0';
else
sum_Jishu += ina - '0';


System.out.println("sum_Oshu = " + sum_Oshu);
System.out.println("sum_Jishu = " + sum_Jishu);

追问

其实这是我的第一个JAVA作业~所以没有学到的东西很多不能用~老师要求1、using the nextLong()的方式解决2、use divide and modulo解决~3、all of your variable types should be of type long…………然后我用类似于【long b9 = (((code - b12) - (b11 * 10) - (b10 * 100))%10000) / 1000】来写~一直到倒数第四位的时候这个方法都可以,但是到了最前面的3位数就是当我用到1000000000的时候就不行了~不知道能有什么解决方法~

追答

import java.util.Scanner;
public class Test
public static void main(String[] args) throws Exception
Scanner scan = new Scanner(System.in);
long aa = scan.nextLong();
long weiShu = 1;
long sum_Oshu = 0;
long sum_Jishu = 0;
while (aa > 10)
if (weiShu % 2 == 0)
sum_Oshu += aa - aa / 10 * 10;
else
sum_Jishu += aa - aa / 10 * 10;

weiShu++;
aa = aa / 10;

if (weiShu % 2 == 0)
sum_Oshu += aa;
else
sum_Jishu += aa;

// 因为是从右往左算的位数,所以需要调整一下
// 如果正好是偶数位需要交换一下结果
if (weiShu % 2 == 0)
long temp = sum_Oshu;
sum_Oshu = sum_Jishu;
sum_Jishu = temp;

System.out.println("sum_Oshu = " + sum_Oshu);
System.out.println("sum_Jishu = " + sum_Jishu);

追问

可不可以不使用while语句?因为还木有学过……老师让我们用余数的方法解决这道题目~我们现在学的仅限于variables还有if else~其实我就是想知道如果按照我的那个方法的话有什么办法可以代替10000000000?因为我这么写的话123456789123里面只有最前面的3位无法显示出来,说是out of range了……别的都ok~

追答

如果要用你的代码,就把你代码贴上来,我帮你改改吧,
你们老师怎么那么BT,要求好多啊:-)

追问

这是上半部分~应该木有问题,我测试了一下都是好的~问题就出在最后三个上面了

应该问题就在下面b10-b12里面~后面的计算啊什么的我都会了~就是这边有问题~

追答

我也跟着学了一把了,还真是考验人啊。
弄了那么长时间,搞明白了。
a1,a2的定义写成这样吧,你要觉得不行可以自己改
long a1 = new Long("100000").longValue() * new Long("100000").longValue();
long a2 = new Long("1000000").longValue() * new Long("100000").longValue();
原理就是:即使在直接数计算的时候也要先转换为long类型来计算,要不默认是用int来计算,
这样会产生数据溢出,到数据大了得时候就不对了。

参考技术D for遍历,偶数的话求一个和,奇数的话求一个和 第5个回答  2011-09-30 怎么会呢 都是个位数相加6个数都是9 加起来不过54吗 int就够啦

codeforces137d

题意如下:给你一串字符串,然后再给你一个数字n,要你把这个字符串分成s个回文串,s为小于等于n中的任意数字,然后接下来要你求分成s个回文串的最小改变字符数!

这道题很明显是要先预处理一下,然后记录路径,最后再输出,输出方案方案的话是记录路径。

1:我感觉我还是没有想清楚就开始写了。

2:我又忘记了如果变量不开全局要初始化这件大事。

接下来是代码:

技术分享图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <string>
 7 using namespace std;
 8 int dp[700][700],g[700][700],c[700][700];
 9 char sz[700];
10 int n,len;
11 /*
12 void print(int k,int nows){
13     if(!k) return;
14     print(g[k][nows],nows-1);
15     if(g[k][nows]) printf("+");
16     for(int i=1;i<=k-g[k][nows];i++)
17         putchar(sz[min(g[k][nows]+i,k-i+1)]);
18 
19 }
20 */
21 
22 void print(int n,int r) {
23     if(!n)    return;
24     print(g[n][r],r-1);
25     if(g[n][r])    putchar(+);
26     for(int i=1;i<=n-g[n][r];i++)
27         putchar(sz[min(g[n][r]+i,n-i+1)]);
28 }
29 
30 int main(){
31     scanf("%s",sz+1);
32     len=strlen(sz+1);
33     scanf("%d",&n);
34     for(int i=1;i<=len;i++){
35         for(int j=i;j<=len;j++){
36             for(int l=i,r=j;l<r;l++,r--){
37                 if(sz[l]!=sz[r]) c[i][j]++;
38             }
39         }
40     }
41     memset(dp,0x3f,sizeof(dp));dp[0][0]=0;
42     for(int i=1;i<=len;i++){
43         for(int j=1;j<=n;j++){
44             for(int k=0;k<i;k++){
45                 if(dp[i][j]>dp[k][j-1]+c[k+1][i]){
46                     dp[i][j]=dp[k][j-1]+c[k+1][i];
47                     g[i][j]=k;
48                 }
49             }
50         }
51     }
52     int ans=0x3f,tip=1;
53     for(int i=1;i<=n;i++){
54         if(dp[len][tip]>dp[len][i]){
55             tip=i;
56         }
57     }
58     printf("%d
",dp[len][tip]);
59     print(len,tip);
60     printf("
");
61     return 0;
62 }
View Code

 我的新写的代码,带注释

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 char sz[550];
 7 int dp[550][550],g[550][550],c[550][550];
 8 int len,n,r=0;//首先如果不是一定要开局部变量,那么就开全局变量
 9 
10 void print(int a,int b){
11     if(b==0) return;//确定边界
12     print(g[a][b],b-1);
13     if(b>1) putchar(+);//要注意好输出这个的顺序
14     //printf("%d %d
",);
15     for(int i=g[a][b]+1,s=0;i<=a;i++,s++){ //我一直卡在了怎么确定起点和终点   其实不难,但是要多小心
16         printf("%c",sz[min(i,a-s)]);//取他们的最小值
17     }
18 }
19 
20 int main(){
21     scanf("%s",sz+1);
22     len=strlen(sz+1);
23     scanf("%d",&n);
24     for(int i = 1;i<=len;++i){//以后遇到这种东西首先要想到预处理好
25         for(int j=i;j<=len;++j){
26              for(int l=i,r=j;l<r;l++,r--){
27                  if(sz[l]!=sz[r]) c[i][j]++;
28              }
29         }
30     }
31     memset(dp,0x3f,sizeof(dp));dp[0][0]=0;//初始化
32     for(int i=1;i<=len;i++){
33         for(int j=1;j<=n;j++){
34             for(int k=0;k<i;k++){
35                 if(dp[i][j]>dp[k][j-1]+c[k+1][i]){
36                     dp[i][j]=dp[k][j-1]+c[k+1][i];
37                     g[i][j]=k;//记录路径
38                 }
39             }
40         }
41     }
42     for(int i=1;i<=n;i++){
43         if(dp[len][r]>dp[len][i]){
44             r=i;//不要开局部变量 ,否则会gg
45         }
46     }
47     printf("%d
",dp[len][r]);
48     //printf("%d  %d
",r,g[len][r]);
49     print(len,r);
50     printf("
");
51     return 0;
52 }
View Code

 

以上是关于java问题啊~如果给你一串数字,一共有12个(123456789123),我要把偶数位上面的数字相加的主要内容,如果未能解决你的问题,请参考以下文章

codeforces137d

HDU 4821 String (HASH)

字典树_异或和

USACO 1.2Name That Number

IT基础了解

我手机是苹果4 我的MAC地址怎么是6C∶C2∶6B... 怎么不是一串数字啊 怎么弄成有效的啊 求解释!!!!!