user-0 提问: 求问个算法问题

回复:
user: user-1
content: 仅供参考：  #include<stdio.h> //对一个三位以上的数判断是否是ADAIV数s int is_ADAIV(int n) { 	if (n > 99)  //一位、两位直接就是 	{ 		int d, n1, n2; 		n2 = n % 10; 		n1 = n / 10 % 10; 		d = n1 - n2; 		n /= 10; 		while (n >= 10) 		{ 			n2 = n1; 			n1 = n / 10 % 10; 			if (n1 - n2 != d)   //差值改变 				return 0; 			n /= 10; 		} 	} 	return 1; } //对区间[A, B]内的数进行统计 int count_of_ADAIV(int A, int B) { 	int i, count; 	count = 0; 	for (i = A; i <= B; i++) 	{ 		if (is_ADAIV(i)) 			count++; 	} 	return count; } int main(void) { 	int A, B; 	while (scanf("%d %d", &A, &B)) 	{ 		printf("%d\n", count_of_ADAIV(A, B)); 	} 	return 0; } //1 100 //99 //112 160 //4 //128 134 //0 //123 135 //2

user: user-2
content: 这题不难吧，应该就是把十亿以内的Ada数找出来而已，很简单的 啊，三楼已经接近真相了。 下面讨论三位数即100以上的正整数： 公差>=5或者<=-5的序列不存在 公差==4的序列，只有一个 159；对应的，公差==-4的序列只有951 公差==3的序列，有三个：147，258，369；公差==-3的序列也是对应的：741，852，963 公差==2的序列，有两个：13579，2468；公差==-2的序列：97531，8642，从这四个序列里取出三位数、四位数、五位数 公差==1的序列，123456789，公差==-1的序列：987654321，从这两个序列里取出三位数、四位数到九位数 以上用程序都不难算吧，下面处理特殊情况： 公差==0的序列，1-9，有几位算几位，比如111，1111，222，2222...999999这些 1-99的都是 经过上面的运算，我们就把十亿之内所有的Ada数找出来了，这些数排个序，来查吧，别说1sec，毫秒出结果

user: user-3
content: 引用 7 楼 my_bkb 的回复:[quote=引用 6 楼 jinfengyiye 的回复:] [quote=引用 5 楼 my_bkb 的回复:] [quote=引用 3 楼 jinfengyiye 的回复:]  	int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");  你这个暴力的恐怕不行 限时是1sec[/quote] 你试试看就知道了。数组100个以内完全秒杀吧。而且这个算什么暴力，很多情况都会break出来的。[/quote]  引用 6 楼 jinfengyiye 的回复:[quote=引用 5 楼 my_bkb 的回复:] [quote=引用 3 楼 jinfengyiye 的回复:]  	int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");  你这个暴力的恐怕不行 限时是1sec[/quote] 你试试看就知道了。数组100个以内完全秒杀吧。而且这个算什么暴力，很多情况都会break出来的。[/quote] 真不行 ，其中一组测试数据是1到十亿。光遍历就已经超时了[/quote] 老大你真牛十亿数据,你对数据没有概念吗? 你都遍历都超时了还处理呢? 上面不是数组100以内啊.我也回复了. 不过我确定这个算法是可以优化的.可以优化,但是十亿的数据我真一个算法处理不了. 十亿啊.十亿啊.

user: user-3
content: 引用 5 楼 my_bkb 的回复:[quote=引用 3 楼 jinfengyiye 的回复:]  	int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");  你这个暴力的恐怕不行 限时是1sec[/quote] 你试试看就知道了。数组100个以内完全秒杀吧。而且这个算什么暴力，很多情况都会break出来的。

user: user-0
content: 引用 3 楼 jinfengyiye 的回复: 	int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");  你这个暴力的恐怕不行 限时是1sec

user: user-0
content: 引用 6 楼 jinfengyiye 的回复:[quote=引用 5 楼 my_bkb 的回复:] [quote=引用 3 楼 jinfengyiye 的回复:]  	int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");  你这个暴力的恐怕不行 限时是1sec[/quote] 你试试看就知道了。数组100个以内完全秒杀吧。而且这个算什么暴力，很多情况都会break出来的。[/quote]  引用 6 楼 jinfengyiye 的回复:[quote=引用 5 楼 my_bkb 的回复:] [quote=引用 3 楼 jinfengyiye 的回复:]  	int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");  你这个暴力的恐怕不行 限时是1sec[/quote] 你试试看就知道了。数组100个以内完全秒杀吧。而且这个算什么暴力，很多情况都会break出来的。[/quote] 真不行 ，其中一组测试数据是1到十亿。光遍历就已经超时了

user: user-0
content: 内个 用c可以吗 c++我还看不懂

user: user-3
content: int min,max;  	cout<<"输入两个数"<<endl; 	cin>>min>>max;  	if(min>=max||min<0) 		cout<<"输入前数一定要比后面个数小 且不能小于0"; 	else 	{ 		int ct=0; 		int i=min; 		for(i=min;i<=max;i++){ 			int n=i; 			if(n<100) 			{ 				ct++; 				continue; 			}  			int pre=n%10; 			int d=(n/10)%10-pre; //距 			bool b=false; 			while(n%10!=n){ 				n=n/10; 				if(d!=n%10-pre){ 					b=true; 					break; 				} 				pre=n%10; 			}  			if(!b) 				ct++; 		} 		cout<<"个数"<<ct<<endl; 	}  	system("pause");

user: user-4
content: public static void main(String[] args) {  		int A=112; 		int B=10000; 		String sAdaIV="123456789"; 		int maxStep=4; 		HashSet<Integer> allAdaIvs=new HashSet<Integer>(); 		for(int len=3;len<9;len++) 		{ 			for(int step=1;step<=maxStep;step++) 			{ 				System.out.println("------------"+step+"/"+len); 				for(int idx=0;idx<9;idx++) 				{ 					String s=""; 					for(int i=0;i<len;i++) 					{ 						int charAt=i*step+idx; 						if(charAt<9) 							s+=(sAdaIV.charAt(charAt)); 					} 					if(s.length()>=3&&s.length()==len) 					{ 						int tmp=Integer.parseInt(s); 						if(tmp>=A&&tmp<B) 						{ 							allAdaIvs.add(tmp); 							System.out.println(tmp); 						} 					} 				} 			} 		} 		System.out.println("all adaiv:"+allAdaIvs.size()); 	} --- 123456789 从中找出 AdaIV

user: user-5
content: 这个用整数数组模拟就可以