You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言带边界的阿姆斯特朗数函数开发求助及代码优化

Got it, let's fix this up to meet your requirements for a flexible Armstrong number function in R! Your current code only works for 3-digit numbers and handles single inputs, so we'll build a robust, reusable solution that supports both single-number checks and range queries.

Armstrong Number Function with Range Support in R

First, let's break down the limitations of your existing code: it hardcodes digit ^3 (so only works for 3-digit numbers) and doesn't wrap logic into a reusable function. Here's a polished solution that fixes these gaps:

Step 1: Helper Function to Check a Single Armstrong Number

This function works for any positive integer, regardless of digit count:

is_armstrong <- function(num) {
  # Validate input is a positive integer
  if (!is.integer(num) || num < 1) {
    stop("Please provide a positive integer.")
  }
  
  # Split number into individual digits
  digits <- as.integer(strsplit(as.character(num), "")[[1]])
  digit_count <- length(digits)
  
  # Calculate sum of digits raised to the power of digit count
  sum_of_powers <- sum(digits ^ digit_count)
  
  # Return TRUE if it's an Armstrong number, FALSE otherwise
  sum_of_powers == num
}

Step 2: Function to Find Armstrong Numbers in a Range

Use the helper function to collect all Armstrong numbers between two bounds:

find_armstrong_in_range <- function(lower, upper) {
  # Validate range inputs
  if (!is.integer(lower) || !is.integer(upper) || lower >= upper || lower < 1) {
    stop("Please enter valid positive integers where lower < upper.")
  }
  
  # Iterate through the range and collect matches
  armstrong_nums <- c()
  for (num in lower:upper) {
    if (is_armstrong(num)) {
      armstrong_nums <- c(armstrong_nums, num)
    }
  }
  
  # Handle empty results and return output
  if (length(armstrong_nums) == 0) {
    message("No Armstrong numbers found in this range.")
    return(integer(0))
  } else {
    return(armstrong_nums)
  }
}

How to Use These Functions

Check a Single Number

# Test known Armstrong numbers
is_armstrong(153L)  # Returns TRUE
is_armstrong(9474L) # Returns TRUE
is_armstrong(123L)  # Returns FALSE

Find Armstrong Numbers in a Range

# Get all Armstrong numbers between 1 and 10000
find_armstrong_in_range(1L, 10000L)
# Output: [1]    1    2    3    4    5    6    7    8    9  153  370  371  407 9474

Interactive Prompt (Like Your Original Code)

Wrap the helper function to keep the interactive input flow:

num <- as.integer(readline(prompt = "Enter a number: "))
if (is_armstrong(num)) {
  cat(paste(num, "is an Armstrong number.\n"))
} else {
  cat(paste(num, "is not an Armstrong number.\n"))
}

Key Improvements Over Your Original Code

  • Digit-agnostic: No longer hardcoded to ^3—it uses the actual number of digits in the input.
  • Reusable functions: Logic is wrapped into callable functions for repeated use.
  • Range support: Find all Armstrong numbers in a bound instead of checking one at a time.
  • Input validation: Clear error messages for invalid inputs (non-integers, negative numbers, broken ranges).

内容的提问来源于stack exchange,提问作者Reubz101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:40:06