最高位对1整除,前2位对2整除,以此类推

1、实验名称:回溯算法的应用

2、实验目的:掌握回溯算法的原理和设计方法

 

3、实验内容:构造一个尽可能大的数,使其从高到低前一位能对1整除,前2位能对2整除,……,前n位能对n整除(假设n不大于15)。记高精度数据为a1 a2……an,题目很明确有两个要求:

    1)a1整除1且

    (a1*10+a2)整除2且……

    (a1*10n-1+a210n-2+……+an) 整除n;

    2)求最大的这样的数。

 

#include<iostream>
using namespace std;

void fun(int n){
	int min_num=1;
	int max_num=0;
	int temp_max_num=9;
	for(int i=0;i<n-1;i++){
		max_num=(max_num+temp_max_num)*10;
		min_num*=10;
	}
	
	max_num+=temp_max_num;
	//cout<<max_num<<endl<<min_num<<endl;
	int *wei=new int[n];
	for(int loop=max_num;loop>min_num;loop--){
		int temp_loop=loop;
		for(int j=n-1;j>-1;j--){
			wei[j]=temp_loop%10;
			temp_loop/=10;
		}
		int sum=wei[0];
		int count_num=1;
		for(int k=0;k<n-1;k++){
			sum=sum*10+wei[k+1];
			if(sum%(k+2)==0){
				count_num++;
			}
		}
		if(count_num==n){
			for(int m=0;m<n;m++){
				cout<<wei[m];
			}
			cout<<endl;
			return;
		}
	}
}

int main(){
	fun(9);
	return 0;
}

 

由于C语言中int占4字节,能表示-2^31~2^31-1即-2147483648~2147483647,十位数,但对于这题封顶应该为9位


版权声明:本文为qq_39993896原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。