c语言打印和统计所有不重复的8位数
2016-11-16 16:06
239 查看
思路1:遍历所有8位数,判断是否每一位都不重复。判断方法是用一个数组记录每一位,然后数组内的元素两两比较,看是否各不相同。
思路2:采用8级嵌套循环,每级循环遍历剔除上级循环的数字后剩下的数。这是一种比较笨的土方法,而且不易扩展。但这个方法能够成功也是编程实力的一种体现。
#include<stdio.h> #define N 8 //改变N的值可以输出2~10的不重复数 /*onlyone(n) judge that if n is a number without repetition*/ int onlyone(long n){ int a ,i,j; for(i=0;i<N;i++){ a[i]=n%10; n/=10;} for(i=0;i<N-1;i++) for(j=i+1;j<N;j++) if(a[i]==a[j])return 0; return 1; } int main(){ long i,t1=1,t2; long c1=0,c2=9; for(i=1;i<N;i++)c2*=10-i; //c2=C(9,1)*A(9,N-1) for(i=1;i<N;i++)t1*=10; //t1=10^(N-1) t2=t1*10; //t2=10^N for(i=t1;i<t2;i++) if(onlyone(i)){c1++;printf("%ld\n",i);} printf("count=%ld,c2=C(9,1)*A(9,N-1)=%ld,count-c2=%ld\n",c1,c2,c1-c2); return 0; }
思路2:采用8级嵌套循环,每级循环遍历剔除上级循环的数字后剩下的数。这是一种比较笨的土方法,而且不易扩展。但这个方法能够成功也是编程实力的一种体现。
#include<stdio.h> int main(void){ int i1,i2,i3,i4,i5,i6,i7,i8,j; int a2[9],a3[8],a4[7],a5[6],a6[5],a7[4],a8[3]; long c1=0,c2=9*9*8*7*6*5*4*3; //统计共有多少种组合 //共8级嵌套循环,每级代表一位,每位用一个数组储存可供选择的数字 for(i1=1;i1<=9;i1++){ for(j=0;j<9;j++) a2[j]=j>=i1?j+1:j; for(i2=0;i2<9;i2++){ for(j=0;j<8;j++) a3[j]=j>=i2?a2[j+1]:a2[j]; for(i3=0;i3<8;i3++){ for(j=0;j<7;j++) a4[j]=j>=i3?a3[j+1]:a3[j]; for(i4=0;i4<7;i4++){ for(j=0;j<6;j++) a5[j]=j>=i4?a4[j+1]:a4[j]; for(i5=0;i5<6;i5++){ for(j=0;j<5;j++) a6[j]=j>=i5?a5[j+1]:a5[j]; for(i6=0;i6<5;i6++){ for(j=0;j<4;j++) a7[j]=j>=i6?a6[j+1]:a6[j]; for(i7=0;i7<4;i7++){ for(j=0;j<3;j++) a8[j]=j>=i7?a7[j+1]:a7[j]; for(i8=0;i8<3;i8++){ printf("%d%d%d%d%d%d%d%d\n",i1,a2[i2],a3[i3],a4[i4],a5[i5],a6[i6],a7[i7],a8[i8]); c1++;}}}}}}}} printf("total=%ld,C(1,9)*A(7,9)=%ld,total-C(1,9)*A(7,9)=%ld\n",c1,c2,c1-c2); //验证组合种数与循环次数是否相同 */ return 0; }
相关文章推荐
- 给一个字符串(包含重复字符),打印它的所有可能的组合。
- 打印树中关键字k1 - k2之间(含k1,k2)的所有元素C语言
- 2. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如:153是一水仙花数,因为153=1^3+5^3+3^3.
- PAT 1021 个位数统计 C语言
- 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
- C# 排列出所有不相同且无重复数字的N位数
- c语言 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
- c程序:打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身
- C语言打印统计单词长度的直方图<The C Programming Language>课后习题
- 打印出大小为n的数组(可能有重复元素)里所有可能的组合
- 面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序
- c语言数组应用--统计随机数并打印直方图
- 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方
- c语言统计从文件读取的文章中所有单词的出现次数
- 【程序13】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
- 数理逻辑,打印8个命题的所有组合(用c语言实现)
- 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
- 利用1、2、2、3、4这5个数字,打印出所有不同的排列,不能有重复
- 打印出所有每一位都与其他位不重复的自然数
- 【源码】用1,2,2,3,4,5这六个数字,写一个函数,打印出所有不同的排序,要求:4不能放在第三位,3与5不能相连(C语言实现)