Java 尝试编写返回特定数字的数学测试代码时遇到的问题

Java 尝试编写返回特定数字的数学测试代码时遇到的问题,java,loops,Java,Loops,我的问题似乎很简单,但我对编程比较陌生,我无法找出我的代码出了什么问题 我应该返回n(最大1000000)以下同时包含7和9的数字数。例如,n=10返回0,n=100返回2(来自79和97),等等 int all with 7或9(int n) { 整数计数=0; 对于(int i=0;i

我的问题似乎很简单,但我对编程比较陌生,我无法找出我的代码出了什么问题

我应该返回n(最大1000000)以下同时包含7和9的数字数。例如,n=10返回0,n=100返回2(来自79和97),等等

int all with 7或9(int n)
{
整数计数=0;
对于(int i=0;i
我意识到我本可以使用&,我也尝试过,但我的代码总是出现0,我不知道为什么。我至少用3种不同的方式实现了这一点

下面是我尝试的另一个实现:

int allWith7Or9(int n) 
{
  int count = 0;
  for(int i = 0; i < n; i++)
  {
    if((i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7
    || i%1000000==7) && (i%10==9 || i%100==9 || i%1000==9
    || i%10000==9 || i%100000==9 || i%1000000==9))
    {
      count++;
    }
  }
  return count;
}
int all with 7或9(int n)
{
整数计数=0;
对于(int i=0;i
谢谢大家!

if(i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7 || i%1000000==7)
{
  if(i%10==9 || i%100==9 || i%1000==9 || i%10000==9 || i%100000==9 || i%1000000==9)
  {
    count++;
  }
}
基本上

if(cond1)
{
  if(cond2)
  {
    count++;
  }
}
基本上是:

if(cond1 && cond2)
{
  count++;
}
因为这两个条件都必须为真才能递增
计数

这些条件同时也不成立,因为

i % 100 == 7
这可能不是你的意思。这不是检查像70,71之类的数字,而是检查当除以100时有余数7的数字,比如7,107,207。所以

i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7 || i%1000000==7
仅当
i==7
时匹配,并且

i%10==9 || i%100==9 || i%1000==9 || i%10000==9 || i%100000==9 || i%1000000==9
仅当
i==9
时匹配<代码>7!=9,因此计数器不会增加


您可以将条件重写为:

i%10==7 || (i/10)%10==7 || (i/100)%10==7 etc
但是像这样把它全部写出来是混乱和容易出错的

相反,请使用循环:

boolean found7 = false;
boolean found9 = false;
for (int ii = i; ii > 0: ii /= 10)  {
  switch (ii % 10) {
    case 7: found7 = true; break;
    case 9: found9 = true; break;
  }
}

if (found7 && found9) {
  count++;
}
这将使用两个标志指示找到的数字。检查最后一个数字是7还是9,然后除以10放弃该数字并继续下一个数字

基本上

if(cond1)
{
  if(cond2)
  {
    count++;
  }
}
基本上是:

if(cond1 && cond2)
{
  count++;
}
因为这两个条件都必须为真才能递增
计数

这些条件同时也不成立,因为

i % 100 == 7
这可能不是你的意思。这不是检查像70,71之类的数字,而是检查当除以100时有余数7的数字,比如7,107,207。所以

i%10==7 || i%100==7 || i%1000==7 || i%10000==7 || i%100000==7 || i%1000000==7
仅当
i==7
时匹配,并且

i%10==9 || i%100==9 || i%1000==9 || i%10000==9 || i%100000==9 || i%1000000==9
仅当
i==9
时匹配<代码>7!=9,因此计数器不会增加


您可以将条件重写为:

i%10==7 || (i/10)%10==7 || (i/100)%10==7 etc
但是像这样把它全部写出来是混乱和容易出错的

相反,请使用循环:

boolean found7 = false;
boolean found9 = false;
for (int ii = i; ii > 0: ii /= 10)  {
  switch (ii % 10) {
    case 7: found7 = true; break;
    case 9: found9 = true; break;
  }
}

if (found7 && found9) {
  count++;
}

这将使用两个标志指示找到的数字。检查最后一位数字是否为7或9,然后除以10放弃该数字并继续下一位。

好,第一个条件错误。例如79。 7的条件不起作用79%10=9,79%100=79。没有检测到7个。 它应该类似于遍历数字的所有数字。所以检查一个数字可以是这样的

boolean have7and9(int a) {
  boolean seven = false, nine = false;  
  while(a > 0) {
    if (a%10 == 7) seven = true;
    if (a%10 == 9) nine = true;
    a /= 10;
  }
  return seven && nine;
}

好的,第一个条件是错误的。例如79。 7的条件不起作用79%10=9,79%100=79。没有检测到7个。 它应该类似于遍历数字的所有数字。所以检查一个数字可以是这样的

boolean have7and9(int a) {
  boolean seven = false, nine = false;  
  while(a > 0) {
    if (a%10 == 7) seven = true;
    if (a%10 == 9) nine = true;
    a /= 10;
  }
  return seven && nine;
}

根本问题是你的条件不对

例如,
i%100==7
不测试
i
的“十”位是否为
7
。它实际上测试最后两位数字是否为
07
。算算

要在单个表达式中测试“十”位数是
7
,需要使用

(i / 10) % 10 == 7

(你应该能够从上面找到一个正确的解决方案。你至少可以采取两种不同的方法。)

根本问题是你的条件是错误的

例如,
i%100==7
不测试
i
的“十”位是否为
7
。它实际上测试最后两位数字是否为
07
。算算

要在单个表达式中测试“十”位数是
7
,需要使用

(i / 10) % 10 == 7

(你应该能够从上面找到一个正确的解决方案。你至少可以采取两种不同的方法。)

if(cond1){if(cond2){…}
基本上是
if(cond1&&cond2){…}
-如果两个条件都不能为真,那总是假的。但这两个条件都必须为真!拿100块。循环使用这两个条件表示前面的任何数字必须同时有7和9,对吗?我们有79和97。但是,它返回0,而不是2。为什么不使用
String current=String.valueOf(i)和条件
if(current.contains(“7”)&¤t.contains(“9”)
来简化逻辑并使其可读?我不允许这样做。
if(cond1){if(cond2){…}
基本上是
if(cond1&&cond2){…}
-如果这两个条件都不能成立,这总是错误的。但这两个条件都必须是正确的!拿100块。循环使用这两个条件表示前面的任何数字必须同时有7和9,对吗?我们有79和97。但是,它返回0,而不是2。为什么不使用
String current=String.valueOf(i)和条件
if(current.contains(“7”)和¤t.contains(“9”)
以简化逻辑并使其可读?嗯,我不允许。一些事情。第三行中的一,你是指int ii=1;?其次,我仍然在运行所有0。我相信你的代码正在检查同一个数字是否同时是7和9,嗯。第一:否。第二:我不知道“我仍然在运行所有0”是什么意思。你相信错了。啊,我明白我的错误了。非常感谢。有几件事。第三行中的一,你是指int ii=1;?第二,我仍然在跑步