zoukankan      html  css  js  c++  java
  • 21位花朵数

    一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
    例如:
    当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
    当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
    当N=5时,92727满足条件。
    实际上,对N的每个取值,可能有多个数字满足条件。

    程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
    如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。

    128468643043731391252
    449177399146038697307

    转自: https://zhidao.baidu.com/question/401843403.html

    #include <stdio.h>
    #define N 21
    #define base 10000000
    int powerN[10][3];
    int ans = 0;
    int Armstrong_number[90][3];
    int cnt[10];
    void calc_powerN()
    {
    	int i, j, k;
    	for (i = 0; i < 10; i++)
    	{
    		powerN[i][2] = powerN[i][1] = 0;
    		powerN[i][0] = 1;
    		for (j = 0; j < N; j++)
    			for (k = 2; k >= 0; k--)
    			{
    				powerN[i][k] *= i;
    				if (powerN[i][k] > base)
    				{
    					powerN[i][k + 1] += powerN[i][k] / base;
    					powerN[i][k] %= base;
    				}
    			}
    	}
    }
    int check()
    {
    	int i, j, sum[3] = { 0, 0, 0 }, c[10];
    	for (i = 0; i < 10; ++i) c[i] = cnt[i];
    	for (i = 0; i < 10; i++)
    		for (j = 0; j < 3; j++)
    			sum[j] += powerN[i][j] * cnt[i];
    	for (j = 0; j < 2; j++)
    	{
    		sum[j + 1] += sum[j] / base;
    		sum[j] %= base;
    	}
    	if (sum[2] < 1000000) return 1;
    	for (j = 0; j < 3; j++)
    		Armstrong_number[ans][j] = sum[j];
    	for (i = 0; i < 7; i++)
    		for (j = 0; j < 3; j++)
    		{
    			if (!c[sum[j] % 10]) return 0;
    			c[sum[j] % 10]--;
    			sum[j] /= 10;
    		}
    	ans++;
    	return 0;
    }
    int dfs(int deep, int rest)
    {
    	if (deep == 0)
    	{
    		cnt[deep] = rest;
    		if (check()) return 1;
    		return 0;
    	}
    	int i;
    	for (i = rest; i >= 0; i--)
    	{
    		cnt[deep] = i;
    		if (dfs(deep - 1, rest - i)) return 1;
    	}
    	return 0;
    }
    int Compare(int i, int j)
    {
    	int k;
    	for (k = 2; k >= 0; k--)
    	{
    		if (Armstrong_number[i][k] < Armstrong_number[j][k]) return -1;
    		if (Armstrong_number[i][k] > Armstrong_number[j][k]) return 1;
    	}
    	return 0;
    }
    void Swap(int i, int j)
    {
    	int k;
    	for (k = 0; k < 3; k++)
    	{
    		int tmp;
    		tmp = Armstrong_number[i][k];
    		Armstrong_number[i][k] = Armstrong_number[j][k];
    		Armstrong_number[j][k] = tmp;
    	}
    }
    void Sort()
    {
    	int i, j;
    	for (i = 0; i < ans; i++)
    		for (j = i + 1; j < ans; j++)
    			if (Compare(i, j) > 0) Swap(i, j);
    }
    void print()
    {
    	int i;
    	for (i = 0; i < ans; i++)
    		printf("%d%07d%07d
    ", Armstrong_number[i][2], Armstrong_number[i][1], Armstrong_number[i][0]);
    }
    int main()
    {
    	calc_powerN();
    	dfs(9, N);
    	Sort();
    	print();
    	return 0;
    }


     

  • 相关阅读:
    86. Partition List
    328. Odd Even Linked List
    19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)
    24. Swap Nodes in Pairs
    2. Add Two Numbers(2个链表相加)
    92. Reverse Linked List II(链表部分反转)
    109. Convert Sorted List to Binary Search Tree
    138. Copy List with Random Pointer
    为Unity的新版ugui的Prefab生成预览图
    ArcEngine生成矩形缓冲区
  • 原文地址:https://www.cnblogs.com/F-itachi/p/9974325.html
Copyright © 2011-2022 走看看