水仙花数xdoj

11 篇文章 0 订阅
这是一个编程问题,要求编写一个函数`intfunction(inta,intb)`来计算区间[a,b]内(包括边界)的水仙花数个数。水仙花数是指一个n位数,其每位数字的n次幂之和等于它本身。代码中提供了函数的实现,首先判断a和b的大小并调整顺序,然后对每个数进行位数判断和幂次和的计算,如果和等于原数,则计数加一。
摘要由CSDN通过智能技术生成

题目:    
水仙花数

类别
流程控制

时间限制    
2S

内存限制    
10000Kb

问题描述    
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。
(例如:1^3 + 5^3 + 3^3 = 153)。
定义一个函数int function(int a, int b),计算区间[a,b]或区间[b,a]上水仙花数的个数。

输入说明    
输入由两个整数a和b构成,a和b之间用空格分隔。0<a,b<10000

输出说明    
输出区间[a,b]或区间[b,a]上水仙花数的个数。

输入样例    
3  1000  

输出样例    
4

提示    
a,b的位数n可能小于3

全码://

#include <stdio.h>
int function(int a, int b);   

int main() {
    int a, b, c;
    scanf("%d %d", &a, &b);
    c = function(a, b);
    printf("%d", c);

    return 0;
}

int function(int a, int b) {
    int n = 0, i, j, k, ws = 1, dj = 0;
    int sz[200] = { 0 }, jg[200] = { 1 }, h = 0;

    if (a < b) {
        j = a;
        a = b;
        b = j;
    }

    if (a < 100 && b < 100) {
        return 0;
    }

    else if (a > 100) {
        if (b < 100) {
            b = 100;
        }


        for (i = b; i <= a; i++) {//按a>b做的
            dj = i;//nok
            for (j = 10; dj >= 10; ws++) {//求位数
                dj = dj / j;
            }
            dj = i;
            for (j = 1; j < ws + 1; j++) {//求每一位上的数
                sz[j] = dj % 10;
                dj = dj / 10;
            }
            for (j = 1; j < ws + 1; j++) {//求各数幂次结果
                for (k = 1; k < ws + 1; k++) {
                    jg[j] = jg[j] * sz[j];
                }
            }
            for (j = 1; j < ws + 1; j++) {//求和
                h = jg[j] + h;
            }
            if (h == i) {//判断
                n++;

            }
            //还原
            for (j = 0; j < ws + 1; j++) {//遍历还原
                sz[j] = 0;
            }
            for (j = 0; j < ws + 1; j++) {//同上
                jg[j] = 1;
            }
            ws = 1;
            h = 0;

        }
    }
    return n;
}

//
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值