-2

该练习要求找出从 1 到 500 的数字中的哪一个,即数字特定数字的总和,提高到三次方等于该特定数字。

例如 1^3=1 和 371 使得 3^3+7^3+1^3 = 371

我是如何解决这个问题的:

我在想如果我可以拥有一个包含 500 个插槽的字符串数组,每个插槽包含一个字符串转换后的数字,那么我可以对每个插槽的字符串进行数学运算。如果他们符合我将应用的标准,那么将打印该插槽。

我尝试了函数 sprintf 但没有多大成功。在一个循环中,它只是初始化字符串(或者它是数组?3 小时后我很困惑)[0] 插槽,而所有其他插槽保持不变。

我不想让你解决这个练习,而不是用我的逻辑来指导我。如果您愿意,请让我添加我所做的代码。

4

2 回答 2

4

始终从明确定义您的算法开始,这样您就知道自己在做什么。将其拆分为简单的步骤。像这样的东西:

For each integer i in the interval 1 to 500:
  Check if the condition holds for this i
  If it holds:
    Print i
  else:
    Do nothing

现在您需要定义“检查条件是否适用于此 i ”。我会使用一些模数和除法运算来提取数字,但我把细节留给你。

请注意,我没有谈论 C 或任何其他编程语言。只有当你知道你的算法时,你才应该开始考虑实现。

(实际上可能存在与上面给出的算法略有不同的算法,其中每个嵌套在彼此内部的数字都有一个循环。该解决方案可能对您来说是可以接受的,但它不会那么通用)

于 2013-03-05T17:48:44.117 回答
2
for(i=1;i<=500;i++)
{
   //loop for checking each number i
   int sum=0; // to store the sum of cube of digits
   int n=i; //copy of i
   //The below while loops does the task. It extracts a digit from the number and adds its cube to the sum
   // last digit from the number can be seen by taking its remainder by 10 . For eg 35%10=5
   //once we have used this digit make the number shorter by dividing by 10. For eg 35/10 becomes 3 (because of integer divisions)
   while(n>0)
   {
       int rem=n%10; //extract the last digit
       sum+=cube(rem); //cube function raises a number to its cube
       n/=10;  //remove the digit we had extracted earlier from the number
    }
    if(sum==i) //we got the number we wanted
        printf("%d\n",i);

}
于 2013-03-05T17:50:21.607 回答