期待c或c++高手解决
一个2*n位的正整数(n<10),具有如下性质:1.含有两个数字"1",两个数字"2",……两个数字"n"
2.两个"1"之间有1个数字,两个"2"之间有两个数字,...,两个"n之间有n个数字
要求:
1.N由键盘输入
2.输出所有符合上述性质的正整数及总个数.
补充:这不是老师布置的题,使我自己买的书上的题
补充:这不是老师布置的题,使我自己买的书上的题
答案:小弟花了一个通宵才编出来的,不容易啊!(用C++编的)用C编也大概差不多。*/
/*本程序有很多注释,可让初学者很容易的读懂!*/
#include <iostream>
#include <string.h>
#include <stdlib.h>
using std::cout;
using std::cin;
using std::endl;
/*题目*
一个2*n位的正整数(n<10),具有如下性质:
1.含有两个数字"1",两个数字"2",……两个数字"n"
2.两个"1"之间有1个数字,两个"2"之间有两个数字,...,两个"n之间有n个数字
要求:
1.N由键盘输入
2.输出所有符合上述性质的正整数及总个数.
例如:
输入:
4
输出:
41312432
23421314
2
*/
/*
解题思路:使用递归法,并将问题转化为填充数字串
*/
int a[20]={0};/*此定义了个外部数组a(作用域为整个源文件),用数组a存结果 */
int used[11]={0};/*此定义了个外部数组(作用域为整个源文件)标记整数是否以用,a[i]为0时说明整数i未用,否则说明已用*/
int total=0;/*定义全局变量;符合条件的整数个数 */
void myfill(int i, int less, int m);/*声明了一个函数,当前要填充的位置,less,还剩less个整数待填充,m,总共要填充的整数个数*/
int main(int argc, char *argv[]) /*参数是用来通过命令行上的字符串给主函数传送参数 */
{ /*也就是说弹出命令行*/
int n;
cout<<"please input n\n";
cin>>n;
memset(a,0,20*sizeof(int)); /*此库函数的调用可要可不要 ,为了炫耀,在此添一笔,哈哈!*/
memset(used,0,10*sizeof(int));/*同上 */
myfill(0,n,n); /*调用用户自定义的函数 */
cout<<total<<endl;
system("pause");
return 0;
}
void myfill(int i, int less, int m)/*回溯法填数字 */
{
int j;
int k;
if(less==1)/*如果只剩一个待填充的整数 */
{
for(j=1;used[j];j++);/*找出该整数 */
if((i+j+1<2*m) && !a[i+j+1])/*i+j+1位是否可填 */
{
total++;
used[j]=1;
a[i]=j;
a[i+j+1]=j;
for(k=0;k<2*m;k++) cout<<a[k];
cout<<endl;
used[j]=0;
a[i]=0;
a[i+j+1]=0;
}
return;
}
for(j=1;j<=m;j++)/*尝试在i处填整数j */
{
if(!used[j])
{
if((i+j+1<2*m) && !a[i+j+1])
{
used[j]=1;
a[i]=j;
a[i+j+1]=j;
/*加上标记
从题目要求知,如果第i位的整数是j,则i+j+1处的整数也应是j
且,所求正整数只有2*n位
*/
for(k=i+1;k<2*m && a[k];k++);/*找出下一个待填充的位置*/
if(k==2*m) continue;
else myfill(k,less-1,m);
used[j]=0;
a[i]=0;
a[i+j+1]=0;
//清除标记
}
}
}
}
/*在DEV-CPP和G++上调试成功!(有兴趣的朋友可算算本程序的时间复杂度。)*/我很想帮你,,问题看不懂哦,,
2*N
N如果是 2
那么这个数应该是4 ?
4 含有 两个2 ?? 越看越没看明白~!这问题是不是有问题哦?
假如 n = 1;
就两个数字,1,1
中间怎么还会有第三个数字呢?
假如 n = 2;
两个2中间要有两个数字,即1,1
那1,1中间就肯定没得数字
楼主啊,确定问题本身没错?