【问题标题】:generating same number with the given length生成具有给定长度的相同数字
【发布时间】:2018-08-07 23:37:18
【问题描述】:

我有这个数学作业,我应该把它写成代码。 我已经尝试了所有我想到的但我找不到解决方案。 所有这些都应该在不使用 php 函数的情况下完成,只需要数学运算。 您可以使用 while、for 等...

所以我有号码,例如9 现在我应该创建长度为9 的数字,即999999999

例如,如果我有数字3,那么结果应该是333

有什么想法吗?

$gen = -1;
while($highest > 0) {
    $gen = $highest + ($highest * 10);
    $highest = $highest - 1;
}

echo $gen;

【问题讨论】:

  • 到目前为止您尝试过什么?做一些努力并显示一些代码。这个平台不是免费的源代码提供者。你的任务只有两行代码。做一些努力,否则你不会成为软件开发人员
  • 是的,我有!我使用了一些代码。我得到的结果是 99、33,但这不是应该的。
  • 这应该是数学生成的数字还是只是数字?最明显的是strpad,但我猜你不想要那个?如果输入为 0 会发生什么?
  • 如果你能接受“字符串数学”,这可能是最短最快的代码; 3v4l.org/m3SEQ
  • @Andreas 我的第一个想法是str_repeat()echo (int)str_repeat($n,$n);

标签: php math integer repeat


【解决方案1】:

这是一个不构建字符串的方法;它使用纯数学。 (会有很多很多方法来完成这项任务)

$x=9;
$result=0;
for($i=$x; $i; --$i){         // this looping expression can be structured however you wish potato-potatoe
   $result+=$x*(10**($i-1));  // x times (10 to the power of (i-1))
}
echo $result;
// 999999999

*注意:** 的行为类似于 pow(),如果您想查找的话。


后期编辑:这是一个聪明的、无环的小方法(安静地自豪)。我只打电话给range()foreach()进行演示;它不是我方法的一个组成部分。

演示:https://3v4l.org/GIjfG

foreach(range(0,9) as $n){
    // echo "$n -> ",(integer)(1/9*$n*(10**$n)-($n/10)),"\n";
    // echo "$n -> ",(1/9*$n*(10**$n)-(1/9*$n)),"\n";
    // echo "$n -> ",(int)(1/9*10**$n)*$n,"\n";
    // echo "$n -> ",(int)(10**$n/9)*$n,"\n";
    echo "$n -> ",(10**$n-1)/9*$n,"\n";
}

输出:

0 -> 0
1 -> 1
2 -> 22
3 -> 333
4 -> 4444
5 -> 55555
6 -> 666666
7 -> 7777777
8 -> 88888888
9 -> 999999999

1/9 是这个方法的主角,因为它会生成.111111111(重复)。从这个浮点数,我使用10**$n 将足够的1s“移位”到小数点的左侧,然后将此浮点数乘以$n,然后必须将浮点数转换为整数完成。

根据@axiac 的评论,新英雄是10**$n-1,它会生成一系列所需长度的9(无浮点数)。接下来将 9 除以 9 以生成一系列 1,这将成为完美的乘数。最后,将一系列的 1 和输入的数字相乘,得到所需的输出。

【讨论】:

  • 是的,我同意这一点。这是数学。不是字符串构建。
  • @axiac 如果版本不适用于您的环境,欢迎您升级。看,我很快就用手机模拟了它。我认为它提供了正确的结果。当然,这不值得投反对票。
  • 在我看来,如果 OP 没有具体写出他/她使用的版本,那么转换函数就是 OP 的问题。如果 OP 说“我使用 PHP 4”,那么写一个适合 PHP 7 的答案会很糟糕。简而言之,我认为 PHP 版本不正确。评论,当然。但是downvote有点过分了。
  • 是的,就是这样!谢谢@mickmackusa
  • (10**$n-1)/9*$n 并且您不再需要转换为 int
【解决方案2】:

如果intval() 被接受:

$result = '';
$input = 9;
for($i=0; $i < $input; $i++){
    $result .= $input;
}
$result = intval($result);

其他:

$result = 0;
$input = 9;
for($i=0; $i < $input; $i++){
    $factor = 1;
    for($j = 0; $j < $i; $j++){
        $factor *= 10;
    }
    $result += $input * $factor;
}

=> 9 + 90 + 900 + 9000 + 90000...

【讨论】:

  • 为什么需要两个循环?
  • 可以像 mickmackusa 一样被 ** / pow() 函数替换
  • 您也可以通过将(int)(integer) 放在循环之后的$result 前面来将字符串转换为整数。
【解决方案3】:

你需要完成两个操作:

  1. 给定一个数字$number,将数字$n附加到它;
  2. 重复操作 #1 若干次($n 次)。

操作 #1 很简单:

$number = $number * 10 + $n;

操作 #2 更简单:

for ($i = 0; $i < $n; $i ++)

您还需要什么?
用于存储计算数字的变量的初始化:

$number = 0;

把它们按顺序排列,你会得到:

// The input digit
// It gives the length of the computed number
// and also its digits
$n = 8;

// The number we compute
$number = 0;

// Put the digit $n at the end of $number, $n times
for ($i = 0; $i < $n; $i ++) {
    $number = $number * 10 + $n;
}

// That's all

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2020-04-05
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多