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次方~
我现在就是卡在这边~因为要求数字独立先出现,再计算~不知道到底出了什么问题
解法二:
把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来计算,
这样会产生数据溢出,到数据大了得时候就不对了。
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 }
我的新写的代码,带注释
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 }
以上是关于java问题啊~如果给你一串数字,一共有12个(123456789123),我要把偶数位上面的数字相加的主要内容,如果未能解决你的问题,请参考以下文章