#include<stdio.h>int s= 0;void input(int t);int b[20],a[200],n,flag;void main(){ int i,j,m,number,min; printf("请输入一个数:"); scanf("%d",&number); flag=0; if(number<0) { flag=1; number=-number; } for(n=0;number!=0 && n<20;n++) { a[n]=number%10; number/=10; } for(i=0;i<n-1;i++) { min=a; for(j=i+1;j<n;j++) { if(a>a[j]) { m=a[j];a[j]=a;a=m; } } } for(i=0;i<20;i++) b=-1; if(n) input(0); printf ("%d",s); return;}void input(int t){ int i,j; for(i=0;i<n;i++) { if(b==-1) { b=a[t]; if(t>=n-1) { if(flag) printf("\\n"); for(j=0;j<n;j++) printf("%d",b[j]);printf("\\n"); s=s+1; } elseinput(t+1); b=-1; } } }它的功能是实现一组数的排列,可是小弟看不懂input()函数是怎么回事,特请教各位。告诉我它的思想或算法,将不胜感激!!!
#include<stdio.h>int s= 0;void input(int t);int b[20],a[200],n,flag;void main(){ int i,j,m,number,min; printf("请输入一个数:"); scanf("%d",&number); flag=0; //取绝对值,并将正负保留在flag中 if(number<0) { flag=1; number=-number; } //将int分割为字符串,每个字符保存一位数值 for(n=0;number!=0 && n<20;n++) { a[n]=number%10; number/=10; } //对字符串中的数值,进行冒泡排序 for(i=0;i<n-1;i++) { min=a; for(j=i+1;j<n;j++) { if(a>a[j]) { m=a[j];a[j]=a;a=m; } } } //初始化b for(i=0;i<20;i++) b=-1; //如果输入的数不等于0,调用input //n代表输入数的位数 if(n) input(0); printf ("%d",s); return;}//t代表当前处理哪一位,从0开始,由input(t+1)递归,最终等于n-1//t的范围0~n-1void input(int t){ int i,j; for(i=0;i<n;i++) { if(b==-1) { //将a的第t位数据拷贝到b的第i位 //由于都是从0开始拷贝,实际上,就是复制a的数据到b b=a[t]; if(t>=n-1) { //当t>=n-1时,代表所有数据拷贝完成 //根据输入数的正负,输出回车 if(flag) printf("\\n"); //打印b内的数据 for(j=0;j<n;j++) printf("%d ",b[j]);printf("\\n"); //s从 0 变为 0+1 s=s+1; } else input(t+1); //递归结束时,逐步将b清空为-1 b=-1; } } }
提问者对答案的评价: |