C语言“唯一的解“问题

本文探讨如何用C语言解决一个数学问题:用1到9的全排列组成9位数,满足每一位数都能被相应位数的数整除。通过分析数字特点,优化遍历策略,减少计算次数,从最初的遍历9亿次改进到计算576个数。作者分享了初代代码并指出仍有优化空间。
摘要由CSDN通过智能技术生成

问题

用1到9组成一个9位数,使得这个数的第一位能被1整除,前两位组成的两位数能被2整除,前三位组成的三位数能被3整除,以此类推,一直到整个九位数能被9整除。

分析

先看看计算机最擅长的事——遍历。假如让i从1e8到1e9遍历9亿次,每一次进行一次上述判断…好吧,我等了十几分钟,没有结果。这样做效率太低了。
再看看题干,由1~9组成的九位数,可以用1 ~9的全排列计算。这样只需算9!=362880个数。但是计算次数还是很多,需要继续优化。
需要对条件进行进一步分析。
进一步,需要知道在题设条件下1~9整除的数字的特点:
被2整除:偶数。
被3整除:前三位数之和是3的倍数。
被4整除:末尾两位数能被4整除。
被5整除:5和0,在题设条件下,只有5。
被6整除:同时被2和3整除。
被7整除:判断方法有好多种,处理不方便。
被8整除:最后三位数是8的倍数。
被9整除:各个位上数字之和为9的倍数,在题目条件下,这一条恒成立。
发现第五位是最好处理的。之后偶数位上至少满足的条件得是个偶数。这样可以对奇数位和偶数位分别处理,只需要计算4!*4!=576个数。同时不需要进行前五位数被5整除这一个判断。按照这种思路写出了初代代码如下:

初代:

由于用字符更好操作,所以使用字符进行全排。
在一些地方,直接用公式计算了,没有做优化。

代码如下:

#include<stdio.h>
#include<string.h>

int num,num_odd[24],num_even[24],n;

void swap(char *str1,char *str2)
{
   
    char temp;
    temp=*str1;
    *str1=*str2;
    *str2=temp;
}
//全排列函数
void Allarrange(char *str,int i,int flag)
{
   
    if(i=&
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值